学 Win32 汇编[26] - 加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP
16lz
2021-04-30
学 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
posted on 2010-04-15 17:15 万一 阅读(18685) 评论(0) 编辑 收藏©著作权归作者所有:来自51CTO博客作者JLee79的原创作品,如需转载,请注明出处,否则将追究法律责任
更多相关文章
- 学 Win32 汇编[23] - 位测试与位扫描指令: BT、BTC、BTR、BTS、B
- 学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST
- 学 Win32 汇编[21] - 传送指令: MOV、LEA、XCHG、XLATB、XLAT、M
- 学 Win32 汇编[20]: 洞察标志寄存器
- 学 Win32 汇编[25] - 符号扩展指令: CBW、CWDE、CDQ、CWD
- jQuery中的$.ajax方法,以及基本的vue指令操作
- 深入理解计算机系统(4.1)------Y86指令集体系结构
- 冷月手撕408之操作系统(4)-操作系统的运行环境
- (lintcode)第1题 A+B问题