如果以下代碼導致大于 2^128 的結果會產生進位(出位)嗎?
mov rdx, -1 //rdx = 0xff...f
mov rax, -1 //rax = 0xff...f
mov rbx, -1 //rbx = 0xff...f
mul rbx //result will be bigger than 128 bits therefore will be pushed out of rdx
jc end
...
end: ret
所以我的問題歸結為使用組合暫存器 rax:rdx 進行mul
操作時進位標志的行為。jc
當結果大于 rax 時會自動查看 rdx 暫存器還是觸發?
uj5u.com熱心網友回復:
請參考英特爾手冊... https://www.felixcloutier.com/x86/mul#flags-affected
如果結果的上半部分(RDX、EDX、DX 或 AH)為零,則 MUL 清除 CF,否則為放。
mul
有兩個相同寬度的輸入。只有輸出是雙寬的。
CF 不用于測量整個事物的溢位,因為兩個 64 位被乘數不能產生 129 位結果,因此這種意義上的溢位是不可能的。
CF 實際上表示低半溢位。原始 8086 沒有非擴展乘法 ( imul ecx, esi
),因此您必須使用mul
orimul
即使您不關心高半結果。知道結果仍然適合一個暫存器可能很有用,尤其是在 16 位世界中,比 x86-64 更常見的值比最寬的可用暫存器更廣泛。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/469170.html