第一章 汇编语言基础知识(中)
写在前面:这一部分开始接触编写汇编语言程序需要大量运用的寄存器、标志等。如有错误欢迎指正,感谢!
1.8086的通用寄存器
16位通用寄存器:AX BX CX DX SI DI BP SP
其中前四个数据寄存器还可以分成高8位和低8位两个独立的寄存器。
即8086的8位通用寄存器:
AH AL BH BL CH CL DH DL
2.数据寄存器
用来存放计算的结果和操作数,每个寄存器也可以存放地址。
- AX:累加器,使用频率最高,用于算术、逻辑运算以及与外设传送信息等;
- BX:基址寄存器,常用作存放存储器地址、数组首地址,默认段地址DS;
- CX:计数器,作为循环和串操作等指令中的隐含计数器;
- DX:数据寄存器,常用来存放双字长数据的高16位,或存放外设端口地址。
3.变址寄存器
用于存储器寻址时提供地址。串操作类指令中,SI、DI具有特别的功能。
- SI:源变址寄存器
- DI:目的变址寄存器
4.指针寄存器
用于寻址内存堆栈内的数据。SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的存储单元地址。
- SP:堆栈指针寄存器,用于指示栈顶的偏移地址。具有专用目的,不能在用于其他目的。
- BP:基址指针寄存器,表示数据在堆栈段中的基地址,默认段地址SS,用法类似BX。
5.指令指针寄存器
- IP:指示代码段中指令的偏移地址,与代码段寄存器CS联用,确定下一条指令的物理地址,是一个专用寄存器。
6.标志寄存器
标志(Flag)用于反映指令执行结果或控制指令执行形式。各种标志形成了一个16位的标志寄存器FLAGS。
状态标志:CF ZF SF PF OF AF 控制标志:DF IF TF
各个标志在标志寄存器中的位置
7.进位标志CF
无符号数,当加法或减法运算结果的最高有效位有进位或者借位时,CF=1(CY),否则CF=0(NC)。
;在dosbox用-a写代码时不要加h,dosbox只认得十六进制。
mov al,3ah
mov dl,7ch
add al,dl ;al=b6h,CF=0
mov al,aah
mov dl,7ch
add al,dl ;al=26h,CF=1
mov al,4ah
mov dl,3ah
sub al,dl ;al=10h,CF=0
mov al,3ah
mov dl,4ah
sub al,dl ;al=f0h,CF=0
8.零标志ZF
当运算结果为0时,ZF=1(ZR),否则ZF=0(NZ)。
PS:cmp指令,同样会引起ZF变化。
mov dl,7ch
mov al,3ah
cmp al,dl ;ZF=0
add al,dl ;al=00h,ZF=0
mov al,84h
cmp al,dl ;ZF=1
add al,dl ;al=00h,ZF=1
9.符号标志位SF
运算结果的最高位为1(即为负数),则SF=1(NG),否则SF=0(PL)。
mov dl,7ch
mov al,3ah
add al,dl ;al=b6h(1011 0100B),SF=1
mov al,84h
add al,dl ;al=00h,SF=0
10.奇偶标志位PF
当运算结果最低字节(即最低8位)中“1”的个数为0或偶数时,PF=1(PE),否则PF=0(PO)。
mov dl,7ch
mov al,3ah
add al,dl ;al=b6h(1011 0110B),PF=0
11.溢出标志OF
有符号数,若算术结果有溢出,则OF=1(OV),否则OF=0(NV)。!注意是有符号数,与CF区别
mov dl,7ch
mov al,3ah
add al,dl ;al=b6h,CF=0,OF=1
12*.辅助进位标志AF
运算时D3位有进位或借位时,AF=1,否则AF=0。这个标志主要由处理器内部使用,用于十进制算术运算调整指令中,用户一般不必关心。
13.方向标志DF
用于串操作指令中,控制地址的变化方向。
- CLD指令设置DF=0时,存储器地址自动增加。
- STD指令设置DF=1时,存储器地址自动减少。
14.允许中断标志IF
用于控制外部可屏蔽中断是否可以被处理器响应。
- CLI指令设置IF=0时,禁止中断。
- STI指令设置IF=1时,允许中断。
15.陷阱表示TF
用于控制处理器进入单步操作方式。
- 设置TF=0,处理器正常工作。
- 设置TF=1,处理器单步执行指令。
单步执行指令:处理器在每条指令执行结束时,便产生一个编号为1的内部中断,这种内部中断也叫单步中断,所以TF也叫单步标志。