汇编总结(持续更)


汇编各种指令及其作用和对标志位的影响

OF:OF:溢出标志,SF:符号标志,ZF:零位标志,PF:奇偶标志,CF:进位标志

OF:有溢出为1,无溢出为0
SF:和最高位即符号位保持一致,负数为1正数为0
ZF:结果为0时为1,结果为非零时为0
PF:1的个数为零或偶数时为1,否则为0
CF:有进位或借位时为1,否则为0
AF:辅助进位位,低半字节有进位或借位时为1,否则为0
特别注意进位和溢出的区别:
溢出是针对有符号数运算的,当结果超出范围就产生溢出,运算结果就不正确了;
而进位是针对无符号数运算的,当结果超出范围加上进位或借位结果仍然正确。
运算的时候会给OF和CF都置相应的值,看哪个决定于程序员自己要将运算看做是有符号运算还是无符号运算。
在这里插入图片描述
有符号运算的时候最高位是符号位!!!

进位标志CF 溢出标志OF
零位标志ZF 符号标志SF
奇偶标志PF
#对标志位没有定义:指令执行后这些标志是任意的、不可预测(谁也不知道是0还是1)
#对标志位没有影响:指令执行不改变标志状态
1.加法指令 ADD(addition)
[ADD reg, imm / reg / mem; ADD mem, imm / reg] 指令对标志位的影响:
    CF = 1 最高有效位向高位有进位
    CF = 0 最高有效位向高位无进位
    OF = 1 两个同符号数相加(正数 + 正数 或 负数 + 负数),结果符号与其相反。
    OF = 0 两个不同符号数相加,或同符号数相加,结果符号与其相同。

2.带进位加法指令 ADC(add with carry)
[ADC reg, imm / reg / mem; ADC mem, imm / reg] 指令对标志位的影响:
    CF = 1 最高有效位向高位有进位
    CF = 0 最低有效位相高位无进位
    OF = 1 两个同符号数相加,结果符号与其相反,
    OF = 0 两个同符号数相加,或同符号相加,结果符号与其相同

3.1指令 INC(increament)
[INC reg / mem] 指令对标志位的影响:
    对CF无影响
    OF = 1 两个同符号数相加,结果符号与其相反,
    OF = 0 两个同符号数相加,或同符号相加,结果符号与其相同。

    4.减法指令 SUB(subtract)
        [SUB reg, imm / reg / mem; SUB mem, imm / reg] 指令对标志位的影响:
    CF = 1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
    CF = 0 二进制减法运算中最高有效为向高位无借位(被减数〉= 减数,够减的情况) 
    OF = 1 两数符号相反(正数 - 负数,或负数 - 正数),而结果符号与减数相同。 
    OF = 0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

5.带借位减法指令 SBB(subtract with borrow)
[SBB reg, imm / reg / mem; SBB mem, imm / reg] 指令对标志位的影响:
    CF = 1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
    CF = 0 二进制减法运算中最高有效为向高位无借位(被减数〉= 减数,够减的情况) 
    OF = 1 两数符号相反(正数 - 负数,或负数 - 正数),而结果符号与减数相同。 
    OF = 0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

6.1指令 DEC(decrement)
[DEC reg / mem] 指令对标志位的影响:
    对CF无影响
    OF = 1 两数符号相反(正数 - 负数,或负数 - 正数),而结果符号与减数相同。 
    OF = 0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

7.比较指令 CMP(compare)
[CMP reg, imm / reg / mem; CMP mem, imm / reg] CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志,它的功能与SUB指令相同,但是结果不送回目的数
    指令对标志位的影响:
    CF = 1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
    CF = 0 二进制减法运算中最高有效为向高位无借位(被减数〉= 减数,够减的情况) 
    OF = 1 两数符号相反(正数 - 负数,或负数 - 正数),而结果符号与减数相同。 OF = 0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

8.求补指令 NEG(negate)
[NEG reg /mem:reg / mem < -0 - reg / mem] 指令对标志位的影响:
    CF = 1  不为0的操作数求补时
    CF = 0  为0的操作数求补时
    OF = 1 操作数为 - 128(字节运算)或操作数为 - 32768(字运算) 
    OF = 0 当求补运算的操作数不为-128(字节)或-32768(字)时
9.无符号乘法指令 MUL(unsigned multiple) 有符号乘法指令 IMUL(signed muliple)
[MUL r8 / m8; MUL r16 / m16][IMUL r8 / m8; IMUL r16 / m16] 乘法指令的源操作数显示给出,隐含使用另一个操作数AX和DX
*字节量相乘:AL与r8/ m8相乘,得到16位的结果,存入AX 
*字量相乘:AX与r16 / m16相乘,得到32位的结果,其高字存入DX,低字存入AX 
   指令对标志位的影响:
   乘法指令只影响标志位CF和OF,其他条件码位无定义。
   利用OF和CF判断乘积的高一半是否具有有效数值。 
    MUL指令的条件码设置为: 
    CF OF = 0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX))
    CF OF = 1 1 乘积的高一半不为0
    IMUL指令的条件码设置为:
    CF OF = 0 0 乘积的高一半为低一半的符号扩展.CF OF = 1 1 其他情况

