NASM中Long nop指令:是否有内置方式生成指定长度多字节nop?
NASM中生成指定长度的Long Nop指令
当然有办法在NASM里生成指定长度的多字节nop(long nop),不过NASM本身并没有直接的内置指令可以一键指定长度生成,但咱们可以通过几种灵活的方式实现这个需求:
用
times指令组合多字节nop序列
这是最直接的做法,先明确x86架构下常见的合法多字节nop及其长度:db 0x90:1字节基础nopdb 0x66, 0x90:2字节nopdb 0x0f, 0x1f, 0x00:3字节nopdb 0x0f, 0x1f, 0x40, 0x00:4字节nop
你可以根据目标长度,组合这些序列。比如要生成10字节的long nop,代码可以这么写:
; 凑出10字节的long nop times 2 db 0x0f, 0x1f, 0x40, 0x00 ; 2个4字节nop,共8字节 times 2 db 0x90 ; 2个1字节nop,共2字节 ; 总长度10字节自定义宏实现一键生成
如果经常需要生成不同长度的long nop,写个宏能省不少事。下面这个宏会自动根据传入的长度,优先使用更长的nop指令来凑数:%macro long_nop 1 %assign remaining %1 ; 优先用4字节nop,减少指令数量 %while remaining >= 4 db 0x0f, 0x1f, 0x40, 0x00 %assign remaining remaining - 4 %endwhile ; 处理剩余的字节 %if remaining >= 2 db 0x66, 0x90 %assign remaining remaining - 2 %endif %if remaining >= 1 db 0x90 %assign remaining remaining - 1 %endif %endmacro ; 调用宏生成15字节的long nop long_nop 15这个宏会自动处理所有1及以上的长度需求,生成的都是合法、无副作用的多字节nop。
注意架构兼容性
上面提到的这些多字节nop序列在32位x86和x86-64架构下都能正常工作,不会被CPU解析成其他功能指令,完全可以放心使用。
内容的提问来源于stack exchange,提问作者BeeOnRope
相关产品推荐
相关产品推荐

