寄存器

1、push和pop指令演示入栈出栈,对内存,寄存器,立即数三种情况模拟

push

内存

push dword ptr ds:[0x12FFDC]

[0x12FFDC]地址与对应的值

image-20250924160906639

原始堆栈

image-20250924160940623

运行后,栈顶地址减小,数值和地址 [0x12FFDC] 的数值相同

image-20250924161027861

寄存器

push ebx

EBX的值

image-20250924161203540

原始堆栈

image-20250924161217843

运行结果,栈顶地址减小,数值和寄存器 EBX 的数值相同

image-20250924161240742

立即数

push 0x12345678

原始堆栈(注意栈顶)

image-20250924161413394

运行后,栈顶地址减小,数值与输入的立即数的数值相同

image-20250924161444198

pop

内存

pop dword ptr ds:[0x12FFF0]

地址[0x12FFF0]

image-20250924161848621

原始堆栈

image-20250924161905681

运行后,地址[0x12FFF0]值改变为弹出的堆栈中的值

image-20250924161925327

栈顶指针地址增加

image-20250924162027137

寄存器

pop EAX

EAX

image-20250924161730544

原始堆栈

image-20250924161749369

运行后,弹出数据,EAX寄存器值改变为弹出的堆栈中的值

image-20250924161805241

栈顶指针地址增加

image-20250924161815910

立即数

pop 不支持直接操作立即数

2、使用mov,lea,sub,add等指令模拟push和pop的行为

模拟push

push eax
sub esp,0x4
mov dword ptr ss:[esp],eax

EAX

image-20250924162749380

栈顶

image-20250924162835597

执行命令后,栈顶指针减小,且 eax 寄存器的值被压入栈

image-20250924162914793

模拟pop

pop ebx

mov ebx, [esp]
add esp, 0x4

EBX

image-20250924163203501

栈顶

image-20250924163223201

执行命令后,栈顶指针大小增加,数据弹出到 ebx 寄存器

image-20250924163246810

image-20250924163408231

3、演示六种标志寄存器发生变化的情况

进位标志CF

(主要记录无符号数)CF = 1 表示有进位或借位,CF = 0 表示没有进位或借位

原始 CF 位

image-20250924163542924

EAX

image-20250924163819107

运行

add al, 44h

123AFCDB + 44h = 123AFC1F

DB + 44h = 11F 产生了进位

image-20250924163858618

奇偶标志PF

运算结果中 1 个数为偶数时 PF = 1,反之(只计算最低的一个字节)

EAX

image-20250924164412358

原 PF 位

image-20250924164440534

计算

add ax, 11h

FC1F + 11h = FC30

FC30 末尾一个字节 0011 0000 偶数个 1 故 PF = 1

image-20250924164533374

辅助进位标志AF

进行字节(byte)操作时,低 4 位发生进位或借位时 AF = 1,反之

进行字(word)操作时,低 8 位发生进位或借位时 AF = 1,反之

EAX

image-20250924165205079

AF 位

image-20250924164954722

执行

add al, 15h

0C + 15h = 21

C + 5 = 11h
低四位产生进位,故 AF = 1

image-20250924165229920

零标志ZF

运算结果为 0 时 ZF = 1,反之 ZF = 0

EAX 和 EBX 寄存器

image-20250924165743451

原始 ZF

image-20250924165801509

运行

sub EAX, EBX

EAX = EAX - EBX

结果为 0 ,故 ZF = 1

image-20250924165840399

符号标志SF

(针对有符号数)运算结果为负 SF = 1,反之 SF = 0

EAX

image-20250924171241476

SF 标志位

image-20250924171256362

执行

sub ax, 3h

0002 - 0003 = -1 = ffff

结果为 -1 故 SF = 1

image-20250924171401601

溢出标志OF

(主要针对有符号数)运算结果超过当前位数所表示的数的范围,则为溢出 OF = 1,反之 OF = 0

例如:16 位有符号数最大 32767,最小 - 32768,计算 32767 + 1 时,由于表示的最大的数为 32767 (7FFF),+ 1 后就是 8000 符号位为 1 变成负数了,但却是两个正数相加,这种情况就叫溢出

EAX

image-20250924173158916

OF 标志位

image-20250924173213769

执行

add ax, 1h

7FFF + 1 = 8000h

十六位表示的最大正数为 2^15 - 1 = 32767
32767 + 1 = 32768 超过最大表示范围,溢出

image-20250924173255788

方向标志DF

标识移动移动方向,0 增加,1 减少

Author: wickt42
Link: http://example.com/2025/09/24/寄存器/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.