• DJ12-2-2 算术运算指令


    目录

    1. 加法指令

    (1)ADD 指令

    (2)ADC 指令

    (3)INC 指令

    2. 减法指令

    (1)SUB 指令

    (2)SBB 指令

    (3)DEC 指令

    (4)NEG 求补指令

    (5)CMP 比较指令

    3. 乘法指令

    (1)MUL 无符号数乘法指令

    (2)IMUL 有符号数乘法指令  

    4. 除法指令


    1. 加法指令

    源操作数:通用寄存器、存储器、立即数

    目的操作数:通用寄存器、存储器。

    注意:源操作数和目的操作数不能同时是存储器操作数。

    (重点记背)加减乘除指令的操作数:

    6 个算术或逻辑运算结果的特征位:

    (1)ADD 指令

    格式:ADD  OPRD1,OPRD2

    执行:OPRD1 + OPRD2 → OPRD1

    ADD 指令的执行会影响全部 6 个状态标志位。

    应用举例:

    例、分析下列指令是否合法。

    例、分析指令执行后 6 个状态标志位的状态。

    看似我们把红色标出的进位扔掉了,实则进位到了 CF 里面。

    (2)ADC 指令

    格式:ADC  OPRD1,OPRD2

    执行:OPRD1 + OPRD2 + CF → OPRD1

    特点:ADC 指令主要用于多字节加法运算,高 16 位或高 8 位相加时,必须考虑低 16 位或低 8 位产生的进位。

    ADC 指令的执行会影响全部 6 个状态标志位。

    应用举例:

    例、现有两个 32 位无符号数 12345678H、8765ABCDH 相加,其和仍然为一个 32 位无符号数。要求和的高 16 位送入 DX 中,和的低 16 位送入 AX 中。

    在字母开头的十六进制数前加个 0,代表这是一个数,防止与字符串混淆。

    (3)INC 指令

    格式:INC  OPRD

    执行:OPRD + 1 → OPRD

    特点:是单操作数指令,其目的操作数不能是立即数。

    (重点记背)单操作数指令的操作数:

    INC 指令的执行会影响 5 个状态标志位,除了 CF 位。

    2. 减法指令

    源操作数:通用寄存器、存储器、立即数。

    目的操作数:通用寄存器、存储器。

    注意:源操作数和目的操作数不能同时是存储器操作数。

    (重点记背)加减乘除指令的操作数:

    (1)SUB 指令

    格式:SUB  OPRD1,OPRD2

    执行:OPRD1 - OPRD2 → OPRD1

    SUB 指令的执行会影响全部 6 个状态标志位。

    (2)SBB 指令

    格式:SBB  OPRD1,OPRD2

    执行:OPRD1 - OPRD2 - CF → OPRD1

    特点:SBB 指令主要用于多字节减法运算,高 16 位或高 8 位相减时,必须考虑低 16 位或低 8 位产生的借位。

    SBB 指令的执行会影响全部 6 个状态标志位。

    (3)DEC 指令

    格式:DEC  OPRD

    执行:OPRD - 1 → OPRD

    (重点记背)单操作数指令的操作数:

    DEC 指令的执行会影响 5 个状态标志位,除了 CF 位。

    因为 INC 和 DEC 均不会影响 CF 位,所以不要试图用它们来判断 CF 位的内容。

    (4)NEG 求补指令

    格式:NEG  OPRD

    执行:0 - OPRD → OPRD

    老师举的例子:

    NEG 指令的执行会影响全部 6 个状态标志位。

    ① 对进位标志 CF 的影响

            只有当操作数为零时,进位标志 CF 被置零;其它情况进位标志 CF 都被置 1,即均有借位。

    ② 对溢出标志 OF 的影响

            当字节操作数为 -128(80H)或字操作数为 -32768(8000H)时,结果将无变化,但溢出标志 OF 被置 1 。如下图所示:

    实质:

    (5)CMP 比较指令

    格式:CMP  OPRD1,OPRD2

    执行:OPRD1 - OPRD2 (操作数本身不会发生变化哟~)

    特点:用于比较两个数的大小,可以作为条件转移指令的转移条件。

    说明:对 FLAGS 有影响的运算都可以作为条件转移指令的转移条件。

    CMP 指令的执行会影响全部 6 个状态标志位。

    ① 比较两个无符号数的大小

    ② 比较两个有符号数的大小

    当 A = B 时,有 ZF = 1 。

    当 A > B 时:

    综上,SF ⊕ OF = 0 且 ZF = 0 时,A > B 。

    当 A < B 时:

    综上,SF ⊕ OF = 1 且 ZF = 0 时,A < B 。

    应用举例:

    例、在内存数据段从 DATA1 开始的存储单元存放了两个 8 位的无符号数。试比较它们的大小,并将大的数送 MAX 存储单元。

    3. 乘法指令

    乘法指令采用隐含寻址,隐含的是存放被乘数的累加器 AL、AX 及存放结果的 AX、DX 。

    执行:

    • 字节乘法:OPRD × AL → AX
    • 字乘法:OPRD × AX → DX:AX

    对操作数的要求:OPRD 为通用寄存器或存储器,不能为立即数。

    (重点记背)单操作数指令的操作数:

    特点:若运算结果的高半部分(AH 或 DX)是无效数值,则 OF = CF = 0,否则 OF = CF = 1。

    说人话就是:按理说 8 位 × 8 位得到一个 16 位,但是有些结果用 8 位就能表示,因此其高半部分是无效数值。

    (1)MUL 无符号数乘法指令

    格式:MUL  OPRD

    执行:

    • 字节乘法:OPRD × AL → AX
    • 字乘法:OPRD × AX → DX:AX

    特点:若结果的 AH(字节运算)或 DX(字运算)为全 0,则 CF = OF = 0,否则 CF = OF = 1。

    MUL 只会影响 CF 位和 OF 位。

    (2)IMUL 有符号数乘法指令  

    格式:IMUL  OPRD

    执行:

    • 字节乘法:OPRD × AL → AX
    • 字乘法:OPRD × AX → DX:AX

    特点:若结果的 AH(字节运算)或 DX(字运算)为低半部分的符号扩展,则 CF = OF = 0,否则 CF = OF = 1。

    说人话就是:若两数同号,则高半部分为全 0;若两数异号,则高半部分为全 1 。

    4. 除法指令

    除法指令要求被除数的字长必须是除数的两倍;

    除法指令采用隐含寻址,若除数为 8 位,则被除数为 AX;若除数为 16 位,则被除数高位在 DX 中,低位在 AX 中。

    对操作数的要求:OPRD 为通用寄存器或存储器,不能为立即数。 

    (重点记背)单操作数指令的操作数:

    格式:

    • DIV  OPRD
    • IDIV  OPRD

    执行:

    • 字节除法:AX ÷ OPRD → AL(商)、AH(余数)
    • 字除法:DX:AX ÷ OPRD → AX(商)、DX(余数)

    除法指令对标志位均无影响。

  • 相关阅读:
    LVS+Keepalived 高可用集群
    FAT32文件系统---第5章 分区格式化
    Windows 安装 chromedriver 和 Python 调试
    自定义全局异常
    Qt易忘样式表总结
    数字孪生技术的应用在能源行业案例解析
    大数据的关键技术之——大数据采集
    嵌入式Linux驱动开发 01:基础开发与使用
    JS操作字符串面试题系列(2)-每天做5题
    数据安全相关法律学习记录
  • 原文地址:https://blog.csdn.net/m0_64140451/article/details/127970046