汇编-加减法指令

算术运算、逻辑运算与移位操作指令

加法运算类指令

加法指令

普通加法指令 \(ADD\) 影响 \(6\) 个标志位

带进位加法指令 \(ADC\) 影响 \(6\) 个标志位

加 \(1\) 指令 \(INC\) 影响 \(5\) 个标志位 不会影响 \(CF\)

使用 \(ADC\) 之前要先把 \(CF\) 清零

\(INC\) 的操作数不可以是段寄存器和立即数

求内存数据段中 \(M1\) 和 \(M2\) 为首的 两个 \(20\) 字节数之和,并将结果写入 \(M2\) 为首的区域中

按照字节运算

	LEA SI, M1
	LEA DI, M2
    MOV CX, 20
	CLC   ; 使CF = 0
    
NEXT: MOV  AL, [SI]
      ADC [DI], AL
      INC SI
      INC DI
      DEC CX
      JNZ NEXT
     
      HLT

按照字运算

	LEA SI, M1
	LEA DI, M2
    MOV CX, 10
	CLC   ; 使CF = 0
    
NEXT: MOV  AX, [SI]
      ADC [DI], AX
      ADD SI, 2
      ADD DI, 2
      DEC CX
      JNZ NEXT
     
      HLT

减法运算类指令

\(SUB :\) 对标志位的影响与 \(ADD\) 相同

\(SBB :\) 对标志位的影响与 \(INC\)​ 相同 对操作数的要求及对标志位的影响与 \(SUB\) 相同

\(SUB : \ OPRD1 \ - \ OPRD2 \ - \ CF \ ----> \ OPRD1\)

\(DEC\) 对操作数的要求及对标志位的影响与 \(INC\) 相同

应用程序例

; 程序功能: 延时(定时)
		MOV BL, 2
NEXT1:  MOV CX, 0FFFFH ; 0是为了让计算机识别这是一个16进制数字
NEXT2:  DEC CX
		JNZ NEXT2 ;ZF=0 转NEXT2
		DEC BL   
		JNZ NEXT1 ; ZF=0 转NEXT1
		HLT   ;暂停执行

\(NEG\) 指令

\(NEG \ OPRD\) $$8/16位寄存器或存储器操作数$$

\(0 \ - \ OPRD \ ----> \ OPRD\)

因此这个指令又叫求补指令

执行\(NEG\)指令之后,一般情况下都会使得 \(CF\) 为 \(1\) ,除非给定的操作数为零才会使 \(CF\) 为 \(0\)

当指定的操作数的值为 \(80H(-128)\) 或者 \(8000H(-32768)\) ,则执行 \(NEG\) 指令后 结果不变,但 \(OF\) 置一,其他情况下 \(OF\) 均置零

\(CMP\) 指令

\(CMP \ OPRD1, OPRD2\)

操作 \(OPRD1 \ - \ OPRD2\)

指令执行的结果不影响目标操作数,仅影响标志位

常用于比较两个数字的大小

  • 两个无符号数的比较

    \(CMP \ AX, BX\)

    若 \(AX \ge BX\) 则 \(CF = 0\)

    若 \(AX < BX\) 则 \(CF = 1\)

    若 \(AX = BX\) 则 \(CF = 0, ZF = 1\)

  • 两个带符号数的比较

    \(CMP \ AX, BX\)

    两个数字的大小由 \(OF\) 和 \(SF\) 共同决定

    \(OF\) 和 \(SF\) 状态相同 \(AX \ge BX\)

    \(OF\) 和 \(SF\) 状态不同 \(AX < BX\)

    \((异或相同 \ 不同)\)

    \(CMP\) 指令示例

    		LEA BX, MAX
    		LEA SI, BUF
    		MOV CL, 20
    		MOV AL, [SI]
    NEXT :  INC SI
    		CMP AL, [SI]
    		JNC GOON		; CF=0转移
    		XCHG [SI], AL
    GOON:   DEC CL
    		JNZ NEXT
    		MOV [BX], AL
    		HLT
    

    程序功能 在 \(20\) 个数字中寻找最大值并放入 \(MAX\)

posted @ 2022-02-11 21:42  ccz9729  阅读(1388)  评论(0)    收藏  举报