Строка загрузки сборки ARM производит странный вывод терминала

Я пытаюсь расширить свою строку, заменив каждый символ строкой пробела в сочетании со строкой подчеркивания, чтобы создать _ _ _ _.

Однако я получаю странный результат:
Строка загрузки сборки ARM производит странный вывод терминала

Если я загружаю 1 символ, например, ldr r1, = '_'
это работает, однако я получаю _____ и пытаюсь получить _ _ _ _ _. Как лучше всего это сделать?

ПРИМЕЧАНИЕ. Я не знаю C и новичок в ARM.

Моя функция:

sub r3, r0, #1 @has the length
    ldr r0, = buffer @has the word

    mov r5, #0 @start of increment
    mov r6, r0 @copies word to r6
loop:
     ldr r1, =spaceChar
     strb r1, [r6, r5]
     add r5, r5, #1
     cmp r3, r5
     bne loop
    mov r1,r6 
    ldr r0, = HiddenWord
    bl printf
    pop {r4,lr}
    bx lr
 
.data
 
    HiddenWord: 
        .asciz "Word: %s"
    spaceChar:
        .asciz " _"
    buffer:
        .space 100

Вы действительно должны проконсультироваться с документацией, по крайней мере, для функций, которые вы пытаетесь использовать. strcat ожидает строку (как следует из названия), но вы передаете char. Это будет ошибкой.

Jester 14.12.2020 00:00

Понятно, я просто предположил, что это будет работать и с символами, поскольку строки - это просто массив символов. Мой плохой, есть ли способ, которым я все еще могу достичь того, чего хочу?

MazeMaster51 14.12.2020 00:03

@ MazeMaster51 Создайте строку из двух символов (нужный символ и разделитель NUL) и поместите ее в память. Передайте адрес этой строки. Как вы ожидали, что strcat узнает, что переданное вами число является символом, а не адресом строки?

fuz 14.12.2020 00:08

Как я указывал в предыдущих комментариях, strcat и другие библиотечные функции могут перезаписывать r0,r1,r2,r3. Вы не можете хранить данные в этих регистрах через вызов функции. Если вы собираетесь вызывать функции C, вы должны понимать соглашения о вызовах.

Nate Eldredge 14.12.2020 00:14

Кроме того, ваш цикл не будет делать то, что вы хотите, и вам даже не нужно strcat, вы можете просто сохранить необходимое количество «\ t_» напрямую. Вы уверены, что вам нужна табуляция, а не пробел?

Jester 14.12.2020 00:14

Вижу спасибо за наводку. @Jester Раньше я пытался сделать это напрямую, но терминал по какой-то странной причине распечатал только YYYYYY. Я сохранил spaceChar .asciz "\t_" в памяти, а затем вызвал его, используя ldr r1, =spaceChar, затем strb r1, [r6, r5]. По какой-то причине все символы превратились в «Y». Я бы предпочел пробел, если это проще, я предположил, что вкладка будет проще, поскольку она обозначается /t.

MazeMaster51 14.12.2020 00:20

Также .byte 100 объявляет один байт со значением 100. Вы, вероятно, хотели .space 100 или подобное.

Jester 14.12.2020 00:33

Спасибо, что указали на это, но после внесения этого изменения я получаю странный вывод на терминале. Нельзя ли заменить символ строкой?

MazeMaster51 14.12.2020 00:41

Вы сохраняете указатель, а не значение. Кроме того, 2 символа — это полуслово. В любом случае, поскольку вы уже статически выделяете буфер, самое простое решение - установить его с помощью "_" с помощью вашего ассемблера и просто поместить завершающий ноль в нужное место.

Jester 14.12.2020 00:48

Не разрушайте свои вопросы, удаляя весь код.

Peter Cordes 15.12.2020 15:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы уже статически выделяете буфер, самое простое решение - установить его с помощью "_" с помощью вашего ассемблера и просто поместить завершающий ноль в нужное место. Я не думаю, что вы упомянули, какой ассемблер вы используете, в ассемблере gnu работает следующее:

    ldr r0, =buffer-1
    mov r1, #0
    strb r1, [r0, r3, lsl #1]

    ldr r0, =HiddenWord
    ldr r1, =buffer
    bl printf
    pop {r4,lr}
    bx lr
 
.data
 
    HiddenWord: 
        .asciz "Word: %s\n"
    buffer:
.rept 50
    .ascii "_ "
.endr

Если вы хотите заполнить буфер программно, это может выглядеть так:

    ldr r0, =buffer @has the word
    ldr r1, =0x205f @ underscore + space
loop:
    strh r1, [r0], #2
    subs r3, r3, #1
    bne loop
    mov r1, #0         @ replace final
    strb r1, [r0, #-1] @ space with zero

Другие вопросы по теме