汇编指令之算数指令

算术指令

注意:影响标志位,为条件码:主要 CF,ZF,SF,OF,

  • 乘除,均不涉及立即数imm

[参考] 汇编]8086指令系统---算术指令(一)_极品小肥羊的博客-CSDN博客

加法指令

  • ADD DST,SRC

    DST <- (DST+SRC)

    eg:
    ADD reg,reg
    ADD reg,mem
    ADD reg,imm
    ADD mem,reg
    ADD mem,imm
    
  • ADC DST,SRC

    DST <- (DST+SRC+CF)

    同上 + CF;
    
  • INC DST

    DST <- DST+1; DST:reg,mem

  SF=1 加法结果为负数(符号位为1)
  SF=0 加法结果为正数(符号位为0)
  ZF=1 加法结果为零
  ZF=0 加法结果不为零
  CF=1 最高有效位向高位有进位
  CF=0 最高有效位向高位无进位
  OF=1 两个同符号数相加(正数+正数,或负数加负数),结果符号与其相反
  OF=0 不同符号数相加时,或同符号数相加,结果符号与其相同
计算机在执行运算时,并不区别操作数是带符号数还是无符号数,一律按上述规则设置条件码,

ADC指令主要与ADD配合,实现多精度加法运算

减法指令

  • SUB DST,SRC

    ;DST <- (DST-SRC)

    SUB reg,reg
    SUB reg,mem
    SUB reg,imm
    SUB mem,reg
    SUB mem,imm
    
  • SBB DST,SRC

    ;DST <- (DST-SRC-CF);

    同上 - CF
    
  • DEC DST

    ;DST <- DST-1 DST: reg,mem

  • NEG DST; 求补

    ;DST <- (0-DST); DST:reg,mem

    求补操作即把操作数变为与其符号相反的数:。
    机器在执行求补指令时,把操作数各位求反后末位加1,因此执行的操作也可表示为:
    (DST) ← 模-(DST)+1
    
  • CMP DST,SRC;

    ;DST-SRC ;仅影响标志位

    eg:
    	CMP reg,reg
        CMP reg,mem
        CMP reg,imm
        COM mem,reg
        COM mem,imm
    
SF和ZF分别表示减法结果的符号以及为零的情况;
CF表明无符号数相减结果溢出与否;
OF表明带符号数相减结果溢出与否。

但在对CF和OF位的设置方法上减法和加法有所不同,下面对此做进一步说明:
  CF=1   二进制减法运算中最高有效位向高位有借位(被减数<减数,不够减的情况)
  CF=0   二进制减法运算中最高有效位向高位无借位(被减数≥减数,够减的情况)
  OF=1   两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同
  OF=0   同符号数相减时,或不同符号数相减,其结果符号与减数不同

乘法指令

[参考] 汇编]8086指令系统---算术指令(二)_极品小肥羊的博客-CSDN博客

无符号乘法

乘法指令只影响CF和OF,其它条件码位无意义
MUL指令的条件码设置为:
  CF OF= 0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX))
  CF OF= 1 1 乘积的高一半不为0
  • MUL SRC

    ;AX <- (AL*SRC_8)
    ;DX,AX <- (AX*SRC_16)
    MUL reg8
    MUL reg16
    MUL mem8
    MUL mem16
    

有符号乘法

IMUL指令的条件码设置为:
  CF OF= 0 0 乘积的高一半为低一半的符号扩展
  CF OF= 1 1 其他情况
  
符号扩展是指
	做字节乘法时,乘积低8位的最高位为0,高8位也扩展为0,或者低8位的最高位为1,高8位也扩展为1的情况。
	对两个字相乘,符号扩展是指乘积的低16位的最高位为0,高16位也扩展为0,或者低16位的最高位为1,高16位也扩展为1的情况。
  • IMUL SRC

    ;AX <- (AL*SRC_8)
    ;(DX,AX) <- (AX*SRC_16)
    IMUL reg8
    IMUL reg16
    IMUL mem8
    IMUL mem16
    

除法指令

	参加运算的除数和被除数是无符号数时,使用DIV指令,其商和余数也均为无符号数。
	IDIV指令执行的操作与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,而且余数的符号与被除数的符号相同。
	除法指令对Flags无定义,因此对除法指令产生的错误,如除数为0或商溢出等错误,由系统直接转入0型中断来处理。所谓商溢出,是指被除数高一半的绝对值大于除数的绝对值时,商超出了16位的表示范围(字操作)或8位的表示范围(字节操作)
  • 除法指令要求字操作时,被除数必须为32位,除数是16位,商和余数是16位的;
    字节操作时,被除数必须为16位,除数是8位,得到的商和余数是8位的。
    • 不足可以对AX DX用字符扩展指令

无符号除法

  • DIV SRC

    ;AL <- (AX / SRC_8)
    ;AH <- (AX % SRC_8)
    
    ;AX <- (AX / SRC_16)
    ;DX <- (AX % SRC_16)
    DIV reg8
    DIV reg16
    DIV mem8
    DIV mem16
    
  • 有符号除法

    IDIV SRC

    ;AL <- (AX / SRC_8)
    ;AH <- (AX % SRC_8)
    
    ;AX <- (AX / SRC_16)
    ;DX <- (AX % SRC_16)
    同上
    
  • 字节转换成字(有符号数)

    • 进行符号扩展的操作数必须存放在AL寄存器或AX寄存器中

    CBW;

    若AL最高位为0,则AH全为0;
    若AL最高位为1,则AH全为FFH;类似于字符扩展
    eg
    	(AH)= 00H 当(AL)的最高有效位为0时
    	(AH)= FFH 当(AL)的最高有效位为1时
    
    
    符号扩展是指
    	做字节乘法时,乘积低8位的最高位为0,高8位也扩展为0,或者低8位的最高位为1,高8位也扩展为1的情况。
    	对两个字相乘,符号扩展是指乘积的低16位的最高位为0,高16位也扩展为0,或者低16位的最高位为1,高16位也扩展为1的情况。
    
  • 字转换成双字节(有符号)

    CWD;

    若AX最高位为0,则DX全为0;
    若AX最高位为1,则DX全为FFH;类似于字符扩展
    eg
    (DX)=0000H当(AX)的最高有效位为0时
    (DX)=FFFFH当(AX)的最高有效位为1时
    
    若(AX)= 0BA45H,
        CBW; 执行后,(AH)=00, (AL)=45H, 或 (AX)=0045H
        CWD; 执行后,(DX)=0FFFFH, (AX)=0BA45H
    

BCD 码调整

​ 8086微型机提供了一组十进制调整指令,用来处理ASCII码和BCD码表示的数。

压缩BCD码调整指令

每个字节两个BCD码

10010101B=95H ;值就为95
  • DAA ;

    对加法运算结果AL 进行BCD 码调整

  • DAS;

    对减法运算结果AL进行BCD码调整

非压缩BCD码调整指令

  1. 低4位为BCD码,高4位为零

  2. 加减运算非压缩BCD码高4位的值可不为0,乘除时高4位必须是0

  • AAA;

    对加法运算非压缩BCD码进行调整,进位送进AH中

  • AAS;

    对减法运算非压缩BCD码进行调整,

  • AAM;

    对乘法运算非压缩BCD码进行调整,

  • AAD;

    对除法运算非压缩BCD码进行调整,

posted @ 2021-11-09 22:06  烟雨断桥  阅读(759)  评论(0编辑  收藏  举报