汇编11标志寄存器课件_第1页
汇编11标志寄存器课件_第2页
汇编11标志寄存器课件_第3页
汇编11标志寄存器课件_第4页
汇编11标志寄存器课件_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章标志寄存器 11.1ZF标志11.2PF标志11.3SF标志11.4CF标志11.5OF标志11.6adc指令11.7sbb指令11.8cmp指令11.9检测比较结果的条件转移指令11.10DF标志和串传送指令11.11pushf和popf11.12标志寄存器在Debug中的表示引言8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。我们己经使用过8086CPU的ax、bx、cx、dx、si、di、bp、sp、ip、cs、ss、ds、es等13个寄存器了。本章中的标志寄存器(以下简称为flag)是我们要学习的最后一个寄存器。引言flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。11.1ZF标志flag的第6位是ZF,零标志位。它记录相关指令执行后,结果为0,ZF=1结果不为0,ZF=0示例11.1ZF标志比如:movax,1subax,1指令执行后,结果为0,则ZF=1。

movax,2subax,1指令执行后,结果为1,则ZF=0。11.1ZF标志注意:在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令(进行逻辑或算术运算);有的指令的执行对标志寄存器没有影响,比如:mov、push、pop等,它们大都是传送指令。11.2PF标志示例指令:moval,1addal,10执行后,结果为00001011B,其中有3(奇数)个1,则PF=0;指令:moval,1oral,10执行后,结果为00000011B,其中有2(偶数)个1,则PF=1;11.3SF标志flag的第7位是SF,符号标志位。它记录指令执行后,结果为负,SF=1;结果为正,SF=0。示例moval,10000001Baddal,1结果:(al)=10000010B我们可以将add指令进行的运算当作无符号数的运算,那么add指令相当于计算129+1,结果为130(10000010B);也可以将add指令进行的运算当作有符号数的运算,那么add指令相当于计算-127+1,结果为-126(10000010B)。11.3SF标志比如:moval,10000001B

addal,1执行后,结果为10000010B,SF=1,表示:如果指令进行的是有符号数运算,那么结果为负;

11.4CF标志flag的第0位是CF,进位标志位。一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。11.4CF标志对于位数为N的无符号数来说,其对应的二进制信息的最高位,即第N-1位,而假想存在的第N位,就是相对于最高有效位的更高位。11.4CF标志当两个数据相加的时候,有可能产生从最高有效位向更高位的进位。比如:98H+98H,将产生进位。由于这个进位值在8位数中无法保存,我们在前面的课程中,就只是简单地说这个进位值丢失了。11.4CF标志比如,下面的指令:

moval,98Haddal,al;执行后:(al)=30H,CF=1,;CF记录了最高有效位向更高位的进位值addal,al;执行后:(al)=30H,CF=1,;CF记录了最高有效位向更高位的进位值11.4CF标志而当两个数据做减法的时候,有可能向更高位借位。比如:97H-98H,将产生借位,借位后,相当于计算197H-98H。而flag的CF位也可以用来记录这个借位值。

11.4CF标志比如,下面的指令:

moval,98Haddal,al;执行后:(al)=30H,CF=1,;CF记录了最高有效位向更高位的进位值

addal,al;执行后:(al)=30H,CF=1,;CF记录了最高有效位向更高位的进位值11.5OF标志示例指令moval,98

addal,99执行后将产生溢出。因为addal,99进行的有符号数运算是:(al)=(al)+99=98+99=197而结果197超出了机器所能表示的8位有符号数的范围:-128~127。11.5OF标志示例指令:moval,0F0H;0F0H,为有符号数-16的补码

addal,88H;88H,为有符号数-120的补码执行后将产生溢出。因为addal,88H进行的有符号数运算是:(al)=(al)+(-120)=(-16)+(-120)=-136而结果-136超出了机器所能表示的8位有符号数的范围:-128~127。11.5OF标志如果在进行有符号数运算时发生溢出,那么运算的结果将不正确。就上面的两个例子来说:

moval,98

addal,99

add指令运算的结果是(al)=0C5H,因为进行的是有符号数运算,所以al中存储的是有符号数,而0C5H是有符号数-59的补码。11.5OF标志同样,对于:moval,0F0H;0F0H,为有符号数-16的补码

addal,88H;88H,为有符号数-120的补码add指令运算的结果是(al)=78H,因为进行的是有符号数运算,所以al中存储的是有符号数,而78H表示有符号数120。11.5OF标志由于在进行有符号数运算时,可能发生溢出而造成结果的错误。则CPU需要对指令执行后是否产生溢出进行记录。flag的第11位是OF,溢出标志位。11.5OF标志一般情况下,OF记录了有符号数运算的结果是否发生了溢出。如果发生溢出,OF=1,如果没有,OF=0。11.5OF标志比如:moval,98

