我正在使用x86彙編,我已經開始使用MUL
指令了。如何做符號的反義擴展從一個16位寄存器到一個8位寄存器?
以前是這個我的代碼片斷:
mov al, <some_number>
mul bl
add al, [edi]
mov [edi], al
凡<some_number>
是本大會片段之外定義一個常數,它可以是正數或負。 bl
寄存器在代碼的早期設置,它總是正的(因爲它只是在每次合適時溢出/下溢)。我也可以優化最後兩條語句到add [edi], al
,但我不是100%確定的,所以我現在不會那樣做。
所以我的程序打了未定義的行爲,在這種情況下是一個無限循環,經過長時間檢查什麼可能是錯誤的,我想我必須使用IMUL
,因爲<some_number>
可能是負數。
但現在它仍然無法正常工作。然後,我再次查看手冊,並且看到mul bl
實際上將結果存儲在ax
中。所以我有一個ax
簽名的結果,而我想在al
無符號(具有上溢/下溢)結果。
所以我的問題是:如何把在ax
簽名的結果爲無符號之一al
?基本上與符號擴展相反。
注意:我在這裏也包含了我的思維過程,因爲我很可能做的事情並非如預期的那樣,因此目前我找不到答案。
符號擴展(如果它可以被稱爲)的相反是隻是截斷。這已經是你在做什麼了。所以,如果這是不對的,請解釋*應該發生什麼 – harold
@harold我對部分感到困惑。如果我有一個負16位數,那麼MSB將是1,是正確的?如果我繼續只使用較低的8位,那麼我已經基本完全丟失了符號位,不是嗎? – skiwi
這段代碼中沒有分支,那麼你遇到什麼問題?更多上下文將有所幫助正如哈羅德所說,如果ax是一個從8位整數擴展而來的有符號整數,那麼al就已經擁有你想要的。 – Andrew