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,
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
;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
ret
main
endp
end main
符号扩展指令的本质
;一个正数(无符号)或负数(有符号)在扩展储存空间时, 使用这些指令可保证原值不变
; Test25_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 al,
68
cbw
PrintHex
ax ;0044
PrintDec
ax ;68
mov al, -
68
cbw
PrintHex
ax ;FFBC
PrintDec
ax ;-68
ret
main
endp
end main
CBW、CWDE 和 MOVSX 的关系
; Test25_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
;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
ret
main
endp
end main
转载请注明原文地址: https://www.6miu.com/read-41234.html