学 Win32 汇编[26] - 加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP

本文深入探讨了计算机指令集中的基本指令,包括INC(加一)、DEC(减一)、NEG(求补)、ADD(加)、ADC(带进位加)、SUB(减)、SBB(带进位减)和CMP(比较)。通过实际代码示例,展示了每种指令的功能和应用,特别强调了它们如何影响标志位。同时,对比了NEG与NOT指令的区别,帮助读者理解和区分这两种操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

;INC(Increment): 加一
;DEC(Decrement): 减一
;NEG(Negate):    求补(求反)
;ADD(Add):       加
;ADC(Add Carry): 带进位加
;SUB(Subtract):  减
;SBB(Subtract With Borrow): 带进位减
;CMP(Compare):   比较

;INC、DEC、NEG 的指令格式:
;INC r/m

;ADD、ADC、SUB、SBB、CMP 的指令格式:
;ADD r/m, r/m/i

;它们的结果影响 OF、SF、ZF、AF、PF、CF



INC、DEC、NEG


 
; Test26_1.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    mov eax, 6
    inc eax
    PrintDec eax ;7
    dec eax
    PrintDec eax ;6
    neg eax      ;NEG 就是加个负号
    PrintDec eax ;-6
    neg eax
    PrintDec eax ;6
    ret
main endp
end main


ADD、ADC


 
; Test26_2.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    mov eax, 5
    add eax, 1
    PrintDec eax ;6
    
    stc          ;CF=1
    mov eax, 5
    adc eax, 1   ;ADC 比 ADD 还要多加上 CF
    PrintDec eax ;7
    
    clc          ;CF=0
    mov eax, 5
    adc eax, 1
    PrintDec eax ;6
    ret
main endp
end main


SUB、SBB


 
; Test26_3.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    mov eax, 5
    sub eax, 1
    PrintDec eax ;4
    
    stc
    mov eax, 5
    sbb eax, 1   ;SBB 比 SUB 还要多减去 CF
    PrintDec eax ;3
    
    clc
    mov eax, 5
    sbb eax, 1
    PrintDec eax ;4
    ret
main endp
end main


CMP


 

;CMP 隐含执行 SUB, 但并不改写操作数, 只是影响标志位;
;零标志位标识着两个数是否相等, 符号标志位标识着两个数的大小. 
;它后面经常跟着跳转指令

; Test26_4.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    mov eax, 3
    cmp eax, 3
    lahf
    PrintHex ah ;46 - 01000110b(ZF=1 说明两个数相等)
    
    mov eax, 3
    cmp eax, 2
    lahf
    PrintHex ah ;02 - 00000010b(SF=0、ZF=0 说明前者 > 后者)
    
    mov eax, 3
    cmp eax, 4
    lahf
    PrintHex ah ;76 - 10010111b(SF=1、ZF=0 说明前者 < 后者)    
    ret
main endp
end main


辨析 NEG 与 NOT


 
; Test26_5.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data?
    val sword ?
.code
main proc
    ;求补运算: 取反+1
    mov val, 44
    PrintDec val  ;44
    PrintHex val  ;002C - 00000000 00101100b
    
    not val
    inc val
    PrintDec val  ;-44
    PrintHex val  ;FFD4 - 11111111 11010100b
    
    not val
    inc val
    PrintDec val  ;44
    PrintHex val  ;002C - 00000000 00101100b
    
    ;NEG 就相当于: 取反+1
    mov val, 44
    neg val
    PrintDec val  ;-44
    PrintHex val  ;FFD4 - 11111111 11010100b
    
    neg val
    PrintDec val  ;44
    PrintHex val  ;002C - 00000000 00101100b
    ret
main endp
end main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值