汇编学习笔记第11~13章:标志寄存器-内中断-int指令

第十一章 标志寄存器

1、8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)
2、8086CPU的flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何含义。而0、2、4、6、7、8、9、10、11位都具有特殊的含义
3、flag的第6位是ZF,零标志位。它记录相关指令执行后,结果为0 ,ZF = 1,结果不为0,ZF = 0。
4、在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令(进行逻辑或算术运算);有的指令的执行对标志寄存器没有影响,比如:mov、push、pop等,它们大都是传送指令。
5、flag的第2位是PF,奇偶标志位。它记录指令执行后,结果的所有二进制位中1的个数:为偶数,PF = 1;为奇数,PF = 0。
6、flag的第7位是SF,符号标志位。它记录指令执行后,结果为负,SF = 1;结果为正,SF = 0。
7、flag的第0位是CF,进位标志位。一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
8、OF溢出标志,在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。
9、进位只是对于无符号数而言,溢出只是对于有符号数而言。一定要注意CF和OF的区别:CF是对无符号数运算有意义的标志位;而OF是对有符号数运算有意义的标志位。对于无符号数,CPU用CF位来记录是否产生了进位,对于有符号数,CPU用OF来记录是否产生了溢出,当然,还是要用SF位来记录结果的符号。
10、adc是带进位加法指令,它利用了CF位上记录的进位值。"adc 操作对象1,操作对象2"表示"操作对象1=操作对象1+操作对象2+CF",如:"adc ax,bx"运算结果表示:(ax)=(ax)+(bx)+CF。
11、在执行adc 指令的时候加上的CF 的值的含义,由adc指令前面的指令决定的,也就是说,关键在于所加上的CF值是被什么指令设置的。显然,如果CF 的值是被sub指令设置的,那么它的含义就是借位值;如果是被add指令设置的,那么它的含义就是进位值。
12、sbb是带借位减法指令,它利用了CF位上记录的借位值。"sbb 操作对象1,操作对象2"表示"操作对象1=操作对象1–操作对象2–CF",如:"sbb ax,bx"运算结果表示:(ax) = (ax) –(bx) –CF。
13、sbb指令执行后,将对CF进行设置,利用sbb指令我们可以对任意大的数据进行减法运算。
14、cmp 是比较指令,功能相当于减法指令,只是不保存结果。cmp 指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
15、"cmp 操作对象1,操作对象2"表示计算"操作对象1–操作对象2"但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。
16、"cmp ax,ax",做(ax)–(ax)的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位。指令执行后:ZF=1,PF=1,SF=0,CF=0,OF=0。
17、对于有符号数的比较,由于可能出现数值溢出,因此在考虑SF的同时,还得考虑OF。只要OF位1,则实际结果和逻辑上从SF处得出的结果恰恰相反。
18、因为cmp 指令可以同时进行两种比较,无符号数比较和有符号数比较,所以根据cmp 指令的比较结果进行转移的指令也分为两种,即:
    a、根据无符号数的比较结果进行转移的条件转移指令,它们检测ZF、CF的值;
    b、和根据有符号数的比较结果进行转移的条件转移指令,它们检测SF、OF和ZF的值。
19、cmp指令进行无符号比较时候的相关跳转指令以及它们所检测的标志位:
    a、je,等于则转移,观察ZF位是否为0,e=equal,je检测的是ZF位置,不管je 前面是什么指令,只要CPU执行je指令时,ZF=1,那么就会发生转移。
    b、jne,不等于则转移,观察ZF位是否为1,ne=not equal
    c、jb,小于则转移,观察CF位是否为1,b=below
    d、jnb,不小于(大于等于)则转移,观察CF位是否为0,nb=not below
    e、ja,大于则转移,观察CF是否为0,而且ZF也为0,a=above
    f、jnz,不大于(小于等于)则转移,观察CF是否为1,或者ZF是否为1,na=not above
20、flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si,di的增减。
    a、DF = 0:每次操作后si,di递增;
    b、DF = 1:每次操作后si,di递减。
