Я недавно заинтересовался изучением ассемблера и предложил себе простое упражнение, которое состоит в том, чтобы взять простую строку и преобразовать все строчные буквы в прописные. Но, поскольку я довольно новичок в этом, я не могу разобраться в некоторых деталях и заставить его работать.
EXIT = 1
WRITE = 4
LINUX_SYSCALL = 0x80
.data
lowerA: .ascii "a"
lowerZ: .ascii "z"
msg: .ascii "Hello, world!\n"
msglen = (. - msg)
i: .int 0
.text
.global _start
_start:
movl lowerA, %eax
movl lowerZ, %ebx
movl $msglen, %edx
movl $msg, %ecx
mov i, %esi
A1:
cmp %edx, %esi
jz fim
cmp %eax,(%ecx)
jge lowerThanZ
jmp next_pos
lowerThanZ:
cmp %ebx,(%ecx)
jle capitalize
jmp next_pos
#esta subrotina e que vai fazer a acao necessaria para mudar a letra para maiusculo
capitalize:
#THIS WOULD BE WHERE I WOULD CONVERT LOWERCASE TO UPPERCASE
jmp next_pos
#sub-rotina para fazer o incremento do counter, do registo e voltar para o inicio de A1
next_pos:
add $1, %ecx
inc %esi
jmp A1
#acaba aqui
fim:
sub %edx, %ecx
movl $1, %ebx
movl $WRITE, %eax # pedir write ao sistema
int $LINUX_SYSCALL # chama o sistema
movl $0,%ebx
movl $EXIT,%eax # pedir o exit ao sistema
int $LINUX_SYSCALL # chama o sistema
Вы видите, что код не полный, но я знаю, что он не работает
так как я использовал gdb (также кое-что, что я довольно плохо знаком с), чтобы отладить это.
Я уже видел, что цикл правильный (строка печатается в конце, но в исходном состоянии). Дело в том, что она не входит в подпрограмму с заглавными буквами, когда она должна.
Я знаю, что могу использовать значения ASCII, чтобы увидеть, какие из них соответствуют заглавным буквам. Но я так и не понял, как это сделать правильно. Из объема исследований, которые я провел, я понял, что если у нас есть строка / массив в регистре, регистр указывает на первую позицию указанной строки, и если я использую (регистр%), я получу содержимое этот адрес.
Так что я пытаюсь использовать cmp, чтобы сделать именно это, пытаясь увидеть, является ли текущий символ в нижнем регистре (между a-z). И я знаю, что в заявлениях cmp дела идут плохо, но я не могу понять, почему
Возможно, мне не хватает чего-то большого, поэтому я был бы очень признателен за любую помощь.
Я использую сборку IA-32 в Linux и использую следующие команды для сборки и компоновки:
as --32 -g -o hello.o hello.s
ld -m elf_i386 -o hello hello.o