m68k十六进制到十进制不能正常工作

时间:2011-12-21 04:15:24

标签: assembly motorola 68000

我正在为我正在开发的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之后收回。

有没有人对它为什么会这样做有任何想法?

1 个答案:

答案 0 :(得分:3)

如果您尝试输出一个十进制数字,则无法一次处理一个nybble。除了100 == 20 == 1之外,两个幂和十个幂都没有网格。

10的所有其他非负幂以0结尾,而2的非负幂以246或{{1}结尾}(从不8)。

要解决这个问题,我们的想法是使用十分之一的幂来获得你想要的东西。像汇编一样的伪代码:

0

请注意,我们正在执行与您的代码相同的操作,但您实际上是在执行base-16除法和模数而不是基数为10。

你必须自己将这个伪代码转换成68k,自从我为该芯片切割代码以来已经过去了大约20年。