汇编-加减法指令

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

加法运算类指令

加法指令

普通加法指令 \(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  阅读(1139)  评论(0编辑  收藏  举报