《汇编语言讲》PPT课件.ppt
《《汇编语言讲》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《汇编语言讲》PPT课件.ppt(154页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第11章 标志寄存器 章节分布n11.1 ZF标志n11.2 PF标志n11.3 SF标志n11.4 CF标志n11.5 OF标志n11.6 adc指令n11.7 sbb指令n11.8 cmp指令n11.9 检测比较结果的条件转移指令n11.10 DF标志和串传送指令n11.11 pushf和popfn11.12 标志寄存器在Debug中的表示引言n8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。n我们己经使用过8086CPU的ax、bx、cx、dx、si、di、bp、sp、ip、cs、ss、ds、es等13个寄存器了。n本章中的标志寄存器(以下简称为flag
2、)是我们要学习的最后一个寄存器。引言nflag 和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。n而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。引言n8086CPU的flag寄存器的结构:nflag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何含义。而0、2、4、6、7、8、9、10、11位都具有特殊的含义。11.1 ZF标志nflag的第6位是ZF,零标志位。它记录相关指令执行后,n结果为0,ZF=1n结果不为0,ZF=0n示例11.1 ZF标志n比如:mov ax,1 sub ax,1 指令执行
3、后,结果为0,则ZF=1。mov ax,2 sub ax,1 指令执行后,结果为1,则ZF=0。11.1 ZF标志n对于ZF的值,我们可以这样来看,ZF标记相关指令的计算结果是否为0,如果为0,则在ZF要记录下“是0”这样的肯定信息。n在计算机中1 表示逻辑真,表示肯定,所以当结果为0的时候 ZF=1,表示“结果是0”。如果结果不为0,则ZF要记录下“不是0”这样的否定信息。n在计算机中0表示逻辑假,表示否定,所以当结果不为0 的时候ZF=0,表示“结果不是0”。n示例11.1 ZF标志n示例 指令:mov ax,1 and ax,0 执行后,结果为0,则ZF=1,表示“结果是0”。指令:mo
4、v ax,1 or ax,0 执行后,结果不为0,则ZF=0,表示“结果非0”。11.1 ZF标志n注意:在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令(进行逻辑或算术运算);有的指令的执行对标志寄存器没有影响,比如:mov、push、pop等,它们大都是传送指令。11.1 ZF标志n注意:我们在使用一条指令的时候,要注意这条指令的全部功能,其中包括,执行结果对标记寄存器的哪些标志位造成影响。11.2 PF标志nflag的第2位是PF,奇偶标志位。它记录指令执行后,结果的所有二进制位中1的个数:n为
5、偶数,PF=1;n为奇数,PF=0。n示例11.2 PF标志n示例n指令:mov al,1 add al,10 执行后,结果为00001011B,其中有3(奇数)个1,则PF=0;n指令:mov al,1 or al,2 执行后,结果为00000011B,其中有2(偶数)个1,则PF=1;11.3 SF标志nflag的第7位是SF,符号标志位。它记录指令执行后,n结果为负,SF=1;n结果为正,SF=0。n有符号数与补码n示例 mov al,10000001B add al,1 结果:(al)=10000010B11.3 SF标志n我们可以将add指令进行的运算当作无符号数的运算,那么add指
6、令相当于计算129+1,结果为130(10000010B);n也可以将add指令进行的运算当作有符号数的运算,那么add指令相当于计算-127+1,结果为-126(10000010B)。11.3 SF标志n不管我们如何看待,CPU 在执行add等指令的时候,就已经包含了两种含义,也将得到用同一种信息来记录的两种结果。n关键在于我们的程序需要哪一种结果。11.3 SF标志nSF 标志,就是CPU对有符号数运算结果的一种记录,它记录数据的正负。在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。n如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。11.
7、3 SF标志n这也就是说,CPU在执行 add 等指令时,是必然要影响到SF标志位的值的。n至于我们需不需要这种影响,那就看我们如何看待指令所进行的运算了。11.3 SF标志n比如:mov al,10000001B add al,1 执行后,结果为10000010B,SF=1,表示:如果指令进行的是有符号数运算,那么结果为负;11.3 SF标志n再比如:mov al,10000001B add al,01111111B 执行后,结果为0,SF=0,表示:如果指令进行的是有符号数运算,那么结果为非负。11.3 SF标志n某些指令将影响标志寄存器中的多个标志位,这些被影响的标志位比较全面地记录了指
8、令的执行结果,为相关的处理提供了所需的依据。n比如指令sub al,al执行后,ZF、PF、SF等标志位都要受到影响,它们分别为:1、1、0。特别提示n检测点11.1(p216)n没有完成此检测点,请不要向下进行。11.4 CF标志nflag的第0位是CF,进位标志位。n一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。11.4 CF标志n对于位数为N的无符号数来说,其对应的二进制信息的最高位,即第N-1位,的最高有效位,而假想存在的第N位,就是相对于最高有效位的更高位。11.4 CF标志n我们知道,当两个数据相加的时候,有可能产生从最高有
9、效位向更高位的进位。n比如,两个8 位数据:98H+98H,将产生进位。由于这个进位值在8位数中无法保存,我们在前面的课程中,就只是简单地说这个进位值丢失了。11.4 CF标志n其实CPU在运算的时候,并不丢弃这个进位值,而是记录在一个特殊的寄存器的某一位上。n8086CPU 就用flag的CF位来记录这个进位值。11.4 CF标志n比如,下面的指令:mov al,98H add al,al ;执行后:(al)=30H,CF=1,;CF记录了最高有效位向更高位的进位值11.4 CF标志n而当两个数据做减法的时候,有可能向更高位借位。n比如,两个 8 位数据:97H-98H,将产生借位,借位后,
10、相当于计算197H-98H。而flag的CF位也可以用来记录这个借位值。11.5 OF标志n我们先来谈谈溢出的问题。在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。n那么,什么是机器所能表示的范围呢?11.5 OF标志n比如说,指令运算的结果用 8 位寄存器或内存单元来存放。n比如:add al,3,那么对于 8 位的有符号数据,机器所能表示的范围就是-128127。同理,对于16 位有符号数,机器所能表示的范围是-3276832767。11.5 OF标志n如果运算结果超出了机器所能表达的范围,将产生溢出。n注意,这里所讲的溢出,只是对有符号数运算而言。n下面我们看两个溢出的
11、例子。11.5 OF标志n示例指令 mov al,98 add al,99 执行后将产生溢出。因为add al,99 进行的有符号数运算是:(al)=(al)+99=98+99=197 而结果197超出了机器所能表示的8位有符号数的范围:-128127。11.5 OF标志n示例指令:mov al,0F0H;0F0H,为有符号数-16的补码 add al,88H ;88H,为有符号数-120的补码 执行后将产生溢出。因为add al,88H进行的有符号数运算是:(al)=(al)+(-120)=(-16)+(-120)=-136 而结果-136超出了机器所能表示的8位有符号数的范围:-12812
12、7。11.5 OF标志n如果在进行有符号数运算时发生溢出,那么运算的结果将不正确。n就上面的两个例子来说:mov al,98 add al,99 add指令运算的结果是(al)=0C5H,因为进行的是有符号数运算,所以 al中存储的是有符号数,而0C5H是有符号数-59的补码。11.5 OF标志n如果我们用add 指令进行的是有符号数运算,则98+99=-59这样的结果让人无法接受。n造成这种情况的原因,就是实际的结果 197,作为一个有符号数,在 8 位寄存器al中存放不下。11.5 OF标志n同样,对于:mov al,0F0H;0F0H,为有符号数-16的补码add al,88H ;88H
13、,为有符号数-120的补码 add指令运算的结果是(al)=78H,因为进行的是有符号数运算,所以 al中存储的是有符号数,而78H表示有符号数120。11.5 OF标志n如果我们用add 指令进行的是有符号数运算,则-16-120=120这样的结果显然不正确。n造成这种情况的原因,就是实际的结果 -136,作为一个有符号数,在 8位寄存器al中存放不下。11.5 OF标志n由于在进行有符号数运算时,可能发生溢出而造成结果的错误。则CPU需要对指令执行后是否产生溢出进行记录。nflag的第11位是OF,溢出标志位。11.5 OF标志n一般情况下,OF记录了有符号数运算的结果是否发生了溢出。n如
14、果发生溢出,OF=1,n如果没有,OF=0。11.5 OF标志n一定要注意CF和OF的区别:CF是对无符号数运算有意义的标志位;而OF是对有符号数运算有意义的标志位。11.5 OF标志n比如:mov al,98 add al,99 add指令执行后:CF=0,OF=1。n前面我们讲过,CPU在执行add等指令的时候,就包含了两种含义:无符号数运算和有符号数运算。11.5 OF标志n对于无符号数运算,CPU用CF位来记录是否产生了进位;n对于有符号数运算,CPU 用 OF 位来记录是否产生了溢出,当然,还要用SF位来记录结果的符号。11.5 OF标志n对于无符号数运算,98+99没有进位,CF=
15、0;n对于有符号数运算,98+99发生溢出,OF=1。11.5 OF标志 mov al,0F0H add al,88H add指令执行后:CF=1,OF=1。n对于无符号数运算,0F0H+88H有进位,CF=1;n对于有符号数运算,0F0H+88H发生溢出,OF=1。11.5 OF标志 mov al,0F0H add al,78H add指令执行后:CF=1,OF=0。n对于无符号运算,0F0H+78H有进位,CF=1;n对于有符号数运算,0F0H+78H不发生溢出,OF=0。11.5 OF标志n我们可以看出,CF 和OF 所表示的进位和溢出,是分别对无符号数和有符号数运算而言的,它们之间没有
16、任何关系。特别提示n检测点11.2(page219)n没有完成此检测点,请不要向下进行。11.6 adc指令nadc是带进位加法指令,它利用了CF位上记录的进位值。n格式:adc 操作对象1,操作对象2n功能:操作对象1=操作对象1+操作对象2+CFn比如:adc ax,bx 实现的功能是:(ax)=(ax)+(bx)+CFnadc指令执行过程演示11.6 adc指令nadc指令示例(一)nmov ax,2 mov bx,1 sub bx,ax adc ax,l 执行后,(ax)=4。adc执行时,相当于计算:(ax)+1+CF=2+1+1=4。11.6 adc指令nadc指令示例(二)nmo
17、v ax,1 add ax,ax adc ax,3 执行后,(ax)=5。adc执行时,相当于计算:(ax)+3+CF=2+3+0=5。11.6 adc指令nadc指令示例(三)nmov al,98H add al,aladc al,3 执行后,(ax)=34H。adc执行时,相当于计算:(ax)+3+CF=30H+3+1=34H。11.6 adc指令n可以看出,adc指令比add指令多加了一个CF位的值。为什么要加上CF的值呢?CPU为什么要提供这样一条指令呢?n我们先来看一下CF的值的含义。11.6 adc指令n在执行 adc 指令的时候加上的 CF 的值的含义,由 adc指令前面的指令决
18、定的,也就是说,关键在于所加上的CF值是被什么指令设置的。n显然,如果CF 的值是被sub指令设置的,那么它的含义就是借位值;如果是被add指令设置的,那么它的含义就是进位值。11.6 adc指令n我们来看一下两个数据:0198H和0183H如何相加的:01 98+01 83 1 -03 1B 可以看出,加法可以分两步来进行:n(1)低位相加;n(2)高位相加再加上低位相加产生的进位值。11.6 adc指令n下面的指令和add ax,bx具有相同的结果:add al,bl adc ah,bh 看来CPU提供 adc 指令的目的,就是来进行加法的第二步运算的。nadc指令和add指令相配合就可以
19、对更大的数据进行加法运算。11.6 adc指令n编程计算1EF000H+201000H,结果放在ax(高16位)和bx(低16位)中。分析11.6 adc指令n分析:因为两个数据的位数都大于16,用add 指令无法进行计算。我们将计算分两步进行,先将低16位相加,然后将高 16 位和进位值相加。程序如下11.6 adc指令n程序:mov ax,001EH mov bx,0F000H add bx,1000H adc ax,0020H adc 指令执行后,也可能产生进位值,所以也会对CF位进行设置。11.6 adc指令n由于有这样的功能,我们就可以对任意大的数据进行加法运算。n看一个例子11.6
20、 adc指令n编程计算 1EF0001000H+2010001EF0H,结果放在ax(高16位),bx(次高16位),cx(低16位)中。分析 11.6 adc指令n分析:计算分3步进行:n(1)先将低16位相加,完成后,CF 中记录本次相加的进位值;n(2)再将次高16位和 CF(来自低16位的进位值)相加,完成后,CF中记录本次相加的进位值;n(3)最后高16 位和CF(来自次高16位的进位值)相加,完成后,CF中记录本次相加的进位值。11.6 adc指令n程序代码 mov ax,001EH mov bx,0F000H mov cx,1000H add cx,1EF0H adc bx,10
21、00H adc ax,0020H11.6 adc指令n下面我们,编写一个子程序,对两个128位数据进行相加。n名称:add128n功能:两个128位数据进行相加n参数11.6 adc指令n参数:nds:si指向存储第一个数的内存空间,因数据为128位,所以需要8个字单元,由低地址单元到高地址单元依次存放 128位数据由低到高的各个字。运算结果存储在第一个数的存储空间中。nds:di指向存储第二个数的内存空间n程序代码 思考11.6 adc指令n思考:inc和loop指令不影响CF位,上面的程序中,能不能将4个inc指令,用:add si,2 add si,2 取代?11.7 sbb指令nsbb
22、是带错位减法指令,它利用了CF位上记录的借位值。n格式:sbb 操作对象1,操作对象2n功能:操作对象1=操作对象1操作对象2CFn比如:sbb ax,bx 实现功能:(ax)=(ax)(bx)CF11.7 sbb指令nsbb指令执行后,将对CF进行设置。n利用sbb指令我们可以对任意大的数据进行减法运算。11.7 sbb指令n比如,计算003E100OH00202000H,结果放在ax,bx中,程序如下:mov bx,1000H mov ax,003EH sub bx,2000H sbb ax,0020H11.7 sbb指令nsbb和adc是基于同样的思想设计的两条指令,在应用思路上和adc
23、类似。在这里,我们就不再进行过多的讨论。n通过学习这两条指令,我们可以进一步领会一下标志寄存器CF位的作用和意义。11.8 cmp指令ncmp 是比较指令,功能相当于减法指令,只是不保存结果。ncmp 指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。11.8 cmp指令ncmp指令n格式:cmp 操作对象1,操作对象2n功能:计算操作对象1操作对象2 但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。11.8 cmp指令n比如:cmp ax,ax 做(ax)(ax)的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位。指令执行后:Z
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言讲 汇编语言 PPT 课件
限制150内