晚上好。我正在做一項關于組裝的實驗室作業。我必須比較 3 個數字 -8、-2 和 11 才能得到最大的值。我將它們翻譯成額外的代碼并用十六進制表示法表示。所以我得到了錯誤的答案,因為 -2 = FE > 11 = B。問題是我如何正確比較這些數字?我使用 nasm,x86。
uj5u.com熱心網友回復:
比較指令以及幾乎所有算術指令都會修改狀態暫存器中的一組標志。
標志的修改與指令的意圖無關——例如,奇偶標志或輔助標志的修改與檢查該標志狀態的(很少)需要無關。
當-2與11比較,或者-2減去11時,處理器實際上并不知道-2是負數;取而代之的是 0xfe - 0x0b 被計算,它不會溢位,因此 CarryFlag == 0。也因為結果不為零, ZeroFlag == 0 也是如此。由于 0xFE 與 0x0b 的符號不同,因此 OverflowFlag == 0 也是。
所有這些 OF、ZF、CF 的不同組合映射到更高級別的抽象,例如unsigned <= unsigned、any != any、signed > signed。在英特爾架構中,'Below / Above' 指的是無符號比較,'Greater / Less' 指的是有符號比較——同樣的一組標志可以指多個抽象,例如JC (參見http://unixwiz.net/techtips/ x86-jumps.html )
您可能需要的有符號比較的子集是JG或者它的補碼JNG,它代表 Jump Not Greater,它等于JLE或 Jump Less 或 Equal。
除了條件分支之外,x64 指令集還支持暫存器的條件設定/移動,armv7 允許條件執行大多數指令,而 armv8 允許條件執行一些有趣的指令序列(如a = b iff LessThan, else a = c 1)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/374960.html