21、movsb指令,move string by byte,是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器DF位的值,将si和di递增或递减。具体如下:
    a、(es)×16 + (di)) = ((ds) ×16 + (si)),将ds:[si]中存储的字以字节为单位传送到es:[di]中。
    b、传送完成后,如果DF = 0则:(si)=(si)+1,(di)=(di)+1,如果DF = 1则:(si)=(si)-1,(di)=(di)-1。
22、movsw:move string by word,以字为单元传送。将ds:si指向的内存字单元中word送入es:di中,然后根据标志寄存器DF位的值,将si和di递增2或递减2。
23、一般来说,movsb 和movsw 都和rep配合使用,例如:"rep movsb"表示根据cx中的值重复执行movsb多少次,"rep movsw"一样的。
24、8086CPU提供下而两条指令对DF位进行设置,cld指令(clear DF):将标志寄存器的DF位置0,std指令(set DF):将标志寄存器的DF位置1。
25、pushf:将标志寄存器的值压栈;popf:从栈中弹出数据,送入标志寄存器中。pushf和popf,为直接访问标志寄存器提供了一种方法。

第十二章 内中断

1、中断时CPU处理外部突发事件的一种重要技术。
2、中断可分为硬件中断和软件中断,硬件中断又分为外部中断和内部中断。
3、CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。
4、中断向量表在内存中存放,对于8086PC机,中断向量表指定放在内存地址0处。
5、8086CPU的中断过程:
    a、取得中断类型码N:(从中断信息中)取得中断类型码;
    b、pushf:标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中);
    c、TF = 0,IF = 0:设置标志寄存器的第8位TF 和第9位IF的值为0;TF设置为0,表示不是单步中断,IF设置为0,表示在进入中断处理程序后,禁止其他的可屏蔽的外中断。
    d、push CS:CS的内容入栈;
    e、push IP:IP的内容入栈;
    f、(IP) = (N*4),(CS) = (N*4+2):从内存地址为中断类型码*4 和中断类型码*4+2 的两个字单元中读取中断处理程序的入口地址设置IP和CS。
6、中断处理程序的编写方法和子程序的比较相似,下面是常规的步骤:
    a、保存用到的寄存器。
    b、处理中断。
    c、恢复用到的寄存器。
    d、用iret 指令返回。
7、iret指令的功能用汇编语法描述为:
    a、pop IP
    b、pop CS
    c、popf
8、单步中断:CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。单步中断的中断类型码为1,则它所引发的中断过程如下:
    a、取得中断类型码1;
    b、pushf:标志寄存器入栈。
    d、TF = 0,IF = 0:TF、IF设置为0;防止在执行中断处理程序的过程中再次出现单步中断。
    e、push CS, push IP:CS、IP入栈;
    f、(IP)=(1*4),(CS)=(1*4+2)。

第十三章 int指令

1、int格式:"int n",n为中断类型码。它的功能是引发中断过程。CPU 执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下:
    a、取中断类型码n;
    b、pushf:标志寄存器入栈,IF = 0,TF = 0;
    c、push CS, push IP, CS、IP入栈;
    d、(IP) = (n*4),(CS) = (n*4+2)。
    从此处转去执行n号中断的中断处理程序。
2、int指令的最终功能和call指令相似,都是调用一段程序。只是int指令调用的是中断处理子程序,而call指令调用的是普通子程序。
3、iret指令的功能用汇编语法描述为:
    a、pop IP,将IP出栈恢复
    b、pop CS,将CS出栈恢复
    c、popf,将标识寄存器出栈恢复
4、int指令和iret指令的配合使用与call指令和ret指令的配合使用有异曲同工之妙。
5、BIOS和DOS中断例程的安装过程:
    a、开机后,CPU 一加电,初始化(CS)=0FFFFH,(IP)=0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条转跳指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。
    b、初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。
    c、硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交由操作系统控制。
    d、DOS启动后,除完成其它工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。
6、一般来说,一个供程序员调用的中断例程中往往包括多个子程序,中断例程内部用传递进来的参数来决定执行哪个子程序。BIOS和DOS提供的中断例程,都用ah来传递内部子程序的编号。
7、int 21中断例程的4ch号功能,即程序返回功能,如下:
    a、mov ah,4ch ;程序返回
    b、mov al,0 ;返回值0
    c、int 21h ;执行21h中断例程的4ch号子程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值