汇编学习笔记(五)

第十章 call 和 ret 指令

call和ret指令都是转移指令,他们都修改IP或同时修改CS:IP的值

ret指令:
该指令用栈中的数据,修改IP的内容,从而实现了近转移,CPU执行ret指令时,进行下面两步操作:1.(IP)=((SS)*16 +(SP))
2.(SP) = (SP) +2   ;这里实现的具体步骤是,把同一个栈区的一个地址(可能是数据段的地址)传给IP,让CS:IP指向他,这只是实现了进转移的操作

retf 指令:实现了将CS和IP的值都改变,从而实现了远转移

用汇编解释 ret和retf就是:
ret == pop IP
retf == pop IP  pop CS

call指令经常和ret指令配合使用
call指令实现转移的方法和jmp指令的原理相同,他不能实现短转移,记住要实行成对编程,就是说有进栈,必须要有出栈

第十一章:标志寄存器

flag寄存器:flag寄存器和其他寄存器不一样,其他寄存器是用来存数据的,都是整个寄存器具有一个含义,而flag寄存器是按位起作用的,也就是说,他的每一位都有一个专门的含义,记录特定的信息,flag 的1,3,4,5,12,13,14,15位在8086CPU中没有使用,不具有任何意义,而0,2,4,6,7,8,9,10,11位都具有特殊的含义

ZF:flag的第6位是ZF(zero flag,呵呵,好容易记啊),即零标志位 他记录相关结果执行后 结果为0,ZF=1,结果不为0,ZF=0,在计算机里面,用1表示肯定,用0表示否定
例如: mov ax,1
      sub ax,1
      指令执行后结果为0,则ZF=1
 若: mov ax,2
    sub ax,1
    指令执行后结果为1,则ZF=0

注意:在8086CPU的指令集中,有的指令执行是很容易影响寄存器的值,比如 add(加),sub(减),mul(乘),div(除),inc(自增),or(或运算),and(与运算),他们大都是运算指令(也就是说CPU只会进行逻辑运算和四则算数运算,呵呵,才知道CPU的这点儿功能,但是就是一个特点:能算),还有的指令对标志寄存器一般没有影响,比如:mov,push,pop等,他们大都是传送指令

PF:flag的第2位是PF,奇偶标志位,他记录指令执行后,结果的所有二进制位中的1的个数 如果是偶数 PF =1,为奇数PF=0
例如:
  mov al,1
  add al,10
  指令执行后结果为00001011B,其中有3个1(奇数),则PF = 0
 若: mov al,1
      or  al,10
      执行后,结果为00000001B,其中有2个(偶数)1,则 PF = 1

SF: flag的第7位是SF,符号标志位,他的记录执行后,结果为负,SF = 1,结果为正,SF = 0 这个寄存器的值改变是在我们使用有符号的运算并且在结果的符号改变的时候才变,如果是进行的无符号运算,那该寄存器的值就没有意义,虽然相关的指令也影响了他的值,也就是说在执行add等指令的时候,才会影响到SF标志位的值
例如:  mov al,10000001B   ;不要迷糊哈,B是二进制的意思哈,呵呵
add al,1
执行后,结果为10000010B,SF = 1
表示:如果指令进行的是有符号运算,那么,结果就是为负

分析:某些指令执行将影响寄存器的多个标志位,这些被影响的标志位比较全面的记录了指令的执行结果,为相关的处理提供了所需的依据

第十二章 内中断

TF : 该寄存器标志位的值为1时,则产生单步中断
具体过程:1.取得中断类型码
 2.标志寄存器入栈,TF,IF设置为0
 3.CS,IP入栈

如果是设置栈的值,就会有特殊情况的中断,在CPU执行完设置ss的指令后,不响应中断,这样连续的设置ss和sp,为指向正确的栈顶提供一个时机,所以我们要将ss和sp的指令连续存放,使得设置sp的指令紧接着ss的指令执行,而在此之后,CPU不会响应中断过程
具体: 我们要将栈顶设置为1000:0
应该: mov ax,1000H
  mov ss,ax
  mov sp,0
  mov ax,0
 不应该:  
           mov ax,1000H
           mov ss,ax
           mov ax,0   ;这里不应该插在中间
           mov sp,0

第十三章 int 指令 和 BIOS 中断例程应用

中断:一般来说,一个工程员调用的中断例程中往往包括多个子程序,中断例程内部用传递进来的参数决定中断哪个子程序,BIOS和DOS提供的中断例程,都用ah来传递内部子程序的编号,实际这是内中断的问题,还有外中中断的问题

  int 10H  : mov ah,2 ;表示调用第10H好中断例程中的2号子程序

  BH中页的含义:内存地址空间中,B8000H-BFFFFH中,共32K的空间,为80*25彩色字符串模式的显示缓冲区

  分析:CPU执行int 7CH指令的中断之后,标志寄存器,当前的CS:IP被压入栈中,在执行完中断例程之后,应该用iret指令恢复int 7Ch执行前的标志寄存器和CS:IP的值,从而接着执行应用程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值