2010-08-13 40 views
4

我正在尝试写一个反汇编程序。我发现操作码及其含义下面的列表,所以我决定在运行时解析它: http://mprolab.teipir.gr/vivlio80X86/pentium.txtx86操作码编码:sib字节

但我被困在操作码为0x00: 其次是一个reg/modbyte。解析它对我来说不是什么问题。 但是我在使用Scale-Index-Byte时遇到了问题: 如果实际上将esp指定为索引寄存器,则实际上意味着没有索引寄存器。 同样适用于ebp的基址寄存器。但我已经用C++内联汇编器试过了:可以编译: “add [ebp * 2 + ebp],cl”

那么ebp如何作为基址寄存器意味着根本不使用基址寄存器!

回答

6

“缺失的EBP”情况仅适用于情况下ModR/M.Mod字段的值为00二进制。如果您需要EBP作为基础,汇编改变了国防部为01二进制,并增加了8位位移为零值:

004C6D00添加[EBP + EBP * 2],CL

+0

确定是否有其他失踪注册8位和32位的位移值呢? 任何其他奇怪的过度依恋? – Zotta 2010-08-13 13:33:36

+1

只有EBP“缺失”。请注意,您可以编码纯[位移]由于 “缺少ESP指数” 和addresing “失踪EBP基地” 两种方式: 000D 78563412添加[12345678],CL 000C25 78563412添加[12345678],CL 然而, 64位模式下,第一个操作码意味着: 000D 78563412 add [rip + 12345678],cl 编辑:狗屎,换行符被吃掉了什么使评论更不可读。 – MazeGen 2010-08-13 13:46:18

+0

好吧,现在它工作。十分感谢! – Zotta 2010-08-14 09:06:22