首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-09-14 
学 Win32 汇编[26] - 加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMPINC(Increment): 加一DEC(Decrement):

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

;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, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain 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?   retmain endpend main


ADD、ADC

; Test26_2.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain 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?   retmain endpend main


SUB、SBB

; Test26_3.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain 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?   retmain endpend main


CMP

;CMP 隐含执行 SUB, 但并不改写操作数, 只是影响标志位;;零标志位标识着两个数是否相等, 符号标志位标识着两个数的大小. ;它后面经常跟着跳转指令; Test26_4.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain 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 说明前者 < 后者)?   ?   retmain endpend main


辨析 NEG 与 NOT

; Test26_5.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data??   val sword ?.codemain 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?   retmain endpend main

热点排行