【汇编语言课程】 知识点+易错题 吐血整理(下)

【汇编语言课程】 知识点+易错题 吐血整理(下)

十一、标志寄存器

知识点总结:

  1. flag为标志寄存器,按位起作用
  2. flag的第6位是ZF,零标志位;记录相关指令执行后,其结果是否为0。如果结果 为0,那么zf=l;如果结果不为0,那么zf=0
  3. flag的第2位是PF,奇偶标志位。它记录相关指令执行后,其结果的所有bit位中1 的个数是否为偶数。如果1的个数为偶数,pf=1,如果为奇数,那么pf=0
  4. flag的第7位是SF,符号标志位。它记录相关指令执行后,其结果是否为负。如果结果为负,sf=1;如果非负,sf=0。针对有符号数
  5. 在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,比如,add、 sub、mul、div、inc、or、and等,它们大都是运算指令(进行逻辑或算术运算);有的指令的执行对标志寄存器没有影响,比如,mov、push、pop等,它们大都是传送指令。
  6. flag的第0位是CF,进位标志位。一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
  7. flag的第11位是OF,溢出标志位。一般情况下,OF记录了有符号数运算的结果是 否发生了溢出。如果发生溢出,OF=1:如果没有,OF=0。
  8. adc是带进位加法指令,它利用了 CF位上记录的进位值。
    实现的功能是:操作对象1 =操作对象1 +操作对象2 + CF
  9. inc和loop指令不影响CF位;
    不能将4个inc指令,用
    add si, 2
    add di, 2
    来取代,因为可能会改变cf
  10. sbb是带借位减法指令,它利用了 CF位上记录的借位值。
    功能:操作对象1=操作对象1-操作对象2-CF
  11. cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后, 将对标志寄存器产生影响。
  12. 考查sf(得知实际结果的正负)的同时考查of(得知有没有溢出),就可以得知逻辑上真正结果的正负,同时就可以知道比较的结果。当of=1时,逻辑结果与实际结果相反
  13. 根据cmp指令比较的结果:
    指令含义检测的相关标志位
    je等于则转移zf=1
    jne不等于则转移zf=0
    jb低于则转移cf=1
    jnb不低于则转移cf=0
    ja高于则转移cf=0 且 zf=0
    jna不高于则转移cf=1 或 zf=1
  14. flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si、di的增减。
    df=0每次操作后si、di递增;
    df=1每次操作后si、di递减。
  15. 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)-1
  16. movsbmovsw都 和rep配合使用,格式如下:rep movsb
  17. cld指令:将标志寄存器的df位置0
    std指令:将标志寄存器的df位置1
  18. pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器中

易错题:

  1. 写出下面每条指令后,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
  1. (ah)=22H, (bh)=0A0H;贝lJ(ah)-(bh)=34-(-96)=82H, 82H 是-126 的补码
    所以sf=1这里虽然sf=1,但是并不能说明(ah)<(bh)因为显然34>-96。
  2. 下面的程序执行后:(ax)=?
    mov ax,0 
    
    push ax 
    
    popf 
    
    mov ax,0fff0h 
    
    add ax,0010h 
    
    pushf 
    
    pop ax 
    
    and al,11000101B 
    
    and ah,00001000B 
    
    解:(ax)=0045h

十二、内中断

知识点总结:

  1. 中断的意思是 指,CPU不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息。
  2. 中断信息。
    除法错误;中断类型码为:0
    单步执行;中断类型码为:1
    执行into指令;中断类型码为:4
    执行int指令。中断类型码为:n
  3. 8086CPU用称为中断类型码的数据来标识中断信息的来源。中断类型码为一个字节型数据,可以表示256种中断信息的来源
  4. 执行int指令,该指令的格式为int n,指令中的n为字节型立即数,是提供给 CPU的中断类型码。
  5. 用来处理中断信息的程序被称为中断处理程序
  6. 中断类型码的作用就是用来定位中断处理程序
  7. CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址
  8. CPU只要知道了中断类型码,就可以将中断类型码作为中断向量表的表项号,定位相应的表项,从而得到中断处理程序的入口地址
  9. 8086CPU中断向量表必须放在0000:0000〜0000:03FF单元中
  10. 用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的。CPU硬件完成这个工作的过程被称为中断过程
  11. 中断过程。
    (1) (从中断信息中)取得中断类型码;
    (2) 标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保 存在栈中);
    (3) 设置标志寄存器的第8位TF和第9位IF的值为0(这一步的目的后面将介绍);
    (4) CS的内容入栈;
    (5) IP的内容入栈;
    (6) 从内存地址为中断类型码*4和中断类型码 *4+2的两个字单元中读取中断处理程 序的入口地址设置IP和CS。
  12. iret指令的功能用汇编语法描述为:
    pop IP pop CS popf

易错题:

  1. 用 Debug 查看内存,情况如下:
    0000:0000 68 10 A7 00 8B 01 70 00-16 00 9D 03 8B 01 70 00
    则 3 号中断源对应的中断处理程序的入口地址为:0070:018B 。
  2. 存储 N 号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为:4N 。 存储 N 号中断源对应的中断处理程序入口的段地址的内存单元的地址为:4N+2 。
  3. 考虑改变一下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指令

知识点总结:

  1. int指令的格式为:int n, n为中断类型码,它的功能是引发中断过程。
  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值