x86汇编执行mov $0x2023,%ax后寄存器值与预期不符的疑问
x86汇编中
mov $0x2023, %ax的执行逻辑及寄存器值异常解析 问题涉及的代码片段
mov $0, %eax mov $0x2023, %ax mov $1, %ah
核心问题拆解
你遇到的困惑源于对x86寄存器重叠映射结构的误解,以下是每条指令的实际执行过程:
mov $0, %eax
将32位寄存器EAX的所有位清零,此时:- EAX = 0x00000000
- AX(EAX的低16位)= 0x0000
- AH(AX的高8位)= 0x00,AL(AX的低8位)= 0x00
mov $0x2023, %ax
把16位立即数0x2023写入AX寄存器,这会直接覆盖AX的全部16位,同时因为AX是EAX的低16位,EAX的低16位也会同步更新:- AX = 0x2023,其中高8位AH = 0x20,低8位AL = 0x23(0x2023拆分后就是高字节0x20、低字节0x23)
- EAX此时的值为
0x00002023(高16位保持清零状态,低16位被AX更新)
mov $1, %ah
把立即数1写入AH寄存器(AX的高8位),仅覆盖AH的值,AL不受影响:- AH = 0x01,AL仍为0x23,因此AX = 0x0123
- EAX的低16位随AX更新,最终值为
0x00000123(调试器通常会省略前导零,显示为0x123)
你的理解误区
你之前错误地认为AH、AL和AX是独立的寄存器,但实际上它们是重叠的存储区域:修改AX会同时修改AH和AL,修改AH/AL也会改变AX的值,进而影响EAX的低16位。第二条指令执行后,AH和AL已经被0x2023的高低字节覆盖,并非保持初始的0。
内容的提问来源于stack exchange,提问作者Mr. Sir
相关产品推荐
相关产品推荐