addal,99add指令执行后:CF=0,OF=1。CPU在执行add等指令的时候,就包含了两种含义:无符号数运算和有符号数运算。对于无符号数运算,CPU用CF位来记录是否产生了进位;对于有符号数运算,CPU用OF位来记录是否产生了溢出11.5OF标志对于无符号数运算,98+99没有进位,CF=0;对于有符号数运算,98+99发生溢出,OF=1。

11.5OF标志moval,0F0H

addal,88H

add指令执行后:CF=1,OF=1。对于无符号数运算,0F0H+88H有进位,CF=1;对于有符号数运算,0F0H+88H发生溢出,OF=1。11.5OF标志moval,0F0H

addal,78H

add指令执行后:CF=1,OF=0。对于无符号运算,0F0H+78H有进位,CF=1;对于有符号数运算,0F0H+78H不发生溢出,OF=0。

11.5OF标志CF和OF所表示的进位和溢出,是分别对无符号数和有符号数运算而言的,它们之间没有任何关系。11.6adc指令adc是带进位加法指令,它利用了CF位上记录的进位值。格式:adc操作对象1,操作对象2功能:操作对象1=操作对象1+操作对象2+CF比如:adcax,bx实现的功能是:(ax)=(ax)+(bx)+CF11.6adc指令adc指令示例(一)movax,2

movbx,1

subbx,ax

adcax,l执行后,(ax)=4。adc执行时,相当于计算:(ax)+1+CF=2+1+1=4。11.6adc指令adc指令示例(二)movax,1

addax,ax

adcax,3执行后,(ax)=5。adc执行时,相当于计算:(ax)+3+CF=2+3+0=5。11.6adc指令adc指令示例(三)moval,98H

addal,al

adcal,3执行后,(ax)=34H。adc执行时,相当于计算:(ax)+3+CF=30H+3+1=34H。11.6adc指令编程计算1EF0001000H+2010001EF0H,结果放在ax(高16位),bx(次高16位),cx(低16位)中。

分析11.6adc指令分析:计算分3步进行:(1)先将低16位相加,完成后,CF中记录本次相加的进位值;(2)再将次高16位和CF(来自低16位的进位值)相加,完成后,CF中记录本次相加的进位值;(3)最后高16位和CF(来自次高16位的进位值)相加,完成后,CF中记录本次相加的进位值。11.6adc指令程序代码movax,001EHmovbx,0F000Hmovcx,1000Haddcx,1EF0Hadcbx,1000Hadcax,0020H11.6adc指令编写一个子程序,对两个128位数据进行相加。名称:add128功能:两个128位数据进行相加参数11.6adc指令参数:ds:si指向存储第一个数的内存空间,因数据为128位,所以需要8个字单元,由低地址单元到高地址单元依次存放128位数据由低到高的各个字。运算结果存储在第一个数的存储空间中。

ds:di指向存储第二个数的内存空间程序代码

思考11.6adc指令思考:inc和loop指令不影响CF位,上面的程序中,能不能将4个inc指令,用:addsi,2addsi,2取代?11.7sbb指令sbb是带错位减法指令,它利用了CF位上记录的借位值。格式:sbb操作对象1,操作对象2功能:操作对象1=操作对象1–操作对象2–CF比如:sbbax,bx实现功能:(ax)=(ax)–(bx)–CF11.7sbb指令sbb指令执行后,将对CF进行设置。利用sbb指令我们可以对任意大的数据进行减法运算。11.7sbb指令比如,计算003E100OH–00202000H,结果放在ax,bx中,程序如下:movbx,1000Hmovax,003EHsubbx,2000Hsubax,0020H11.8cmp指令cmp是比较指令,功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。11.8cmp指令cmp指令格式:cmp操作对象1,操作对象2功能:计算操作对象1–操作对象2但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。

