Преобразование всех строчных символов в прописные в сборке x86 - PullRequest
0 голосов
/ 30 апреля 2018

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

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