一、CWD是什麼指令
CWD指令(convert word to double word)是將16位有符號寄存器中存儲的有符號整數轉換為32位有符號整數的指令。CWD指令將16位寄存器AH中的符號位擴展到16位寄存器DX中,然後將16位有符號寄存器AX的內容擴展到32位有符號寄存器DX:AX中。
mov ax, -1234 ; AX = 0xFB2E
cwd ; DX:AX = 0xFFFFFB2E (將符號位擴展到DX寄存器,AX中的值不變)
上述代碼中,先將16位有符號數-1234存儲到AX寄存器中,使用CWD指令將AX寄存器中的值擴展到32位的DX:AX寄存器中,其中符號位為1,表示-1234。
二、CWD與DW指令的區別
CWD指令是用於將16位有符號寄存器中的值轉換為32位有符號整數,而DW指令則是將16位寄存器中存儲的無符號整數或者內存中的數據轉換為32位整數。在DW指令中,高位全部填充為0,而在CWD指令中高位要填充符號位。
mov ax, 1234 ; AX = 0x4D2
cwd ; DX:AX = 0x000004D2 (將符號位擴展到DX寄存器,AX中的值不變)
mov bx, ax ; BX = 0x4D2
mov cx, 5678 ; CX = 0x162E
add cx, ax ; CX = 0x1B00
mov dx, 0 ; DX = 0x0000
mov ax, 1234 ; AX = 0x4D2
add ax, dx ; AX = 0x4D2
上述代碼中,首先將16進位數0x1234存儲到AX寄存器中,使用CWD指令將AX寄存器中的值擴展到32位的DX:AX寄存器中,其中符號位為0,表示+1234。
三、位元組擴展指令CBW和CWD的差異
CBW指令(convert byte to word)是用於將8位有符號寄存器中的值轉換為16位有符號數的指令。CBW指令將8位寄存器AL中的符號位擴展到16位寄存器AX中。
mov al, -123 ; AL = 0x85 (補碼)
cbw ; AX = 0xFF85 (將符號位擴展到AX寄存器,AL中的值不變)
CWD指令與CBW指令的差別在於轉換的數值位數不同:CWD是16位的有符號數擴展為32位的有符號數,而CBW是8位的有符號數擴展為16位的有符號數。
四、FWDJOG指令實現FS機制下的CWD指令
FWDJOG指令(far jump on condition)是根據條件跳轉到目的地址的指令,可以在FS寄存器指向的段中執行操作,實現FS機制下的CWD指令。
assume fs:codeseg
codeseg segment
start:
mov ax, -1234 ; AX = 0xFB2E
fwdjnp endop ; 判斷carry flag是否為0,如果不為0則跳轉到endop
mov bx, ax ; 如果carry flag為0則執行mov指令
endop:
nop
codeseg ends
上述代碼中通過FWDJOG指令判斷carry flag是否為0,如果不為0則跳轉到endop,否則執行mov指令;這個過程中實現了FS機制下的CWD指令。
五、總結
CWD指令是將16位有符號寄存器中存儲的有符號整數轉換為32位有符號整數的指令。CWD指令與DW指令和CBW指令不同,在實現有符號數擴展的時候,需要按照符號位擴展高位。同時,FWDJOG指令可以實現FS機制下的CWD指令。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/302039.html