2012-02-29 79 views
3

如何在ARM程序集中打印出2D陣列? 我試圖把每一行,然後把它變成一個空終止的字符串,但它只打印出第一個數字。我如何移動到下一個號碼?在ARM中打印2D陣列

我被告知:要打印數組,最好編寫一個子程序,循環遍歷數組,一次打印一個元素。 printf只接受一個參數,而在彙編語言中,數組只是一個數字的加載,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

你的程序有與之相關的幾個問題。一個是你沒有爲目標字符串保留空間,所以你會寫在未分配的內存上。另一個是你不輸出換行符。

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。他們代表什麼? – 2012-02-29 22:48:59

+0

如何將此數組顯示到控制檯? – 2012-02-29 22:56:36

+0

你正在引用printf作爲extern ...稱之爲:)。 R0 =第一個參數,R1 =秒等。 – BitBank 2012-02-29 23:00:52