2012-02-29 81 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