10.无符号数除法 DIV(unsigned divide) 带符号数除法 IDIV(singed divide)
[DIV r8 / m8; DIV r16 / m16][IDIV r8 / m8; IDIV r16 / m16] 除法指令的除数显示给出,隐含使用另一个操作数AX和DX作为被除数
* 字节量除法:AX除以r8 / m8,8位商存入AL,8位余数存入AH
* 字量除法:DX.AX除以r16 / m16,16位商存入AX,16位余数存入DX 
    指令对标志位的影响:
    不影响条件码。 除法指令可能会产生结果溢出。

11.符号扩展指令 CBW将AL的符号扩展至AH CWD将AX的符号扩展至DX
*对有符号数除法,可以利用符号扩展指令得到倍长于除数的被除数
*对无符号数除法,采用直接使高8位或高16位清0,获得倍长的被除数。这就是零位扩展

在这里插入图片描述
双精度数计算的时候放在两个寄存器中了所以先对低位进行运算,再对高位进行带进位(借位)的运算。


在这里插入图片描述在这里插入图片描述
字节长度不一样的数字记得先进行扩展再计算。对高位进行计算的时候,别忘了来自低位的进位或者借位。

关于BCD码:在这里插入图片描述

压缩BCD码调整指令
DAA 加法;DAS 减法
*使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令
*DAA和DAS指令对OF标志无定义,按结果影响其他标志,例如CF反映压缩BCD码相加或减的进位或借位状态

默认都是对AL进行操作:
在这里插入图片描述
例:压缩BCD减法在这里插入图片描述

非压缩BCD码调整指令
加法 AAA;减法 AASAAM 乘法;AAD除法
*使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令
*AAA和AAS指令在调整中产生了进位或借位,则AH要加上进位或减去借位,同时CF=AF=1,否则CF=AF=0;它们对其他标志无定义
*AAM指令跟在字节乘MUL之后,将乘积调整为非压缩BCD码
*AAD指令跟在字节除DIV之前,先将非压缩BCD码的被除数调整为二进制数
*AAM和AAD指令根据结果设置SF、ZF和PF,但对OF、CF和AF无定义

默认都是对AL的操作:
***注意除法是放在运算之前就对非压缩BCD进行调整了的!!!***在这里插入图片描述
在这里插入图片描述
例:非压缩BCD码加法

例:非压缩BCD码除法
在这里插入图片描述

12.逻辑与 AND(logic and)
[AND reg,imm/reg/mem; AND mem,imm/reg]
    指令对标志位的影响:
    指令执行后 CF 和 OF 置零,AF无定义。 
    PF = 1 结果操作数中1的个数为偶数时置1
    PF = 0 结果操作数中1的个数为奇数时置0

13.逻辑或 OR (logic or)
[OR reg,imm/reg/mem; OR mem,imm/reg]
    指令对标志位的影响:
    指令执行后 CF 和 OF 置零,AF无定义。 
    PF = 1 结果操作数中1的个数为偶数时置1
    PF = 0 结果操作数中1的个数为奇数时置0

14.逻辑非 NOT(logic not)
[NOT reg/mem]
    指令对标志位的影响:对标志位无影响

15.异或 XOR(exclusice or)
[XOR reg,imm/reg/mem; XOR mem,imm/reg]
    指令对标志位的影响:
    令执行后 CF 和 OF 置零,AF无定义。 
    PF = 1 结果操作数中1的个数为偶数时置1
    PF = 0 结果操作数中1的个数为奇数时置0

16.测试指令 TEST
[TEST reg,imm/reg/mem; TEST mem,imm/reg]对两个操作数执行逻辑与运算,结果不送回到目的操作数
    指令对标志位的影响:
    令执行后 CF 和 OF 置零,AF无定义。
    PF = 1 结果操作数中1的个数为偶数时置1
    PF = 0 结果操作数中1的个数为奇数时置0

17.逻辑左移 SHL(shift logical left)
[SHL reg/mem,1/CL]最高位进入CF,最低位补0
    指令对标志位的影响:
    CF = 移入的数值 
    OF = 1 当cnt = 1时,移动后最高位的值发生变化。 
    OF = 0 当cnt = 1时,移动时最高位的值未发生变化。

18.逻辑右移 SHR(shift logical right)
[SHR reg/mem,1/CL]最低位进CF,最高位补0
    指令对标志位的影响:
    CF = 移入的数值 
    OF = 1 当cnt = 1时,移动后最高位的值发生变化。 
    OF = 0 当cnt = 1时,移动时最高位的值未发生变化。

19.算术左移 SAL(shift arithmetic left)
[SAL reg/mem,1/CL]最高位进CF,最低位补0
    指令对标志位的影响:
    CF = 移入的数值 
    OF = 1 当cnt = 1时,移动后最高位的值发生变化。 
    OF = 0 当cnt = 1时,移动时最高位的值未发生变化。

