在ARM中打印2D阵列

时间:2012-02-29 21:55:00

标签: assembly arm multidimensional-array

如何在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 个答案:

答案 0 :(得分: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