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