11.8cmp指令比如:cmpax,ax做(ax)–(ax)的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位。指令执行后:ZF=1,PF=1,SF=0,CF=0,OF=0。11.8cmp指令下面的指令:movax,8movbx,3cmpax,bx执行后:(ax)=8,ZF=0,PF=1,SF=0,CF=0,OF=0。11.8cmp指令其实,我们通过cmp指令执行后,相关标志位的值就可以看出比较的结果。cmpax,bx11.8cmp指令现在我们可以看出比较指令的设计思路,即:通过做减法运算,影响标志寄存器,标志寄存器的相关位记录了比较的结果。11.8cmp指令指令cmpax,bx的逻辑含意是比较ax和bx中的值,如果执行后:11.8cmp指令同add、sub指令一样,CPU在执行cmp指令的时候,也包含两种含义:进行无符号数运算和进行有符号数运算。所以利用cmp指令可以对无符号数进行比较,也可以对有符号数进行比较。11.8cmp指令上面所讲的是用cmp进行无符号数比较时,相关标志位对比较结果的记录。下面我们再来看一下如果用cmp来进行有符号数比较时,CPU用哪些标志位对比较结果进行记录。11.8cmp指令以cmpah,bh为例,总结一下CPU执行cmp指令后,SF和OF的值是如何来说明比较的结果的。11.8cmp指令(1)如果SF=1,而OF=0OF=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;因SF=1,实际结果为负,所以逻辑上真正的结果为负,所以(ah)<(bh)。11.8cmp指令(2)如果SF=1,而OF=1OF=1,说明有溢出,逻辑上真正结果的正负≠实际结果的正负;因SF=1,实际结果为负,实际结果为负,而又有溢出,这说明是由于溢出导致了实际结果为负,简单分析一下,就可以看出,如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。这样,SF=1,OF=1,说明了(ah)>(bh)。11.8cmp指令(3)如果SF=0,而OF=1OF=1,说明有溢出,逻辑上真正结果的正负≠实际结果的正负;因SF=0,实际结果非负,而OF=1说明有溢出,则结果非0,所以,实际结果为正。实际结果为正,而又有溢出,这说明是由于溢出导致了实际结果非负,简单分析一下,就可以看出,如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负。这样,SF=0,OF=1,说明了(ah)<(bh)。11.8cmp指令(4)如果SF=0,而OF=0OF=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;因SF=0,实际结果非负,所以逻辑上真正的结果必然非负。所以(ah)≥(bh)。结论:

SF异或OF=1,肯定是小于的情形SF异或OF=0,是大于或者等于的情形11.8cmp指令上面,我们深入讨论了cmp指令在进行有符号数和无符号数比较时,对flag相关标志位的影响,和CPU如何通过相关的标志位来表示比较的结果。在学习中,要注意领会8086CPU这种工作机制的设计思想。实际上,这种设计思想对于各种处理机来说是普遍的。11.8cmp指令下面的内容中我们将学习一些根据cmp指令的比较结果(即,cmp指令执行后,相关标志位的值)进行工作的指令。11.9检测比较结果的条件转移指令“转移”指的是它能够修改IP,而“条件”指的是它可以根据某种条件,决定是否修改IP。比如:jcxz就是一个条件转移指令,它可以检测cx中的数值,如果(cx)=0,就修改IP,否则什么也不做。所有条件转移指令的转移位移都是[-128,127]。

11.9检测比较结果的条件转移指令除了jcxz之外,CPU还提供了其他条件转移指令,大多数条件转移指令都检测标志寄存器的相关标志位,根据检测的结果来决定是否修改IP。11.9检测比较结果的条件转移指令它们检测的是哪些标志位呢?就是被cmp指令影响的那些,表示比较结果的标志位。这些条件转移指令通常都和cmp相配合使用,就好像call和ret指令通常相配合使用一样。

