我正在为正在开发的 M68k 计算机编写一个小型操作系统,但遇到了一个小问题。我需要能够以十进制(31)向用户显示十六进制值(例如 $1F)。我为此编写了以下代码,但它有一些问题:
ConvertHexByteToDecimal:
move sr, -(sp) ; Back up status register to stack.
move #$2700, sr ; Disable interrupts.
move.b d2, -(sp) ; Back up d2 to the stack.
and.b #$0F, d2 ; Get rid of the high nybble
cmp.b #$9, d2 ; Is the low nybble in the range of 0-9?
bgt.s @convertHex ; If not, branch.
move.b (sp)+, d3 ; Restore the 10's place from the stack
and.b #$F0, d3 ; Get rid of the low nybble
add.b d3, d2 ; Add the 10's place.
bra.s @done ; If so, branch.
@convertHex:
sub.b #$A, d2 ; Subtract $A from the hexadecimal meeper.
move.b (sp)+, d3 ; Restore the 10's place from the stack
and.b #$F0, d3 ; Get rid of the low nybble
add.b #$10, d3 ; Add 1 to the 10's place.
add.b d3, d2 ; Add the 10's place to the number.
@done:
move.b d2, d1 ; Copy to output register.
move (sp)+, sr ; Restore status register.
rts ; Return to sub.
该代码在高达 $F 的值上运行良好。例如,如果我输入 $B,它会输出 11。但是,一旦数字超过 $F,它就会开始被破坏。如果我输入 10 美元,我会输出 10 美元,以此类推。它总是在 $xF 之后回绕。
有没有人对它为什么这样做有任何想法?