x86汇编与逆向工程:软件破解与防护的艺术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4.2 寄存器的使用

在汇编过程中,通用寄存器可以被当作变量来处理,并通过名称进行访问。例如,指令mov eax, 1将数值1存到eax,而add eax, ebx则将eax的内容加到ebx上。

请注意,所有这些寄存器的名称都以字母e开头。这是因为这些32位寄存器是从原始的16位寄存器中“扩展”出来的。

寄存器内容的低位部分可以通过从名称中删除这个e来访问。例如,ax寄存器包含了eax寄存器的低16位。

如果寄存器的名称以x结尾(如eax、ebx、ecx和edx),那么这个16位寄存器可以进一步划分为两个8位寄存器,它们分别被标识为l和h。al包含寄存器ax的低8位,而ah包含了高8位。这在图2.6中有所说明,其中eax=0x01234567,ax=0x4567,ah=0x45,al=0x67。

图2.6 eax寄存器的各个部分

64位寄存器

在64位的x86架构中,所有的指令和行为与32位的x86一样。不过,64位的架构有更多、更大的寄存器。

图2.7展示了64位x86常用的寄存器。除了有所不同的32位寄存器外,64位架构还包括标记为r8~r15的八个寄存器。

所有的64位寄存器都比它们的32位版本要大。对于32位x86中存在的寄存器,比如eax,它的全64位版本就会把e换成r,变成rax寄存器。这样,就可以通过32位的名称获取寄存器的低32位,像ax、al、ah这样的名称的用法保持不变。

对于像r8这样的新寄存器,64位的x86支持对其低32位、低16位和低8位的访问。这些分别被标记为r8d、r8w和r8b,如图2.8所示。