Tag: 机器码

AMD64 – nopw汇编指令?

在这个编译器输出中,我试图理解nopw指令的机器码编码是如何工作的: 00000000004004d0 : 4004d0: eb fe jmp 4004d0 4004d2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1) 4004d9: 1f 84 00 00 00 00 00 在http://john.freml.in/amd64-nopl上有一些关于“nopw”的讨论。 任何人都可以解释4004d2-4004e0的含义吗? 从查看操作码列表看, 66 ..代码似乎是多字节扩展。 我觉得我可能会得到一个比这更好的答案,除非我试图让操作码列表停留几个小时。 asm输出来自C中的以下(疯狂)代码,它优化为简单的无限循环: long i = 0; main() { recurse(); } recurse() { i++; recurse(); } 当使用gcc -O2编译时,编译器会识别无限递归并将其转换为无限循环; 它实际上做得很好,事实上,它实际上在main()循环而不调用recurse()函数。 编者注:带NOP的填充函数并不特定于无限循环。 在Godbolt编译器资源管理器中 ,这是一组具有一系列NOP长度的函数。