0

仕様によると、私の出力は次のようになります。

00:00
00:01
00:12
01:23
12:34
23:45
34:56
45:67
56:78
67:89
78:9A
89:AB
9A:BC
AB:CD
BC:DE
CD:EF
DE:F0
EF:01
F0:12
01:23
12:34

等々。私は 2 つのアセンブリ サブルーチンを作成しました。1 つは 16 進数の変換を行い、もう 1 つはテスト プログラムから出力する数字を取得します。現在、次のような出力が得られています。

0:
1:
2:
3:
4:
5:
6:
7:
8:
9:
A:
B:
C:
D:
E:
F:
0:
1:
2:
3:
4:
5:

だから、一番右の数字を正しく取得しているように見えますが、残りの数字を取得するにはどうすればよいですか? 宿題にそう書いてある

例: メモリ位置 0x0047114 にはバイナリ値 0101 0011 (16 進数 0x53) が含まれます メモリ位置 0x0047115 にはバイナリ値 0001 0110 (16 進数 0x16) が含まれます メモリ位置 0x0047116 にはバイナリ値 0000 0000 (16 進数 0x00) が含まれます(16 進数 0x00) 呼び出し側はレジスタ r4 を 0x0047114 に設定し、puttime を呼び出します。puttime は、新しい行に 16:53 を出力します。

私が最近投稿した同じ課題であるが、その他の部分に焦点を当てている他の質問から、より多くの背景が利用できます。

https://stackoverflow.com/questions/12105322/how-to-proceed-coding-for-this-assignment

ロードワードとムーブの違いは?

https://stackoverflow.com/questions/12152323/why-is-load-word-not-working

変換を行う私のプログラムは次のとおりです。

.global hexasc 

        .text
        .align 2

hexasc: movi r8, 0x09
        movi r9, 0x0f
        andi r4, r4, 0x0f #keep only 4 bits
        bgt r4, r8, L1  #is x>9?
        movi r2, 0x30
        add r2, r2, r4  
        andi r2, r2, 0xff
        ret  

L1:     movi r2, 0x37
        add r2, r2, r4
        andi r2, r2, 0xff
        ret

上記は正しく機能していると思いますが、変数を取得してサブルーチンに渡す中間部分をプログラムする方法がわかりません。

.macro PUSH reg
        subi    sp, sp, 4
        stw     \reg, 0(sp)
.endm

.macro POP reg
        ldw     \reg, 0(sp)
        addi    sp, sp, 4
.endm

.global puttime 

        .text
        .align 2

puttime: 
        PUSH r31
        ldw r8,0(r4)            # put the variable in register 8
        PUSH r8
        nop
        movi r4, 0x0A           # put newline char in register 4
        movia   r9,putchar      # copy subroutine address to a register
        callr   r9              # call subroutine via register
        POP r8
        mov r4, r8
        call hexasc
        mov r4, r2
        movia   r9,putchar      # copy subroutine address to a register
        callr   r9
        movi r4, 0x3A
        movia r9, putchar
        callr r9
        POP r31
        ret

どんな助けでも大歓迎です。

4

1 に答える 1

1

入力データの16進数ごとに1回、hexscを2回呼び出す必要があると思います。hexsc は入力データの下位 4 ビットのみを変換するため、hexsc の呼び出しごとに入力データを 4 ビット右にシフトする必要があります。

ところで、PUSH と POP の使用は慣用的な MIPS コードではありません。MIPS では通常、ルーチンへのエントリでスタック ポインタから定数値を減算し、ルーティングからの終了時に定数値を加算します。このような:

puttime:
  subi sp, 8       # reserve space for 2 words on the stack
  sw   r31, 4(sp)
  ...
  lw   r31, 4(sp)
  addi sp, 8
  ret
于 2012-08-30T23:53:55.040 に答える