寄存器用于存放物理地址
CPU执行指令的三个步骤
- 读取cs:ip所指向地址的指令,读取的指令进入缓冲器
- ip=ip+所读取指令长度,从而指向下一条指令
- 执行指令,重复第一步
CS寄存器和IP寄存器
CS寄存器: code segment, 代码段寄存器,存放代码段的内存单元地址(基地址)。 IP寄存器: instruction pointer,指令指针寄存器,存放指令所在的地址的偏移地址
举例:希望执行1000:0123地址的指令时,先修改cs和ip寄存器值
jmp 1000:0123 #同时修改cs和ip, 即执行后cs=1000,ip=0123
jmp ax #修改ip为ax,可类比mov ip,ax
命名规则
r表示register, x64系统新增8个通用寄存器(r8~r15)
e表示extended,扩展(16bit->32bit)
x表示占位符, 可以是H或者L,分别表示高8位和低8位,x86大佬原始邮件解释如下
"The X was simply an arbitrary letter that combined both L and H – sort of like the use of X in algebra to designate the unknown."
ax: accumulator register --> eax为32bit寄存器, rax为64bit寄存器
bx: base register --> ebx -->rbx
cx: count register --> ecx -->rcx
dx: data register -->edx -->rdx
sp: stack pointer --> esp -->rsp
bp: base pointer --> ebp -->rbp
si: souce index -->esi -->rsi
di: destination index -->edi -->rdi
举例分析
设置初始状态:CS = 2000H, IP = 0000H
指令执行过程:
| 指令 | CS:IP | 结果 |
|---|---|---|
| mov ax,6622 | 2000:0003 | ax=6622 |
| jmp 1000:3 | 2000:0008 | cs:ip=1000:0003 |
| mov ax,0000 | 1000:0006 | ax=0000 |
| mov bx,ax | 1000:0008 | bx=0000 |
| jmp bx | 1000:000A | cs:ip=1000:0000 |
| mov ax,0123 | 1000:0003 | ax=0123 |
| ==>继续转第三行执行 |