20.算术右移 SAR(shift arithmetic right)
[SAR reg/mem,1/CL]最低位进CF,最高位不变
    指令对标志位的影响:
    CF = 移入的数值 
    OF = 1 当cnt = 1时,移动后最高位的值发生变化。 
    OF = 0 当cnt = 1时,移动时最高位的值未发生变化。

21.循环左移 ROL(rotate left)
[ROL reg/mem,1/CL]不带进位循环左移
    指令对标志位的影响:
    CF = 移入的数值 
    OF = 1 当cnt = 1时,移动后最高位的值发生变化。 
    OF = 0 当cnt = 1时,移动时最高位的值未发生变化。

22.循环右移 ROR(rotate right)
[ROR reg/mem,1/CL]不带进位循环右移
    指令对标志位的影响:
    CF = 移入的数值 
    OF = 1 当cnt = 1时,移动后最高位的值发生变化。 
    OF = 0 当cnt = 1时,移动时最高位的值未发生变化。

23.带进位的循环左移 RCL(rotate left through carry)
[RCL reg/mem,1/CL]
    指令对标志位的影响:
    CF = 移入的数值。 
    OF = 1 当cnt = 1时,移动后最高位的值未发生变化。 
    OF = 0 当cnt = 1时,移动后最高位的值发生变化。 SF、ZF、PF标志位不受影响。

24.带进位的循环右移 RCR(rotate right through carry)
[RCR reg/mem,1/CL]
    指令对标志位的影响:
    CF = 移入的数值。 
    OF = 1 当cnt = 1时,操作数最高位的值未发生变化。 
    OF = 0 当cnt = 1时,操作数最高位的值发生变化。 SF、ZF、PF标志位不受影响。

对移位指令的一些说明:
1.按照移入的位设置进位标志CF根据移位后的结果影响SF、ZF、PF
2.对AF没有定义
3.如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。当移位次数大于1时,OF不确定。
4.逻辑左移一位相当于无符号数乘以2
5.逻辑右移一位相当于无符号数除以2
对循环移位指令的一些说明:
1.按照指令功能设置进位标志CF
2.不影响SF、ZF、PF、AF
3.如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。当移位次数大于1时,OF不确定
例:32位数移位
在这里插入图片描述
例:BCD码合并
在这里插入图片描述

条件转移指令
    指令的汇编格式及功能 根据条件码的值转移:
1. JZ(JE) OPR ZF = 1            jump if Zero/Equal
2. JNZ(JNE) OPR ZF = 0          jump if Not Zero/Not Equal 
3. JS OPR SF = 1                jump if Sign
4. JNS OPR SF = 0               jump if Not Sign
5. JO OPR OF = 1                jump if Overflow
6. JNO OPR OF = 0               jump if Not Overflow
7. JP OPR PF = 1                jump if Parity/Parity Even 
8. JNP OPR PF = 0               jump if Not Parity/Parity Odd 
9. JC OPR CF = 1                jump if Carry
10. JNC OPR CF = 0              jump if Not Carry

    比较两个无符号数,根据比较的结果转移:
1. JB(JNAE, JC) OPR CF = 1 被减数小于减数则转移
2. JNB(JAE, JNC) OPR CF = 0 被减数大于或等于减数则转移
3. JBE(JNA) OPR CF或ZF = 1 被减数小于或等于减数则转移
4. JNBE(JA) OPR CF或ZF = 0 被减数大于减数则转移

    比较两个带符号数,根据比较结果转移:
1. JL(JNGE) OPR SF异或OF = 1 被减数小于减数则转移
2. JNL(JGE) OPR SF异或OF = 0 被减数不小于减数则转移
3. JLE(JNE) OPR SF异或OF 或ZF = 1 被减数不大于减数则转移
4. JNLE(JG) OPR SF异或OF 与ZF = 0 被减数大于减数则转移

    根据CX寄存器的值转移:
1. JCXZ(CX) = 0 CX内容为零 则转移

对条件转移中判断单个标志位的指令的一些说明:
这组指令单独判断5个状态标志之一
⑴JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)
⑵JS和JNS:利用符号标志SF,判断结果是正是负
⑶JO和JNO:利用溢出标志OF,判断结果是否产生溢出
⑷JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇
⑸JC/JB/JNAE和JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位
对比较无符号数的一些说明:
无符号数的大小用高(Above)低(Below)表示
利用CF确定高低、利用ZF标志确定相等(Equal)
两数的高低分成4种关系:
⑴ 低于(不高于等于):JB(JNAE)
⑵ 不低于(高于等于):JNB(JAE)
⑶ 低于等于(不高于):JBE(JNA)
⑷ 不低于等于(高于):JNBE(JA )
对比较有符号数的一些说明:
有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)
两数的大小分成4种关系:
⑴ 小于(不大于等于):JL(JNGE)
⑵ 不小于(大于等于):JNL(JGE)
⑶ 小于等于(不大于):JLE(JNG)
⑷ 不小于等于(大于):JNLE(JG )
(条件转移这一块最详细的讲解在D://抗疫居家上课资料//汇编语言程序设计//第2章 8086的指令系统3a.ppt中21页之后)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值