本人初学者,使用masm。
关键指令: push dword ptr 33h
对应生成的机器码: 66 6a 33 00 00 00
希望生成的机器码: 66 6a 33
全部代码如下:
.386
assume cs:cs_seg,ds:data_seg,es:data_seg,ss:ss_seg
data_seg segment byte public use32
data_seg ends
ss_seg segment byte public use32
ss_seg ends
cs_seg segment byte public use16
start:
push dword ptr 33h
cs_seg ends
end
稍微解释一下情况,当前的代码段是16位,如果这条指令是push 33h,就会生成“6a 33”的机器码,但是就不会有66h前缀了,只能强制dword了,但是这样一来,却变成了“66 6a 33 00 00 00”了。
nasm里面好像有优化,可以优化掉后面的“00 00 00”,我只是在网上看到的,我觉得应该没什么问题,但是我不熟悉nasm语法,觉得别扭。
不知道masm有没有这样的优化选项?
或者说不需要优化选项,其他办法也能到达我的要求呢?
再说明一下,“66 6a 33”与“6a 33”执行的时候,是有区别的,我调试过了。
各位帮帮忙吧。
------解决方案--------------------------------------------------------
操作码6A对应的指令格式是 PUSH imm8,不管是在16位下,还是在32位下,PUSH byte 0x33对应的都是6A 33。
不知道你所说的“执行的时候,是有区别的”是什么区别,在下目光短浅,尚请指教。
如果真有区别,你可以通过以下两种方法实现:
其一:
start:
db 66h
push byte ptr 33h
cs_seg ends
其二:
start:
db 66h,0aah,33h
cs_seg ends