小编Sog*_*kes的帖子

在机器代码中引用寄存器

我正在查看一些汇编代码和相应的内存转储,我无法理解正在发生的事情.我正在使用它作为x86操作码的参考,这是x86中寄存器的参考.我遇到了这些命令,我​​意识到我仍然错过了一大块难题.

8B 45 F8       - mov eax,[ebp-08] 
8B 80 78040000 - mov eax,[eax+00000478]
8B 00          - mov eax,[eax]
Run Code Online (Sandbox Code Playgroud)

基本上我不明白操作码之后的两个字节是什么意思,我找不到任何能为命令提供逐位格式的地方(如果有人能指出一个我会非常感激).

CPU如何知道每个命令有多长?

根据我的参考,这个8B mov命令允许使用32b或16b寄存器,这意味着有16个可能的寄存器(AX,CX,DX,BX,SP,BP,SI,DI及其扩展等价物).这意味着您需要一个完整的字节来指定在每个操作数中使用哪个寄存器.

到目前为止仍然很好,操作码后面的两个字节可以指定使用哪些寄存器.然后我注意到这些命令在内存中逐字节堆叠,并且所有这三个命令使用不同的字节数来指定解除引用第二个操作数时要使用的偏移量.

我想你可以限制寄存器只能使用带有16b的16b和带32b的32b,但这只能释放一个位,不足以告诉CPU有多少字节的偏移量.

哪些值对应哪些寄存器?

困扰我的第二件事是,尽管我的引用明确地给寄存器编号,但是在这些命令中操作码之后没有看到与字节的任何相关性.即使是他们自己,这些命令似乎也不一致.第二个和第三个命令都是从eax到eax,但在第一个字节中间有一点不同.

根据我的参考,我假设0是EAX,1是ECX,2是EDX,依此类推.但是,这并不能让我深入了解如何在RAX,EAX,AX,AL和AH之间进行指定.一些命令似乎只接受8b寄存器,而其他命令接受16b或32b,而在x86_64上,一些命令似乎接受16b,32b或64b寄存器.所以你会做一些类似0-7的事情是R,8-15 E,16-23非延伸,24-31 H和L?即使它是这样的,似乎应该更容易找到手册或指定的东西.

x86 assembly machine-code

5
推荐指数
1
解决办法
509
查看次数

标签 统计

assembly ×1

machine-code ×1

x86 ×1