2011-12-21 7 views
0

私は開発中のM68kコンピュータ用の小さなOSを書いていますが、少し問題があります。私はそれを行うために、次のコードを書いたユーザーに進(31)16進値(たとえば$ 1F)を表示できるようにする必要がありますが、それはいくつかの問題があります。m68k十進法から十進法へ正しく動作しない

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

実際に10進数に変換しようとしません。元の値が10..15 mod 16の範囲にある場合は6を加算します。何も出力せず、レジスタに変更した値を返します。なぜあなたはこれが実際に何か役に立つことを期待していますか? –

答えて

3

数字を10進数として出力しようとしている場合、一度に1つのニブルを処理することでそれを行うことはできません。 2のべき乗と10の累乗は、100 == 20 == 1以外には噛みません。

246又は8(決して0)を有する2つの端部の一方0非負のパワーを持つ10の端部の他の全ての非負のパワー。

これを解決するには、10のべき乗で除算を使用して、必要なものを得ることです。私たちはあなたのコードなどの操作と同じ種類のをやっているが、あなたが効果的にベース-10ではなくベース-16除算およびモジュラスをやっている

// Desired value is in num 

    push num      // example $1f/31 
    if num < 100 goto tens   // no hundreds, so skip 
    val = num/100 + '0' 
    output val 
    num = num % 100 

tens: 
    if num < 10 goto ones   // is >= 10 so do this bit 
    val = num/10 + '0'   // gives us '3' 
    output val 
    num = num % 10     // remainder is 1 

ones: 
    val = num + '0'    // gives us '1' 
    output val 
    pop num 

注:のようなアセンブリのような擬似コード。

あなたは自分で68kにその擬似コードを変換する必要があります。チップのコードをカットしてから約20年経ちました。

関連する問題