首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

匯編雙字節有符號數補碼計算:低位求補+高位求反+進位優化

     編輯:程式設計綜合問答

題目

已知R6R7存放雙字節有符號數(高位R6,低位R7),求補碼存入R1R0(高位R1,低位R0)。

算法原理

補碼 = 反碼 + 1。雙字節按低位→高位傳播進位:

  1. 低字節(R7)求補:取反 + 1,產生進位CF。
  2. 高字節(R6)處理:
    • 若低字節產生進位(CF=1):高字節只需取反(因+1已由進位完成)。
    • 若無進位(CF=0):高字節取反 + 1。

代碼實現

; 輸入:R6R7 = 源雙字節有符號數
; 輸出:R1R0 = 補碼結果

    MOV A, R7       ; 低字節送A
    CPL A           ; 取反
    ADD A, #1       ; +1,產生進位CF
    MOV R0, A       ; 存低字節結果
    
    MOV A, R6       ; 高字節送A
    JNC NO_CARRY    ; 若無進位(CF=0)跳轉
    CPL A           ; 有進位:只需取反
    MOV R1, A
    SJMP DONE
NO_CARRY:
    CPL A           ; 無進位:取反
    ADD A, #1       ; 再+1
    MOV R1, A
DONE:
    ; 結果在 R1R0

關鍵指令解析

  • CPL A:A寄存器按位取反(反碼關鍵步驟)。
  • ADD A, #1:加1,結果影響CF(進位標誌)。
  • JNC / JC:根據CF跳轉,實現條件分支。

驗證示例

擴展:通用多字節補碼

從最低字節開始循環:取反 → 加1 → 判斷CF → 繼續高字節,直到最高字節。最高字節若仍有進位則丟棄(定點數溢出)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
原數 (R6R7)十進制低字節補碼高字節處理結果 (R1R0)十進制
0000 0014H+20ECH (CF=1)FFH (僅取反)FF ECH-20
FF EC H-2014H (CF=0)00H (取反+1)00 14H+20
80 00H-3276800H (CF=1)7FH (取反)80 00H-32768 (溢出,補碼特性)