[英]How to do the opposite of sign extend from a 16-bit register to a 8-bit register?
我正在使用x86 Assembly,並且遇到了使用MUL
指令的需求。
我的代碼片段曾經是這樣的:
mov al, <some_number>
mul bl
add al, [edi]
mov [edi], al
如果<some_number>
是在此Assembly片段之外定義的常量,則它可以是正數或負數。 bl
寄存器在代碼的前面設置,始終為正(因為只要合適,它只會上溢/下溢)。 我也可以優化最后兩個語句以add [edi], al
但是我不確定100%,所以我暫時不會這樣做。
所以我的程序在檢查了很長時間可能出了問題之后遇到了不確定的行為,在這種情況下是一個無限循環,我發現我必須使用IMUL
因為<some_number>
可能為負。
但是現在它仍然不起作用。 然后我再次查看手冊,發現mul bl
實際上將結果存儲在ax
。 所以我在ax
有一個帶符號的結果,而我想要在al
有一個無符號(帶上溢/下溢)的結果。
所以我的問題是:如何將ax
中的簽名結果變成al
的未簽名結果? 基本上與符號擴展相反。
注意:我在這里也包括了思考過程,因為很有可能我做的事情與預期不符,因此到目前為止我找不到答案。
我無法正確理解問題以及評論中的后續措施。 讓我知道這是否根本不是答案。
我還發現該答案可能是@Jose答案的一個克隆,因此我正在考慮刪除它,特別是如果我發現我誤解了這個問題。
使用imul bl
我們可以:
AL
(但結果被符號擴展到AX
)。 AL
。 在后一種情況下, 您必須選擇要做什么。
通常你必須是按比例的結果返回到8位,這可以是作為解決的比例為簡單的2 16:2 8 = AX:AL為AL或可以是更復雜的(包括不是一個刻度或任何線性操作在所有)。
在前一種情況下,我們需要計算結果的絕對值。
由於情況1假設結果適合AL
,所以寄存器AH
要么全為零,要么全為1,與AL
的符號位匹配。
imul bl ;Original code
xor al, ah ;NOT AL iif the result is negative
sub al, ah ;AL = AL - (-1) = AL + 1 iif the result is negative
這利用眾所周知的身份,以二進制補碼neg(x)= not(x)+ 1 。
這是我在示例中的觀點:如果相乘的結果為負,則表示NEG
,如果為正,則不表示NEG
(我在其中一個編譯器中運行此代碼):
mov bl, -5 ;◄■■ NEGATIVE NUMBER.
mov al, 10
imul bl ;◄■■ AX = -50 (0xFFCE).
cmp ax, 0
jl negative ;◄■■ IF AX < 0 JUMP TO NEGATIVE.
jmp continue ;◄■■ IF AX >= 0 SKIP NEGATIVE.
negative:
neg ax ;◄■■ AX => POSITIVE (0xFFCE => 0x32).
continue:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.