Manipulando strings em assembly x86-64
Nesta atividade, vamos manipular strings usando assembly GNU para Linux x86-64. Os programas são montados e executados nativamente no Linux, não é mais necessário usar o QEMU para emular o processador.
Exemplo
O programa minuscula.s lê uma string da entrada padrão, converte as letras de A a Z para minúsculas e imprime o resultado:
- O buffer de 128 bytes fica na seção
.bss. - Em Linux x86-64, o número da syscall é passado em
rax; os argumentos ficam emrdi,rsi,rdx,r10,r8er9. A instruçãosyscallsolicita o serviço ao kernel. readusa o número0, e o total de bytes lidos retorna emrax. O exemplo guarda esse valor emr12para usá-lo no laço e na impressão.- O laço percorre os bytes com
r13como ponteiro er14como contador. As comparaçõesjbejaignoram caracteres fora do intervalo ASCIIA-Z. - As letras minúsculas estão 32 posições depois das maiúsculas na tabela ASCII.
or $0x20, %alativa o bit correspondente e o resultado é gravado no buffer. writeusa o número1;exitusa o número60.
O código usa a sintaxe AT&T do GNU assembler: registradores levam %, valores imediatos levam $ e a ordem dos operandos é origem, destino.
Agora é a sua vez!
- Usando este programa como exemplo, complete maiuscula.s para converter as letras minúsculas para maiúsculas.
- Complete inverte.s para inverter a string sem modificar os caracteres.
Montagem e execução
No Linux x86-64, instale o GNU Binutils se necessário e execute os testes:
Para testar somente um programa: ./tests/run.sh minuscula. O runner monta com as --64, liga com ld -m elf_x86_64 e executa o binário diretamente no Linux. Os testes de maiuscula e inverte passam depois que os exercícios forem implementados.