Я пытаюсь расширить свою строку, заменив каждый символ строкой пробела в сочетании со строкой подчеркивания, чтобы создать _ _ _ _
.
Однако я получаю странный результат:
Если я загружаю 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
Понятно, я просто предположил, что это будет работать и с символами, поскольку строки - это просто массив символов. Мой плохой, есть ли способ, которым я все еще могу достичь того, чего хочу?
@ MazeMaster51 Создайте строку из двух символов (нужный символ и разделитель NUL) и поместите ее в память. Передайте адрес этой строки. Как вы ожидали, что strcat
узнает, что переданное вами число является символом, а не адресом строки?
Как я указывал в предыдущих комментариях, strcat
и другие библиотечные функции могут перезаписывать r0,r1,r2,r3
. Вы не можете хранить данные в этих регистрах через вызов функции. Если вы собираетесь вызывать функции C, вы должны понимать соглашения о вызовах.
Кроме того, ваш цикл не будет делать то, что вы хотите, и вам даже не нужно strcat
, вы можете просто сохранить необходимое количество «\ t_» напрямую. Вы уверены, что вам нужна табуляция, а не пробел?
Вижу спасибо за наводку. @Jester Раньше я пытался сделать это напрямую, но терминал по какой-то странной причине распечатал только YYYYYY. Я сохранил spaceChar .asciz "\t_" в памяти, а затем вызвал его, используя ldr r1, =spaceChar, затем strb r1, [r6, r5]. По какой-то причине все символы превратились в «Y». Я бы предпочел пробел, если это проще, я предположил, что вкладка будет проще, поскольку она обозначается /t.
Также .byte 100
объявляет один байт со значением 100. Вы, вероятно, хотели .space 100
или подобное.
Спасибо, что указали на это, но после внесения этого изменения я получаю странный вывод на терминале. Нельзя ли заменить символ строкой?
Вы сохраняете указатель, а не значение. Кроме того, 2 символа — это полуслово. В любом случае, поскольку вы уже статически выделяете буфер, самое простое решение - установить его с помощью "_" с помощью вашего ассемблера и просто поместить завершающий ноль в нужное место.
Не разрушайте свои вопросы, удаляя весь код.
Поскольку вы уже статически выделяете буфер, самое простое решение - установить его с помощью "_" с помощью вашего ассемблера и просто поместить завершающий ноль в нужное место. Я не думаю, что вы упомянули, какой ассемблер вы используете, в ассемблере 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
Вы действительно должны проконсультироваться с документацией, по крайней мере, для функций, которые вы пытаетесь использовать.
strcat
ожидает строку (как следует из названия), но вы передаете char. Это будет ошибкой.