Печать двумерного массива в ARM - PullRequest
3 голосов
/ 01 марта 2012

Как распечатать 2D-массив в сборке 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                 

1 Ответ

1 голос
/ 01 марта 2012

С вашей программой связано несколько проблем. Во-первых, вы не резервируете место для строки назначения, поэтому вы будете писать в нераспределенной памяти. Другая причина в том, что вы не выводите символ новой строки.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...