如何在MASM 32位代码中强制指定PUSH指令的操作数大小?
在MASM 5.0及以上版本中控制push指令长度的方法
MASM没有NASM里strict byte/strict dword这类直接关键字,但可以通过类型修饰符强制指定push指令的立即数长度,从而生成对应字节数的指令:
生成2字节push指令(操作码+1字节数据)
使用byte ptr修饰立即数,强制生成push imm8格式的指令(操作码0x6A + 1字节立即数):
push byte ptr 42 ; 编译后对应机器码:0x6A 0x2A(共2字节)
注:在16位模式下,该指令会将字节立即数零扩展为16位字再入栈;32位模式下则零扩展为32位双字入栈,但指令长度始终为2字节。
生成5字节push指令(操作码+4字节数据)
使用dword ptr修饰立即数,强制生成push imm32格式的指令(操作码0x68 + 4字节立即数):
push dword ptr 42 ; 编译后对应机器码:0x68 0x2A 0x00 0x00 0x00(共5字节)
注:如果不指定类型,MASM会自动将小立即数优化为push imm8格式,因此必须显式用dword ptr强制生成4字节立即数版本。
内容的提问来源于stack exchange,提问作者pts
相关产品推荐
相关产品推荐

