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大家可自行编写程序验证

猜你喜欢

转载自blog.csdn.net/patronwa/article/details/88534747
今日推荐