学 Win32 汇编[25] - 符号扩展指令: CBW、CWDE、CDQ、CWD
CBW、CWDE、CDQ、CWD: 扩展指令
;CBW(Convert Byte to Word):? ? ? 将 AL 扩展为 AX;CWDE(Convert Word to Extended Double): 将 AX 扩展为 EAX;CDQ(Convert Doubleword to Quadword): 将 EAX 扩展为 64 位数 EDX:EAX;CWD(Convert Word to Doubleword):? 将 AX 扩展为 DX:AX;它们都是用符号位填充多出的空间;它们对 EFLAGS 无影响, 也无参数; Test25_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc ;CBW? mov al, 7Fh? cbw? PrintHex ax ;007F? ? mov al, 80h? cbw? PrintHex ax ;FF80? ;CWDE? mov ax, 7FFFh? cwde? PrintHex eax ;00007FFF? ? mov ax, 8000h? cwde? PrintHex eax ;FFFF8000? ;CDQ? mov eax, 7FFFFFFFh? cdq? PrintHex edx ;00000000? PrintHex eax ;7FFFFFFF? ? mov eax, 80000000h? cdq? PrintHex edx ;FFFFFFFF? PrintHex eax ;80000000? ;CWD? mov ax, 7FFFh? cwd? PrintHex dx ;0000? PrintHex ax ;7FFF? ? mov ax, 8000h? cwd? PrintHex dx ;FFFF? PrintHex ax ;8000? retmain endpend main
符号扩展指令的本质
;一个正数(无符号)或负数(有符号)在扩展储存空间时, 使用这些指令可保证原值不变; Test25_2.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc? mov al, 68? cbw? PrintHex ax ;0044? PrintDec ax ;68? ? mov al, -68? cbw? PrintHex ax ;FFBC? PrintDec ax ;-68? retmain endpend main
CBW、CWDE 和 MOVSX 的关系
; Test25_3.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc ;CBW 等价于 movsx ax, al? mov al, 80h? cbw? PrintHex ax ;FF80? ? mov al, 80h? movsx ax, al? PrintHex ax ;FF80? ;CWDE 等价于 movsx eax, ax? mov ax, 8000h? cwde? PrintHex eax ;FFFF8000? ? mov ax, 8000h? movsx eax, ax? PrintHex eax ;FFFF8000? retmain endpend main