012-【X86-汇编语言】-EAX,EBX,ECX,EDX能屈能伸的寄存器
能屈能伸的寄存器
在009-【X86-汇编语言】-寄存器(Register)中介绍了8个通用寄存器,在这8个通用寄存器中有4个寄存器属于能屈能伸的寄存器。它们是EAX,EBX,ECX,EDX,之所以说它们能屈能伸,是因为他们不单可以存放32bit的数据,还可以存放8bit、16bit的数据。
能屈能伸的原因
以EAX为例,EAX这个名称代表一个32bit的寄存器,而它可以被拆分,用不同的名称代表它的一部分。AX代表EAX的低16位bit。AL代表AX的低4位bit(也是EAX的最低4位bit),AH代表AX的高4位bit(也是EAX的第8到第15位bit)。如图
除EAX之外,EBX、ECX、EDX,也都有类似的结构
32bit | 16bit | 8bit | 8bit |
---|---|---|---|
EAX | AX | AH | AL |
EBX | BX | BH | BL |
ECX | CX | CH | CL |
EDX | DX | DH | DL |
程序演示
本程序分别设置AL AH AX EAX的值来演示他们之间的关系
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
.data
forAL BYTE 0ABh
forAH BYTE 012h
forAX WORD 0CDEFh
forEAX DWORD 1234ABCDh
.code
EAXTEST PROC
MOV EAX,0h ;为了方便观察先把EAX设置成0
MOV AL,forAL ;将forAL的值赋值给AL寄存器
MOV AH,forAH ;将forAH的值赋值给AH寄存器
MOV AX,forAX ;将forAX的值赋值给AX寄存器
MOV EAX,forEAX ;将forEAX的值赋值给EAX寄存器
INVOKE ExitProcess,0
EAXTEST ENDP
END EAXTEST
然后单步调试
- 当执行过【MOV AL,forAL】可以看到EAX的寄存器的值变成了
“AB”的位置对应的正是AL寄存器的位置
- 当执行过【MOV AH,forAH】可以看到EAX的寄存器的值变成了
“12”的位置对应的正式AH寄存器的位置
- 当执行过【MOV AX,forAX】可以看到EAX的寄存器的值变成了
“CDEF”的位置对应的正式AX寄存器的位置,此时AH和AL的值都被覆盖掉了
- 当执行过【MOV EAX,forEAX】可以看到EAX的寄存器的值变成了
此时AL、AH、AX的值都被覆盖掉了
EBX、ECX、EDX大家可自行编写程序验证