Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 是否可以在NASM中为汇编指令保留冗余前缀?_Assembly_X86_Nasm - Fatal编程技术网

Assembly 是否可以在NASM中为汇编指令保留冗余前缀?

Assembly 是否可以在NASM中为汇编指令保留冗余前缀?,assembly,x86,nasm,Assembly,X86,Nasm,我需要测试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编译它并反汇编生成的二进制文件时,我发现

我需要测试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字节。我想这就是它应该如何工作的,但是有没有办法使它的指令长度实际上超出界限呢?

您声明mov eax,[fs:0]是一条6字节长的指令。这意味着您使用的是16位代码。32位代码将占用7个字节

因此,mov ax,1将使用3个字节。您已经添加了12个操作数大小前缀。 这一共有15个,这仍然是完全合法的。因此,您尚未测试“windows emulator”

如果提供的解决方案是32位代码,那么总数将为16字节


只是好奇:仿真器抱怨了吗?

在指令之前的db指令会提供您需要的吗?很可能NASM不会生成长度大于15字节的指令的二进制文件,这是Intel对有效指令的长度限制。相反,你可以自己制作二进制文件,在任何人编写一条有效的指令,并在汇编文件时预编16条NOP指令。如果需要,用前缀替换0x90字节NOP指令。我不确定db指令是否有任何用处。我的猜测是,如果它是多余的,NASM也会忽略它。不管怎样,我还是要试试。我还考虑过编辑二进制文件本身作为最后手段。感谢您的回答。NASM不会删除数据指令。它无法知道它应该是数据还是指令的一部分。好吧,一开始我不明白使用db指令意味着什么,但现在我明白了,它工作了!对于任何好奇、需要这个和/或像我一样慢的人,这里有一个在NASM中生成长度超过16字节的指令的示例:db 0x66、0x66、0x66、0x66、0x66、0x66、0x66、0x66、0x66、0x66、0x66 mov ax,谢谢大家!我使用的是32位普通x86代码。moveax,[fs:0]是6字节长的:64a100。我不确定第七个字节是什么。mov ax,1是4字节长:66 B8 01 00;哦,是的,它确实在抱怨。我在上面的评论中给出的示例实际上是16字节长的,它导致了一个异常。如果我去掉其中一个0x66前缀,它运行正常。