11.9检测比较结果的条件转移指令因为cmp指令可以同时进行两种比较,无符号数比较和有符号数比较,所以根据cmp指令的比较结果进行转移的指令也分为两种,即:根据无符号数的比较结果进行转移的条件转移指令,它们检测ZF、CF的值;和根据有符号数的比较结果进行转移的条件转移指令,它们检测SF、OF和ZF的值。11.9检测比较结果的条件转移指令我们看一下根据无符号数的比较结果进行转移的条件转移指令。下表是常用的根据无符号数的比较结果进行转移的条件转移指令。11.9检测比较结果的条件转移指令助记:e:表示equal;ne:表示notequal;b:表示below;nb:表示notbelow;a:表示above;na:表示notabove。11.9检测比较结果的条件转移指令注意观察一下它们所检测的标志位,都是cmp指令进行无符号数比较时候,记录比较结果的标志位。比如je,检测ZF位,当ZF=1的时候进行转移,如果在je前面使用了cmp指令,那么je对ZF的检测,实际上就是间接地检测cmp的比较结果是否为两数相等。11.9检测比较结果的条件转移指令编程实现如下功能:如果(ah)=(bh)则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)。cmpah,bhjesaddah,bhjmpshortoks:addah,ahok:ret11.9检测比较结果的条件转移指令至于究竟在je之前使不使用cmp指令,在于我们的安排。je检测的是ZF位置,不管je前面是什么指令,只要CPU执行je指令时,ZF=1,那么就会发生转移。比如11.9检测比较结果的条件转移指令比如:movax,0addax,0jesincaxs:incax执行后,(ax)=1。addax,0使得ZF=1,所以je指令将进行转移。11.9检测比较结果的条件转移指令对于jne、jb、jnb、ja、jna等指令和cmp指令配合使用的思想和je相同11.9检测比较结果的条件转移指令我们来看一组程序:data段中的8个字节如下:datasegmentdb8,11,8,1,8,5,63,38dataends(1)编程:统计data段中数值为8的字节的个数,用ax保存统计结果。(2)编程:统计data段中数值大于8的字节的个数,用ax保存统计结果。(3)编程:统计data段中数值小于8的字节的个数,用ax保存统计结果。11.9检测比较结果的条件转移指令(1)编程:统计data段中数值为8的字节的个数,用ax保存统计结果。编程思路:初始设置(ax)=0,然后用循环依次比较每个字节的值,找到一个和8相等的数就将ax的值加1。程序如下另一种实现方式11.9检测比较结果的条件转移指令movax,datamovds,axmovbx,0;ds:bx指向第一个字节movax,0;初始化累加器movcx,0s:cmpbyteptr[bx],8;和8进行比较jnenext;如果不相等转到next,继续循环incax;如果相等就将计数值加1next:incbxloops;程序执行后:(ax)=311.9检测比较结果的条件转移指令movax,datamovds,axmovbx,0;ds:bx指向第一个字节movax,0;初始化累加器movcx,0s:cmpbyteptr[bx],8;和8进行比较jeok;如果相等就转到ok,继续循环jmpshortnext;如果不相等就转到next,继续循环ok:incax;如果相等就将计数值加1next:incbxloops11.9检测比较结果的条件转移指令比起第一个程序,它直接的遵循了“等于8则计数值加1”的原则,用je指令检测等于8的情况,但是没有第一个程序精简。第一个程序用jne检测不等于8的情况,从而间接地检测等于8的情况。要注意在使用cmp和条件转移指令时的这种编程思想。11.9检测比较结果的条件转移指令(2)编程:统计data段中数值大于8的字节的个数,用ax保存统计结果。编程思路:初始设置(ax)=0,然后用循环依次比较每个字节的值,找到一个大于8的数就将ax的值加1。程序如下11.9检测比较结果的条件转移指令movax,datamovds,axmovbx,0;ds:bx指向第一个字节movax,0;初始化累加器movcx,0s:cmpbyteptr[bx],8;和8进行比较jnenext;如果不大于8转到next,继续循环incax;如果大于8就将计数值加1next:incbxloops;程序执行后:(ax)=311.9检测比较结果的条件转移指令(3)编程:统计data段中数值小于8的字节的个数,用ax保存统计结果。编程思路:初始设置(ax)=0,然后用循环依次比较每个字节的值,找到一个小于8的数就将ax的值加1。程序如下11.9检测比较结果的条件转移指令movax,datamovds,axmovbx,0;ds:bx指向第一个字节movax,0;初始化累加器movcx,0s:cmpbyteptr[bx],8;和8进行比较jnbnext;如果不小于8转到next,继续循环incax;如果小于8就将计数值加1next:incbxloops;程序执行后:(ax)=211.9检测比较结果的条件转移指令上面讲解了根据无符号数的比较结果进行转移的条件转移指令。根据有符号数的比较结果进行转移的条件转移指令的工作原理和无符号的相同,只是检测了不同的标志位。11.9检测比较结果的条件转移指令我们在这里主要探讨的是cmp、标志寄存器的相关位、条件转移指令三者配合应用的原理,这个原理具有普遍性,而不是逐条讲解条件转移指令。条件转移指令—涉及单个条件标志指令 含义 检测的标志位JZ 为0转移 ZF=1JNZ 不为0转移 ZF=0JS 为负转移 SF=1JNS 为正转移 SF=0JO 溢出转移 OF=1JNO 不溢出转移 OF=0JP|JPE 为奇转移 PF=1JNP|JPO 为偶转移 PF=0JC 有进位转移 CF=1JNC 无进位转移 CF=0条件转移指令—涉及无符号数的比较指令 含义 检测的标志位JZ 相等转移 ZF=1JNZ 不相等转移 ZF=0JB 小于则转移 CF=1JNB 不小于则转移 CF=0JA 大于则转移 CF=0且ZF=0JNA 不大于则转移 CF=1或者ZF=1条件转移指令—涉及有符号数的比较指令 含义 检测的标志位JZ 相等转移 ZF=1JNZ 不相等转移 ZF=0JL 小于则转移 SF或OF=1JNL 不小于则转移 SF或OF=0JG 大于则转移 SF异或OF=0且ZF=0JNG 不大于则转移 SF异或OF=1或者ZF=111.10DF标志和串传送指令flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si,di的增减。DF=0:每次操作后si,di递增;DF=1:每次操作后si,di递减。11.10DF标志和串传送指令格式1:movsb功能:(以字节为单位传送)(1)((es)×16+(di))=((ds)×16+(si))(2)如果DF=0则:(si)=(si)+1(di)=(di)+1如果DF=1则:(si)=(si)-1(di)=(di)-111.10DF标志和串传送指令用汇编语法描述movsb的功能如下:moves:[di],byteptrds:[si]8086并不支持这样的指令。 如果DF=0:incsiincdi如果DF=1:decsidecdi11.10DF标志和串传送指令movsb的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器DF位的值,将si和di递增或递减。也可以传送一个字,movsw指令11.10DF标志和串传送指令格式2:movsw功能:(以字为单位传送)将ds:si指向的内存字单元中word送入es:di中,然后根据标志寄存器DF位的值,将si和di递增2或递减2。11.10DF标志和串传送指令用汇编语法描述movsw的功能:moves:[di],wordptrds:[si] 如果DF=0:addsi,2adddi,2如果DF=1:subsi,2subdi,211.10DF标志和串传送指令一般来说,movsb和movsw都和rep配合使用,格式如下:repmovsb

