当前位置: 代码迷 >> 汇编语言 >> 怎么生成“66 6a 33”这样的机器码
  详细解决方案

怎么生成“66 6a 33”这样的机器码

热度:6829   发布时间:2013-02-26 00:00:00.0
如何生成“66 6a 33”这样的机器码
本人初学者,使用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
  相关解决方案