【汇编语言课程】 知识点+易错题 吐血整理(下)
十一、标志寄存器
知识点总结:
flag
为标志寄存器,按位起作用- flag的第6位是
ZF
,零标志位;记录相关指令执行后,其结果是否为0。如果结果 为0,那么zf=l;如果结果不为0,那么zf=0 - flag的第2位是
PF
,奇偶标志位。它记录相关指令执行后,其结果的所有bit位中1 的个数是否为偶数。如果1的个数为偶数,pf=1,如果为奇数,那么pf=0 - flag的第7位是
SF
,符号标志位。它记录相关指令执行后,其结果是否为负。如果结果为负,sf=1;如果非负,sf=0。针对有符号数 - 在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,比如,
add、 sub、mul、div、inc、or、and
等,它们大都是运算指令(进行逻辑或算术运算);有的指令的执行对标志寄存器没有影响,比如,mov、push、pop
等,它们大都是传送指令。 - flag的第0位是
CF
,进位标志位。一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。 - flag的第11位是
OF
,溢出标志位。一般情况下,OF记录了有符号数运算的结果是 否发生了溢出。如果发生溢出,OF=1:如果没有,OF=0。 adc
是带进位加法指令,它利用了 CF位上记录的进位值。
实现的功能是:操作对象1 =操作对象1 +操作对象2 + CF- inc和loop指令不影响CF位;
不能将4个inc指令,用
add si, 2
add di, 2
来取代,因为可能会改变cf sbb
是带借位减法指令,它利用了 CF位上记录的借位值。
功能:操作对象1=操作对象1-操作对象2-CFcmp
是比较指令,cmp
的功能相当于减法指令,只是不保存结果。cmp指令执行后, 将对标志寄存器产生影响。- 考查
sf
(得知实际结果的正负)的同时考查of
(得知有没有溢出),就可以得知逻辑上真正结果的正负,同时就可以知道比较的结果。当of=1时,逻辑结果与实际结果相反 - 根据cmp指令比较的结果:
指令 含义 检测的相关标志位 je 等于则转移 zf=1 jne 不等于则转移 zf=0 jb 低于则转移 cf=1 jnb 不低于则转移 cf=0 ja 高于则转移 cf=0 且 zf=0 jna 不高于则转移 cf=1 或 zf=1 - flag的第10位是
DF
,方向标志位。在串处理指令中,控制每次操作后si、di的增减。
df=0每次操作后si、di递增;
df=1每次操作后si、di递减。 movsb
功能:执行movsb指令相当于进行下面几步操作。
(1) ((es) * 16+(di))=((ds)*l6+(si))
(2) 如果 dF=0 则:
(si)=(si)+1
(di)=(di)+1
如果 df=1 则: (si)=(si)-1
(di)=(di)-1movsb
和movsw
都 和rep
配合使用,格式如下:rep movsb- cld指令:将标志寄存器的df位置0
std指令:将标志寄存器的df位置1 pushf
的功能是将标志寄存器的值压栈,而popf
是从栈中弹出数据,送入标志寄存器中
易错题:
- 写出下面每条指令后,ZF、PF、SF 等标志位的值。
ZF PF SF
sub al,al 1 1 0
mov al,1 1 1 0
push ax 1 1 0
pop bx 1 1 0
add al,bl 0 0 0
add al,10 0 1 0
mul al 0 1 0
解:运算指令改变标志位,传送指令不改变标志位
CF OF SF ZF PF
sub al,al 0 0 0 1 1
mov al,10H 0 0 0 1 1
add al,90H 0 0 1 0 1
mov al,80H 0 0 1 0 1
add al,80H 1 1 0 1 1
mov al,0FCH 1 1 0 1 1
add al,05H 1 0 0 0 0
mov al,7DH 1 0 0 0 0
add al,0BH 0 1 1 0 1
- (ah)=22H, (bh)=0A0H;贝lJ(ah)-(bh)=34-(-96)=82H, 82H 是-126 的补码
所以sf=1这里虽然sf=1,但是并不能说明(ah)<(bh)因为显然34>-96。 - 下面的程序执行后:(ax)=?
解:(ax)=0045hmov ax,0 push ax popf mov ax,0fff0h add ax,0010h pushf pop ax and al,11000101B and ah,00001000B
十二、内中断
知识点总结:
- 中断的意思是 指,CPU不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息。
- 中断信息。
除法错误;中断类型码为:0
单步执行;中断类型码为:1
执行into指令;中断类型码为:4
执行int指令。中断类型码为:n - 8086CPU用称为中断类型码的数据来标识中断信息的来源。中断类型码为一个字节型数据,可以表示256种中断信息的来源
- 执行int指令,该指令的格式为
int n
,指令中的n为字节型立即数,是提供给 CPU的中断类型码。 - 用来处理中断信息的程序被称为中断处理程序
- 中断类型码的作用就是用来定位中断处理程序
- CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址
- CPU只要知道了中断类型码,就可以将中断类型码作为中断向量表的表项号,定位相应的表项,从而得到中断处理程序的入口地址
- 8086CPU中断向量表必须放在
0000:0000〜0000:03FF
单元中 - 用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的。CPU硬件完成这个工作的过程被称为中断过程
- 中断过程。
(1) (从中断信息中)取得中断类型码;
(2) 标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保 存在栈中);
(3) 设置标志寄存器的第8位TF和第9位IF的值为0(这一步的目的后面将介绍);
(4) CS的内容入栈;
(5) IP的内容入栈;
(6) 从内存地址为中断类型码*4和中断类型码 *4+2的两个字单元中读取中断处理程 序的入口地址设置IP和CS。 - iret指令的功能用汇编语法描述为:
pop IP pop CS popf
易错题:
- 用 Debug 查看内存,情况如下:
0000:0000 68 10 A7 00 8B 01 70 00-16 00 9D 03 8B 01 70 00
则 3 号中断源对应的中断处理程序的入口地址为:0070:018B 。 - 存储 N 号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为:4N 。 存储 N 号中断源对应的中断处理程序入口的段地址的内存单元的地址为:4N+2 。
- 考虑改变一下0号中断处理程序的功能,即重新编写一个0号中断处 理程序,它的功能是在屏幕中间显示“overflow!",然后返回到操作系统
assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do0 ;设置ds:si指向源地址 mov ax,0 mov es,ax ;设置es:di指向目的地址 mov di,200H mov cx,offset do0end-offset do0 rep movsb mov ax,0 mov es,ax mov word ptr es:[0],200H mov word ptr es:[2],0 mov ax,4C00H int 21H do0: jmp short do0start db "divide error!" do0start: mov ax,cs mov ds,ax mov si,202H mov ax,0B800H mov es,ax mov di,12*160+36*2; ;设置es:di指向显示空间的中间位置 mov cx,13 ;设置cx为字符串的长度 s: mov al,[si] mov es:[di],al inc si add di,2 loop s mov ax,4C00H int 21H do0end:nop code ends end start
十三、int指令
知识点总结:
- int指令的格式为:int n, n为中断类型码,它的功能是引发中断过程。