【问题标题】:Printing a 2D array in ARM在 ARM 中打印二维数组
【发布时间】:2012-02-29 21:54:59
【问题描述】:

如何在 ARM 汇编中打印出二维数组? 我正在尝试获取每一行,然后将其转换为以空字符结尾的字符串,但它只打印出第一个数字。如何移动到下一个号码?

有人告诉我:要打印数组,最好编写一个循环遍历数组的子程序,一次打印一个元素。 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                 

【问题讨论】:

    标签: assembly arm multidimensional-array


    【解决方案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
    

    【讨论】:

    • 谢谢 aput 有一些我不明白的命令。像 BMI、ORRS、MOVEQ、STREQB。它们代表什么?
    • 如何将这个数组显示到控制台?
    • 您将 printf 作为外部引用...称之为:)。 R0 = 第一个参数,R1 = 第二个,以此类推
    • 在编写 ARM 代码之前,您需要阅读 ARM 汇编语言参考 ;)。 BMI = 如果为负则分支,ORRS = 逻辑或并设置标志,MOVEQ = 如果相等则条件移动,STREQB = 如果相等则条件存储字节。
    • 我只在 Comp Science 的第一名。我们还没有学会这些。将号码存储在内存中后,我应该调用 BL printf 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    相关资源
    最近更新 更多