用汇编语法来描述repmovsb的功能就是:

s:movsb

loopsrepmovsw

用汇编语法来描述repmovsw的功能就是:

s:movsw

loops

11.10DF标志和串传送指令rep的作用:是根据cx的值,重复执行后面的串传送指令。由于每执行一次movsb指令si和di都会递增或递减指向后一个单元或前个单元,则repmovsb就可以循环实现(cx)个字符的传送。11.10DF标志和串传送指令flag的DF位决定着串传送指令执行后,si和di改变的方向,所以CPU应该提供相应的指令来对DF位进行设置,从而使程序员能够决定传送的方向。

11.10DF标志和串传送指令8086CPU提供下而两条指令对DF位进行设置:cld指令:将标志寄存器的DF位置0std指令:将标志寄存器的DF位置1我们来看两个程序

编程1

编程211.10DF标志和串传送指令编程:用串传送指令,将data段中的第一个字符串复制到它后面的空间中。datasegmentdb‘Welcometomasm!’db16dup(0)dataends分析11.10DF标志和串传送指令分析:使用串传送指令进行数据的传送,需要给它提供一些必要的信息,它们是:①传送的原始位置:ds:si;②传送的目的位置:es:di;③传送的长度:cx;④传送的方向:DF。

11.10DF标志和串传送指令在这个问题中,这些信息如下:①传送的原始位置:data:0;②传送的目的位置:data:16;③传送的长度:16;④传送的方向:因为正向传送(每次串传送指令执行后,si和di递增)比较方便,所以设置DF=0。程序11.10DF标志和串传送指令

movax,datamovds,axmovsi,0;ds:si指向data:0moves,axmovdi,16;es:di指向data:16movcx,16;(cx)=16,rep循环16次cld;设置DF=0,正向传送repmovsb11.10DF标志和串传送指令编程:用串传送指令,将F000H段中的最后16个字符复制到data段中。datasegmentdb16dup(0)dataends分析11.10DF标志和串传送指令我们还是先来看一下应该为串传送指令提供什么样的信息:要传送的字符串位于F000H段的最后16个单元中,那么它的最后一个字符的位置:F000:FFFF,是显而易见的。我们可以将ds:si指向F000H段的最后一个单元,将es:di指向data段中的最后一个单元,然后逆向(即从高地址向低地址)传送16个字节即可。11.10DF标志和串传送指令相关信息如下:①传送的原始位置:F000:FFFF;②传送的目的位置:data:15;③传送的长度:16;④传送的方向:因为逆向传送(每次串传送指令执行后,si和di递减)比较方便,所以设置DF=1。

程序代码11.10DF标志和串传送指令

movax,0f000hmovds,axmovsi,0ffffh;ds:si指向f000:ffffmovax,datamoves,axmovdi,15;es:di指向data:15

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论