masm32编译lea指令时如何指定操作数类型

[复制链接]
查看11 | 回复8 | 2021-1-27 06:35:03 | 显示全部楼层 |阅读模式
用ida反出来代码中,包含两种长度的lea指令
8D642400leaesp,[esp+0]
8DA42400000000leaesp,[esp+0]
如果用masm32编译后,都变成:
8D2424leaesp,[esp]
问题:如何用masm32编译出之前两种格式指令码.
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:35:03 | 显示全部楼层
leaesp,byteptr[esp+0x11]
leaesp,dwordptr[esp+0xaaaaaaa]
回复

使用道具 举报

千问 | 2021-1-27 06:35:03 | 显示全部楼层
二楼好,leaesp,[esp+0]如何能变为4字节与6字节机器码呢
回复

使用道具 举报

千问 | 2021-1-27 06:35:03 | 显示全部楼层
sizeof(byte)=1
sizeof(dword)=4
4=3+sizeof(byte)
7=3+sizeof(dword)
回复

使用道具 举报

千问 | 2021-1-27 06:35:03 | 显示全部楼层
不错。
回复

使用道具 举报

千问 | 2021-1-27 06:35:03 | 显示全部楼层
leaesp,[esp]=>8D2424
leaesp,byteptr[esp+0]=>8D2424
leaesp,dwordptr[esp+0]=>8D2424
为之奈何?
回复

使用道具 举报

千问 | 2021-1-27 06:35:03 | 显示全部楼层
leaesp,byteptr[esp+0]=>8D2424
leaesp,dwordptr[esp+0]=>8DA424
回复

使用道具 举报

千问 | 2021-1-27 06:35:03 | 显示全部楼层
movxxxxxxxxxxxx
dbxx,xx,xx,xx,xx,.....
xoreax,xxx
.......
可以实现leadword:,byte:????
回复

使用道具 举报

千问 | 2021-1-27 06:35:03 | 显示全部楼层
这个,是因为对同一指令的不同解释吧。比如leaesp,[esp]指令,实际结果和leaesp,[esp][00]与leaesp,[esp][00000000]是一样的,但却是三条不同指令:
leaesp,[esp];这是最简单的
leaesp,[esp][00];这个多了个多余的为00的disp8基址
leaesp,[esp][00000000];这个更夸张,用disp32格式来表示个00的多余的基址了
之所以有后面两种不同的表示方式,应该是在功能满足时,尽可能地让指令精简短小些吧。
高级语言的编译器,一般也应该是尽力适应更为精练的指令,生成8D642400:leaesp,[esp][00]这样的指令比较奇怪了。
象上面#6楼提及的8DA424,这是不完整的,完整的应该是8DA42400000000。当然了,译成这样的指令很让人抓狂的,一般来说,也是不应该的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行