我需要测试Windows模拟器是否正确识别并处理太长(超过15个字节长)的指令。我用NASM编译代码。 我知道指定一个太长的指令的唯一方法是在指令中添加前缀。让我们说我做了以下事情:
rep O32 rep O32 rep O32 rep O32 rep O32 mov eax, [fs:0]
在这种情况下,我应该得到一个16字节长的指令,因为mov eax, [fs:0]
是一个6字节长的指令,加上10 O32
和rep
前缀等于16字节。
至少理论是......但是当我用NASM编译它并反汇编得到的二进制文件时,我发现从那里获取了不必要的前缀:只剩下1个rep
前缀显然是fs
段前缀。因此,指令的总长度减少到只有7个字节。我想这是应该如何工作的,但有没有办法使它的指令长度实际上超出界限?
答案 0 :(得分:0)
您声明mov eax, [fs:0]
是一个6字节长的指令。这意味着您使用的是16位代码。 (32位代码需要7个字节)
因此mov ax,1
将使用3个字节。您已经添加了12个操作数大小的前缀。
这总计达到15,这仍然是完全合法的。因此,您还没有测试过“Windows模拟器”。
如果提供的解决方案是32位代码,那么总数将是16个字节。
只是好奇:模拟器是否在抱怨?