已知R6R7存放雙字節有符號數(高位R6,低位R7),求補碼存入R1R0(高位R1,低位R0)。
補碼 = 反碼 + 1。雙字節按低位→高位傳播進位:
取反 + 1,產生進位CF。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跳轉,實現條件分支。| 原數 (R6R7) | 十進制 | 低字節補碼 | 高字節處理 | 結果 (R1R0) | 十進制 |
|---|---|---|---|---|---|
| 0000 0014H | +20 | ECH (CF=1) | FFH (僅取反) | FF ECH | -20 |
| FF EC H | -20 | 14H (CF=0) | 00H (取反+1) | 00 14H | +20 |
| 80 00H | -32768 | 00H (CF=1) | 7FH (取反) | 80 00H | -32768 (溢出,補碼特性) |