读书人

学 Win32 汇编[25] - 符号扩充指令: C

发布时间: 2012-08-28 12:37:01 作者: rapoo

学 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

读书人网 >编程

热点推荐