2012-02-29 19 views
3

ARMアセンブリで2D配列を印刷するにはどうすればよいですか? 私は各行を取って、それをヌル終了文字列に変えようとしていますが、最初の数字だけが表示されます。次の番号に移動するにはどうしたらいいですか?ARMの2D配列の印刷

私はこう言いました:配列を印刷するには、配列をループして一度に1要素ずつ印刷するサブルーチンを書くのが最善です。 printfは1つの引数しか取らず、アセンブリ言語と同様に、配列は単なるロードであり、printfは最初のものだけを出力します。あるいは、ボードをヌル終了文字列にするサブルーチンを書くこともできます。どちらの場合でも、サブルーチンはボードを印刷してうまくフォーマットすることができます。

しかし、私はそれをこの方法を行う方法を理解する:

AREA Countdown, CODE, READONLY 
IMPORT main 
IMPORT getkey 
IMPORT sendchar 
IMPORT printf 
EXPORT start 

start 

    LDR R3, = teststr 
    LDR R4, = array 
wh1  LDRB R0, [R4] 
    CMP R0, #0 
    BEQ stop 
    ADD R0, R0, #0X30 
    STRB R0, [R3] 
    ADD R3, R3, #1 
    ADD R4, R4, #1 
    B wh1 



stop B stop 

AREA Strings, DATA, READWRITE 


teststr DCB "",0 


array DCD 6, 3, 8, 2, 5, 2, 9, 1 
    DCD 3, 7, 2, 8, 5, 7, 2, 6 
    DCD 2, 4, 7, 4, 2, 6, 7, 4 
    DCD 1, 9, 3, 2, 9, 5, 6, 8 
    DCD 7, 5, 3, 7, 5, 8, 2, 1 




END     

答えて

1

あなたのプログラムは、それに関連付けられているいくつかの問題があります。 1つは、目的の文字列のスペースを予約していないため、割り当てられていないメモリに書き込むことです。もう一つは、改行文字を出力していないということです。

ROW_LENGTH equ 8 

start 

    ldr r3, = teststr 
    ldr r4, = array 
    mov r2, #ROW_LENGTH-1 ; numbers displayed per row 
wh1 ldrb r0, [r4],#1 
    orrs r0,r0,#0x30 ; add '0' to our digit 
    bmi end_of_data ; end of source data 
    strb r0,[r3],#1 
    subs r2,r2,#1 
    moveq r1,#0xd ; carriage return 
    streqb r1,[r3],#1 
    moveq r1,#0xa ; line feed 
    streqb r1,[r3],#1 
    moveq r2,#ROW_LENGTH-1 ; reset row counter 
    b wh1 
end_of_data mov r0,#0 ; store string terminator 
    strb r0,[r3] 
    ; your return address in LR will no longer be preserved after the call to printf 
    ; so you need to push/pop it to return to the caller 
    ldr r0,=teststr ; print the output 
    bl printf 

teststr DCB "                  ",0 


array DCD 6, 3, 8, 2, 5, 2, 9, 1 
    DCD 3, 7, 2, 8, 5, 7, 2, 6 
    DCD 2, 4, 7, 4, 2, 6, 7, 4 
    DCD 1, 9, 3, 2, 9, 5, 6, 8 
    DCD 7, 5, 3, 7, 5, 8, 2, 1 
    DCD -1  ; array terminator 
+0

私は理解できないコマンドがあります。ありがとうございます。 BMI、ORRS、MOVEQ、STREQBと同様です。彼らは何のために立っていますか? –

+0

このアレイをコンソールに表示するにはどうすればよいですか? –

+0

printfをexternとして参照しています...それを:)と呼んでください。 R0 =最初のパラメータ、R1 =秒など – BitBank

関連する問題