Как я могу преобразовать прописные буквы в строчные в ARM Assembly? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть следующая программа:

 .data
 cc: .byte 0x42
     .byte 0x4f
     .byte 0x4e
     .byte 0x4a
     .byte 0x4f
     .byte 0x55
     .byte 0x52
     .byte 0x00
co: .asciz "au revoir..."

    .text
    .global main
main:

@ impression de la chaine de caractere d'adresse cc
     ldr r1, LD_cc
     bl EcrChaine

@ modification de la chaine d'adresse cc
    @To be completed

@ impression de la chaine modifiee
     ldr r1, LD_co
     bl EcrChaine

fin: B exit  @ terminaison immediate du processus (plus tard on saura faire mieux)

LD_cc: .word cc
LD_ca: .word ca
LD_co: .word co

cc содержит строку "BONJOUR" заглавными буквами. В части «для завершения» я должен взять эту строку и преобразовать ее строчными буквами, используя побитовую операцию ИЛИ (команда ORR). Насколько я понимаю, так как строка использует таблицу ASCII, все, что мне нужно сделать, это добавить 32 к каждому символу. Соответствующая команда ORR R1, R1, #32, однако я пытаюсь это сделать, и при запуске программы вывод пустой. Я пытался использовать онлайн-эмулятор, чтобы увидеть изменения в значениях, но я вижу, что меняется только первая буква. Нужно ли использовать al oop? Кто-нибудь может мне помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Просто добавьте слово, которое вы хотите конвертировать 0x20.

0 голосов
/ 18 февраля 2020

Спасибо за комментарии. Я решил свою проблему. Я не использовал al oop, потому что «это урок следующей недели», но вот как я это сделал:

Сначала я загрузил первые 4 символа в R2 (я не уверен, что смогу загрузить больше но эмулятор, который я использовал, может хранить до 8 байт. Символ равен 2 байта, то есть 4 символа):

LDR r2, [r1]

и число 32 внутри R3:

MOV R3, 0x20

Затем для каждого символа я повторил эту последовательность инструкций:

ORR r2, r3, r2
LSL r3, r3, #8

Я использовал LSL, чтобы умножить значение R3 (в десятичном формате 32, в шестнадцатеричном 0x20) на 2 в степени 8 (то есть умножить на 256 ). В результате с каждым LSL добавлялось 2 нуля после моего номера, и я мог использовать инструкцию ORR для следующего символа.

После того, как я закончил с первым набором символов, я сохранил их в памяти и загрузил второй:

STR r2, [r1]
ADD r1, r1, #4
LDR r2, [r1]

Я снова инициализировал R3 в 32:

LSR r3, r3, #24

и повторил ORR и LSL еще 3 раза. Я сохранил этот набор символов рядом с первым, а затем вернулся к началу моей строки и вызвал мою функцию, которая печатает строку на терминале:

STR r2, [r1]
SUB r1, r1, #4
bl EcrChaine

, которая отлично работала. Полученный файл, однако, очень большой с точки зрения количества строк и может быть существенно уменьшен с помощью al oop, но я пока не использовал его, потому что «нас этому еще не учили в классе».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...