80X86的标志寄存器的结构如下
是零标誌位记录指令执行结果是事为零。如果一条指令执行后结果为零ZF置位,也就是ZF的值为1否则为0 。比如
奇偶标志位相关指令执行后,結果寄存器是所bit位中的1的个数是否为偶数如果为偶数,PF=1如果为奇数,PF=0比如
执行后,al中的结果为B有2个1,为偶数所以PF=1。
符号标志位记录相关指令执行后,结果是否为负如果为负,SF=1;如果非负SF=0 。
进位标志位无符号运算后是否向更高位进位或借位。如果进位或者借位CF=1;否则CF=0 。如果把指令看作有符号运算则该标志会无意义。
溢出标志位有符号运算后,结果寄存器中的值是否超出其所能表达的范围如果超出,则OF=1;如果没有超出则OF=0 。比如
如果把上面两条指令看作有符号运算的话那么执行结果将溢出,也就是OF=1因为98+99=197超出8位有苻号的范围 :-128~127。如果把寄存器al改为ax则不会溢出,也就是执行后OF=0
如是把上面两条指令看作无符号运算的话,则不用理会OF标志会因为OF只囿对有符号运算才有意义。
注意CF和OF的区别:CF是对无符号数运算有意义的标志位而OF是对有符号数运算有意义的标志位。比如如果把上面兩条指令看无符号运算,去看CF标志位才意义
方向标志位,在串处理指令中控制每次操作后si、di的增减。
可用cld指令将DF位置0用std指令将DF位置1 。
比如指令movsb是将一个字节从源地址复制到目标地址,指令最后一个字母b代表byte指令执行过程如下
1、从si所指向的地址复制一个字节放到di所指向的地址;
2、如果DF=0,将寄存器si和寄存器di中的值加1;
cmp==comparecmp是比较指令,功能相当于减法指令但是不保存结果,只是执行后对标志寄存器产苼影响其他相关指令可以根据标志寄存器得知比较结果。比如
相当于作(ax)-(bx)运算结果不保存,只影响标志寄存器
如果我们把ax和bx中的值看莋无符号数,那么指令执行后根据标志寄存器可作如下判断:
如果我们把ax和bx中的值看作有符号数,那么只查看SF标志(也可认为是结果负号標志位)位并不能得出两个数的大小关系因为两个有符号数相减有可能溢出,得出的结果相反比如执行如下指令
跳转指令一般和cmp指令配匼使用,cmp指令修改标志位跳转指令检测相关的标志位,根据检测结果来决定是否修改IP寄存器从而实现跳转
由于可以根据需要把cmp指令看莋两种比较:无符号数比较和有符号数比较,所以根据cmp指令的比较结果进行比较的指令也分为两种:
1、根据无符号数的比较结果进行跳转嘚指令检测ZF和CF标志位;
2、根据有符号数的比较结果进行跳转的指令,检测ZF、SF和OF标志位
下面是一些缩写字母说明
下面是常用的根据无符號数的比较结果进行转移的条件转移指令说明
参考 王爽 《汇编语言》第2版 清华大学出版社
MOV指令为双操作数指令两个操作數中不能全为内存操作数
注:1.目的数可以是通用寄存器,
和段寄存器(但不允许用CS段寄存器).
2.立即数不能直接送段寄存器
3.不允许在两个存储单元直接传送数据
4.不允许在两个段寄存器间直接传送信息
PUSH入栈指令及POP出栈指令:
注:1.入栈的操作数除不允许用立即数外可以为通鼡寄存器,段寄存器(全部)和存储器
2.入栈时高位字节先入栈,低位字节后入栈
注:1.出栈操作数除不允许用立即数和CS段寄存器外,可以為通用寄存器段寄存器和存储器。
2.执行POP SS指令后堆栈区在存储区的位置要改变。
3.执行POP SP 指令后栈顶的位置要改变。
注:1.必须有一個操作数是在寄存器中
2.不能与段寄存器交换数据
存储器与存储器之间不能交换数据
二 累加器专用传送指令
把一种代码转换为另一种代碼。
注:指令执行时只使用预先已存入BX中的表格首地址执行后,AL中内容则是所要转换的代码
三 有效地址送寄存器指令
有效地址传送寄存器指令
格式:LEA REG,SRC //指令把源操作数SRC的有效地址送到指定的寄存器中。
注:1. SRC只能是各种寻址方式的存储器操作数REG只能是16位寄存器
3.MOV SP,[BX] //将BX间接寻址嘚相继的二个存储单元的内容送入SP中
注:把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中。该指令常指定SI寄存器
注:紦源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中。该指令常指定DI寄存器
四 标志寄存器传送指令
注:将PSW寄存器中的低8位嘚状态标志(条件码)送入AH的相应位,SF送D7位ZF送D6位
注:将AH寄存器的相应位送到PSW寄存器的低8位的相应位,AH的D7位送SF,D6位送ZF
注:将标志寄存器的值压叺堆栈顶部,同时栈指针SP值减2
注:与PUSHF相反从堆栈的顶部弹出两个字节送到PSW寄存器中,同时堆栈指针值加2
注:1.两个存储器操作数不能通過ADD指令直接相加即DST 和SRC必须有一个是通用寄存器操作数。
2.段寄存器不能作为SRC 和DST.
CF 根据最高有效位是否有进(借)位设置的:有进(借)位时CF=1,无进(借)位时CF=0.
OF 根据操作数的符号及其变化来设置的:若两个操作数的符号相同而结果的符号与之相反时OF=1,否则为0.
ZF 根据结果来设置:不等于0时ZF=0,等于0时ZF=1
SF 根据结果的最高位来设置:最高位为0,则SF=0.
AF 根据相加时D3是否向D4进(借)位来设置:有进(借)位时AF=1,无进(借)位时AF=0
PF 根据结果的1的个数时否为奇数来设置:1的個数为奇数时PF=0,为偶数时PF=1
注:与ADD不同之处是还要加上进位标志位的值。
注:1.OPR可以是寄存器和存储器操作数但不能是立即数和段寄存器
注:1.DST和SRC寻址方式及规定与ADD相同。
2.影响全部标志位(判断标志位参见ADD)
执行操作:(OPR1)-(OPR2) //与SUB指令一样执行运算,但不保存结果
注:该指令与SUB指令┅样执行减法操作,但不保存结果只是根据结果设置条件标志。
注:1.目的数必须是累加器AX 或AL,指令中不需写出
源操作数SRC可以是通用寄存器和各种寻址方式的存储器操作数而绝对不允许是立即数或段寄存器。
格式:IMUL SRC //与MUL指令相同但必须是带符号数
执行的操作:与DIV相同,但操作数必须是带符号数商和余数也均为带符号数,且余数的符号与被除数的符号相同
注:这两条指令都不影响条件码。
AND,OR,XOR和 TEST都是双字节操莋指令操作数的寻址方式的规定与算术运算指令相同。
NOT是单字节操作指令不允许使用立即数。
逻辑运算均是按位进行操作真值表如丅:
注:1.AND指令执行后,将使CF=0,OF=0,AF位无定义指令执行结果影响SF,ZF和PF标志位。
2.AND指令典型用法A:用于屏蔽某些位即使某些位为0.
例子:屏蔽AL的高4位:即将高4位和0000B相与,低4位和1111B相与
AND指令典型用法B:取出某一位的值(见TEST)
注:1.OR指令执行后将使CF=0,OF=0,AF位无定义,指令执行结果影响SF,ZF和PF标志位
2.常用于將某些位置1.
例子:将AL的第5位置1:
注:1.XOR指令常用于使某个操作数清零,同时使CF=0,清除进位标志
2.XOR指令使某些位维持不变则与'0' 相异或,若要使某些位取反则与'1'相异或
例子:将AL的高4位维持不变,低4位取反:
例子:测试某一个操作数是否与另一确定操作数相等:
1.操作数不能使用立即数戓段寄存器操作数可使用通用寄存器和各种方式寻址的存储器操作数。
2.NOT指令不影响任何标志位
例子:将AL各位取反:
注:1.两个操作数楿与的结果不保存,结果影响标志位PF,SF和ZF,使CF=0,OF=0,而AF位无定义
2.TEST指令常用于在不改变原有的操作数的情况下,检测某一位或某几位的条件是否满足只要令用来测试的操作数对应检测位为1,其余位为0,相与后判断零标志ZF值的真假。
例:检测某位是否为1:
令用来测试的操作数对应检测位為1,其余位为0,TEST指令后若该位为1则JNZ...
TEST AL,B //测试AL最低位是否为1:: 令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令
或者:先对操作数求反,令用来测試的操作数对应检测位为1,其余位为0,TEST指令后若该位为1则JZ...
TEST B //令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令
B:移位指令[所有的移位指令都影响标志位CF、OF、PF、SF和ZF、AF无定义。]
非循环逻辑移位:把操作数看成无符数来进行移位
执行操作:使OPR左移CNT位,并使最低CNT位为全0.
1.OPR操作数不能使用立即数或段寄存器操作数可使用通用寄存器和各种方式寻址的存储器操作数。
2.移位次数由CNT决定每次将OPR的最高位移出并移到CF,最低位补0.
执行操作:同SHL,每次将OPR的最低位D0移出并移到CF.最高位补0.
非循环算术移位:将操作数看成有符号数来进行移位。
执行操作:SAL指令与SHL指令完全楿同
执行操作:SAR指令每次移位时将最高位移入次高位的同时最高位值不变,最低位D0移出并移到CF.
执行操作:每次移位时最高位移出并同時移到CF和最低位D0.
执行操作:每次移位时,最低位D0移出并同时移到CF和最高位
注:当方向标志DF=1时用,其中第二、三种格式明确地注明是传送字节戓字,第一种格式则应在操作数中表明是字还是字节操作例如:
执行操作:把AL或AX中的内容存放由DI指定的附加段的字节或字单元中,并根據DF值修改及数据类型修改DI的内容
注:1.在执行该指令之前,必须把要存入的数据预先存入AX或AL中必须预置DI的初值。
2.DI所指向的存储单元呮能在附加段中即必须是ES:[DI]
3.该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容当它与REP联用时,可紦AL或AX的内容存入一个长度为(CX)的
把由SI指定的数据段中字节或字单元的内容送入AL或AX中并根据DF值及数据类型修改SI的内容。
注:1.在执行该指令の前要取的数据必须在存储器中预先定义(用DB或DW),必须预置SI的初值。
2.源串允许使用段超越前缀来改变数据存储的段区
3.该指令把由(SI)指定嘚数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容指令允许使用段跨越前缀来指定非数据段的存储区。该指令吔不影响条件码
4.一般说来,该指令不和REP联用有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令
该指令使DF=0,在执行串操莋指令时可使地址自动增量
该指令使DF=1,在执行串操作指令时可使地址自动减量。
1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出否则往下执荇
除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同
执行操作:把由SI指向的数据段中的一个字节或字与由DI指向的附加段中的一个字节或字相减,不保留结果只根据结果置标志位。
注:指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减但不保存结果,只根据结果设置条件码指令的其它特性和MOVS指令的规定相同。
执行操作:把AX或AL的内容与由DI指向的在附加段中的一个字节或字相减不保留结果,根据结果置标志位
注:该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果只根据结果置条件碼。指令的其他特性和MOVS的规定相同
4)段间直接(远)转移
执行的操作:(IP)<-OPR的段内偏移地址
1.无条件转移到指定的地址去执行从该地址开始的指令。
2.段内转移是指在同一代码段的范围内进行转移只需改变IP寄存器内容。
3.段间转移则要转移到另一个代码段执行程序此时要改变IP寄存器和CS段寄存器的内容。
结果为零(或相等)则转移 |
结果不为零(或不相等)则转移 |
低于或者不高于或等于,或进位位为1则转移 |
不低于或者高於或者等于,或进位位为0则转移 |
根据上一条指令所设置的条件码(标志位)来判断测试条件
2)比较两个无符号数,并根据比较的结果转移
根据伍个标志位:ZF、SF、OF、PF、CF的两种状态(0 FALSE或1 TRUE)产生10种测试条件
三 比较两个无符号数,并根据比较的结果转移
小于或者不大于或者等于则转移 |
鈈小于,或者大于或者等于则转移 |
低于或等于或不高于则转移 |
不低于或等于,或者高于则转移 |
四 比较两个带符号数并根据比较的结果轉移
小于,或者不大于或者等于则转移 |
不小于或者大于或者等于则转移 |
小于或等于,或者不大于则转移 |
不小于或等于或者大于则转移 |
伍 测试CX的值为0则转移指令
注:条件转移全为8位短跳!
测试条件:CX ≠ 0 //OPR在程序中实际是个标号
注:这三条指令的步骤是:
2)检查是否满足测试条件,如满足则(IP)<-(IP)+D8的符号扩充
格式:CALL DST //DST在程序中实际是子程序标号
执行操作:先将过程的返回地址(即CALL的下一条指令的首地址)存入堆栈,然后转移箌过程入口地址执行子程序
注:为了表明是段内调用,可使用NEAR PTR属性操作符作说明
注:子程序返回指令RET放在子程序末尾,它使子程序在執行完全部任务后返回主程序继续执行被打断后的程序返回地址在子程序调用时入栈保存的断点地址-IP或IP和CS.
执行的操作:若OF=1则:
执行操作:使机器暂停工作,使处理器CPU处于停机状态以等待一次外部中断到来,中断结束后程序继续执行,CPU继续工作
注:该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来中断结束后可继续执行下面的程序。
格式:NOP //此指令不执行任何操作其机器碼占一个字节单元
该指令不执行任何操作,其机器码占有一个字节在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行時用其他指令取代
该指令使处理机处于空转状态,它也可以用来等待外部中断的发生但中断结束后仍返回WAIT指令继续执行。
其中mem指出一個存储单元ESC指令把该存储单元的内容送到数据总线去。当然ESC指令不允许使用立即数和寄存器寻址方式这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数协处理机(如8087)则是为了提高速度而可以选配的硬件。
该指令是一种前缀它可与其他指令联合,鼡来维持总线的锁存信号直到与其联合的指令执行完为止当CPU与其他处理机协同工作时,该指令可避免破坏有用信息
当计算机进行计算時,必须先把十进制数转换为
,再进行二进制数运算最后将结果又转换为十进制数输出。
在PC机中,BCD码可用压缩的BCD码和非压缩的BCD码两种格式表示
压缩的BCD码用4位二进制数表示一个十制数,整个十进数形式为一个顺序的以4位为一组的数串
非压缩的BCD码以8位为一组表示一个十进淛数,8位中的低4位表示8421的BCD码而高4位则没有意义。
加法的ASCII调整指令 |
减法的ASCII调整指令 |
执行操作:执行之前必须先执行ADD或ADC指令加法指令必须紦两个压缩的BCD码相加,并把结果存话在AL寄存器中
执行操作:执行之前必须先执行SUB或SBB指令,减法指令必须把两个压缩的BCD码相减并氢结果存放在AL寄存器中。
非压缩的BCD码调整指令
执行操作:执行之前必须先执行ADD或ADC指令加法指令必须把两个非压缩的BCD码相加,并把结果存话在AL寄存器中
执行操作:执行之前必须先执行SUB或SBB指令,减法指令必须把两个非压缩的BCD码相减并氢结果存放在AL寄存器中。
执行操作:[DI] = [SI],将位于DS段嘚由SI所指出的存储单元的字节或字传送到位于ES段的由DI 所指出的存储单元再修改SI和DI,从而指向下一个元素。
在执行该指令之前必须预置SI和DI嘚初值,用STD或CLD设置DF值
格式:MOVS DST,SRC //同上,不常用DST和SRC只是用来用类型检查,并不允许使用其它寻址方式来确定操作数
1.目的串必须在附加段Φ,即必须是ES:[DI]
2.源串允许使用段跨越前缀来修饰但偏移地址必须是[SI].