寄存器
寄存器
八个通用寄存器:
AX BX CX DX
SP BP SI DI
他们不仅仅是通用寄存器,还有特殊的用途,名字就是他们特殊用途的缩写,后面加 x 是为了好看,x 本身没有含义
- AX ==> add 累加器,做加法时使用AX寄存器比较快
AX = AX + BX 快于 BX = BX + CX - BX ==> base 基地址,基质寄存器
在c语言中有访问数组或结构体是通过 (基址 + 偏移) 的方式访问的,CPU 规定基地址必须存放在BX中,当然操作系统也遵守 - CX ==> count 计数器
CPU规定:当使用循环指令时,所循环的次数只能存放在CX中 - DX ==> data数据寄存器
常用来存放双字长数据的高16位,或存放外设端口地址 - SP ==> Stack Point 栈顶指针
- BP ==> base Point 栈底指针
这个也可以使用 基址 + 偏移 ,一般用于访问栈内元素,但也可以访问其他内存 - SI ==> source 源寄存器 DI ==> Dest 目标寄存器
一般用于内存中的拷贝,将源数据的地址存放在SI中,将目标地址存放在DI中
为了方便访问寄存器中的高8位和第八位cpu提供了一种方法:使用H和L
AX(AH AL) BX(BH BL) CX(CH CL) DX(DH DL)
对于SP BP SI DI 这四个寄存器中没有提供访问其高8位或低8位的指令,本质原因是因为他们存放的是地址,访问一个地址的高8位或低8位没有意义
ip寄存器
- ip:instruction point指令指针
也就是常说的 pc ,ip寄存器中存放着程序所要执行的下一条指令的地址
flag寄存器
标志(flag)用于反应指令执行结果或控制指令的执行形式
8086处理器的各种标志形成了一个16位的标志寄存器FGLAGS(程序运行状态字PSW寄存器)
CF PF AF ZF SF TF IF DF OF
状态标志:
--用来记录程序运行结果的状态信息,许多指令的执行都会相应设置这些标志位
CF ZF SF PF OF AF
-
进位标志CF(Carry Flag)
当运行结果的最高有效位有进位(加法)或接位(减法)时,进位标志置为1,即CF=1否则CF=0
这个标志位的作用就是记录寄存器进位或者借位,也就是进位或借位没有丢失而是被保存到CF中了,这个常用来做多位运算(低位加低位,高位加高位再加上CF)
3AH + 7ch = b6h 没有进位:CF = 0
AAH + 7CH = (1)26H 有进位 :CF=1
- 零标志位 ZF
计算结果为0时,将这个标志位置为1
-
符号位SF(Sign Flag)
运算结果最高位为1,则SF=1;否则SF=0
有符号数据用最高位表示数据的符号,所以有效位就是符号位的标志,如果你做的是无符号运算那么忽略这个位即可
PL:pluss NG:negative
-
溢出标志位 OF(overflow)
若算术运算符的结果有溢出,则OF=1,否则OF=0
3AH + 7CH = B6H 产生溢出:OF=1
AAH + 7CH = (1)26H 没有溢出:OF=0
CPU根据传入的两个数和输出的数的符号进行判定:传入两个正数确输出一个负数那么溢出,传入两个负数输出一个正数那么溢出,这里的正数指的是最高位是否为1,计算器本身是没有没有正负之分 -
奇偶标识PF
当运算结果最低字节(低八位)中 1 的个数为零或者偶数时,PF=1;否则PF=0 -
辅助进位AF(Auxiliary Carry Flag)
运算时D3位(低半字节)有进位或借位时,AF = 1,否则AF = 0
控制标志:
--可由程序根据需要用的指令设置,用于控制处理器执行指令的方式
DF IF TF
-
方向标志位 DF
在拷贝数据时地址是增加还是减少设置DF=0,存储器地址自动增加、设置DF=1,存储器地址自动减少
对于两条指令
cld std
cld相当于df=0(递增) std相当于df=1(递减) -
屏蔽中断标志位 IF(Interrupt-enable Flag)
设置 IF=1,允许中断、设置IF=0,禁止中断 -
陷阱标志位TF(Trap Flag)
用于控制处理器进入单步操作方式
设置TF=0,处理器正常工作,设置TF=1,处理器单步执行指令(用于调试)
在实际开发中常用的只有 CF ZF SF OF DF