• 汇编的指令


    加法类指令:

    不带进位的加法:

    add dest,src;dest=(dest)+(src)

     注意: 1、源操作数和目的操作数不能同时为段寄存器或存储单元

                2、对标志位有影响,主要影响CF、ZF、OF、SF。

     带进位的加法:

    adc dest,src;dest=(dest)+(src)+(cf)

    注意:1、源操作数和目标操作数不能同时为存储单元

               2、段寄存器不能参与算数运算

    加一指令: 

    inc reg/mem;reg/mem=reg/mem+1

     1、操作数不能为立即数。

     2、不影响CF位

     3、inc指令将操作数视为无符号数

    减法类指令:

    不带借位的减法:

    sub dest,src;dest=(dest)-(src)

    注意: 1、源操作数和目的操作数不能同时为段寄存器或存储单元

                2、对标志位有影响,主要影响CF、ZF、OF、SF。

    带借位的减法:

    sbb dest,src;dest=(dest)-(src)-(CF)

     注意: 1、源操作数和目的操作数不能同时为存储单元。

                 2、段寄存器不能进行算数运算。

     减一指令:

    dec reg/mem;reg表示寄存器,mem表示存储单元

    注意:操作数不能为立即数。 

    取补指令:

    neg reg/mem;reg/mem=0-(reg)/(mem)

    取补指令是对该数逐位取反(包括符号位)后加一。

     注意:操作数不能为立即数。 

    NEG对标志位的影响 

    CF:当OPFRG=0时 CF=0 否则CF=1

    OF;当OPFRG为负的最小值时OF=1否则OF=0

     比较指令:

    cmp dest,srg;比较dest和srg的大小

     用dest减去srg并根据结果改变标志位,但不记录相减结果。

    若执行指令后:ZF=1,则说明两个数相等,因为zero为1说明结果为0.

       当无符号时:

       若CF=1,则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1

       CF=0,则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2.

       当有符号时:

       若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2;

       若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1

       若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1

       若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2;(来自CSDN

     进位和溢出的区别:某种意义上来说of是表示有符号数的溢出,cf是表示无符号数的溢出。

    (来自CSDN) 

    乘法:

    无符号的乘法:

    mul mem/reg;操作数不能为立即数

     功能:完成两个不带符号的八位或十六位数字相乘,乘积存放在ah、al或dx、ax中。例:被乘数是bl默认乘数为al,乘积存放在ah、al中;被乘数为bx乘数默认为ax,乘积存放在dx,ax中。如果乘积的高半部分不为零,则 MUL 会把进位标志位和溢出标志位置改为1。目的操作数只能是通用寄存器。

    1. ;以下均为16进制
    2. mov ax,1001
    3. mov bx,2
    4. mul bl ;此时ax=0002
    5. mov ax,1024
    6. mov bx,2
    7. mul bx ;此时ax=2048,dx=0000
    8. mov ax,1024
    9. mov bx,100
    10. mul bx ;此时ax=4800,dx=0020

    有符号数的乘法:

    imul ax,bx;ax=(ax)*(bx)

     功能:完成两个不带符号的八位或十六位数字相乘,乘积存放在ah、al或dx、ax中。例:被乘数是bl默认乘数为al,乘积存放在ah、al中;被乘数为bx乘数默认为ax,乘积存放在dx,ax中。如果乘积的高半部分不为零,则 MUL 会把进位标志位和溢出标志位置改为1。目的操作数只能是通用寄存器。

    除法指令

    无符号数的除法:

    1. mov ax,10
    2. mov bx,3
    3. div bl;ax=0105
    4. mov ax,10
    5. mov bx,3
    6. div bx;ax=0005 bx=0001

    1、如果被除数为16位除数为8位,则被除数默认存储在ax中,如果被除数为32位除数为16位,默认被除数高位存储在dx中低位存储在ax中。

    2、如果除数为8位那么商默认存储在al中,余数存储在ah中。

    3、如果除数为16位那么商默认存储在ax中,余数存储在dx中

    有符号数的除法:

    idiv src

    同上 

     除法指令的特殊情况:

    1、除数为零

    2、除数溢出,例如:

    1. mov ax,1000
    2. mov bl,2
    3. div bl;此时中断标志更改

    BCD调整指令:

    请看博客园

    逻辑运算

    逻辑与and:本指令影响标志位PF,SF,ZF,使CF=0,OF=0.(来自CSDN

    逻辑或or

    异或xor:相同为0不同为1 。

    逻辑非not:求反码

    test:将两个操作数按位与,只保留标识符不保留运算结果。经常用于判断测试位是否为零。

    移位和循环移位指令

    算数移位指令:

    SAL为算数左移指令,算数左移一次或cl指定次数。

    SAR为算数右移指令,算数右移一次或cl指定次数。

    算数移位代表有符号数的乘二除二。

    逻辑移位指令

    SHL为算数左移指令,算数左移一次或cl指定次数。

    SAL为算数右移指令,算数右移一次或cl指定次数

    逻辑移位和算术移位的区别:

    • 逻辑移位

    逻辑移位是指逻辑左移和逻辑右移,移出的空位都用0来补。

    • 算术移位

    算术移位 就需要分有符号型值和无符号型值
    对于无符号型值,算术移位等同于逻辑移位。
    而对于有符号型值 ,算术左移等同于逻辑左移,算术右移补的是符号位,正数补0,负数补1

    (来自CSDN

    OF:当移动次数为1时若操作改变了最高位OF为1,否则为0,其余情况无意义

    循环移位

    带进位:RCL、RCR。

    不带进位:ROL、ROR。

  • 相关阅读:
    【毕业设计】基于超声波与红外的自动调速风扇系统(代码开源) -物联网 嵌入式 stm32
    Invalid bound statement (not found)出现的原因和解决方法
    oppo后端16连问
    Eclipse环境基于HDFS的API进行开发
    3.1 SQL概述
    【c语言】基础篇学习笔记
    欢迎入坑单目深度估计
    智云通CRM:如何使用万能的“三问”,提升业绩?
    Liunx 部署后端服务jar包脚本
    IT面试参考
  • 原文地址:https://blog.csdn.net/m0_63823490/article/details/133900444