Uma solução para o exercício da Aula 5

Uma solução para o exercício da Aula 5

por Marcelo Reis -
Número de respostas: 3
Oi, povo!

Segue abaixo uma solução minha para o exercício da Aula 5; para montar utilizei o NASM e para ligar o comando ld:


; lc2uc.asm -- programinha em linguagem de montagem (notacao Intel)
; que recebe uma cadeia de caracteres da entrada padrao e devolve na
; saida padrao o mesmo texto com todas as letras em maiusculo.
; Supoe que:
; - a cadeia lida tenha tamanho estritamente menor que "len".
; - sejam utilizados os caracteres 0x0 a 0x7F da tabela ASCII.
;
; M.S.Reis, 9.mar.2010.


SECTION .data
STDIN equ 0 ; codigo da entrada padrao
STDOUT equ 1 ; codigo da saida padrao
len equ 1024 ; tamanho do buffer

SECTION .bss
buf resb len ; aloca um buffer de tamanho len


SECTION .text
global _start
_start:

 ; le uma cadeia de caracteres da entrada padrao
 mov edx, len-1 ; tamanho maximo da mensagem
 mov ecx, buf ; apontador para o buffer (mensagem)
 mov ebx, STDIN ; codigo do handler utilizado (entrada padrao)
 mov eax, 3 ; codigo de sys_read
 int 0x80 ; chama o nucleo do sistema

 ; converte as letras da cadeia lida em maiusculas
 mov edx, eax ; eax guardou o tamanho da string lida, na syscall anterior
 mov ecx, 0 ; inicializa contador de posicao da string
iteraString:
 mov ah, [buf+ecx] ; guarda o caractere atual
 cmp ah, 0x61 ; verifica se ele esta' no "range" das letras
 jl verificaFim ; minusculas da tabela ASCII, ou seja, se
 cmp ah, 0x7a ; encontra-se entre 0x61 e 0x7a
 jg verificaFim ;
 sub ah, 0x20 ; caso encontre-se dentro do range, passa o
 mov [buf+ecx], ah ; caractere para maiusculo
verificaFim:
 inc ecx ; incrementa contador e verifica se chegou ao
 cmp ecx, edx ; final da string
 jne iteraString ;

 ; escreve a nossa nova cadeia na saida padrao
 ; (lembrete: o tamanho da mensagem ja se encontra em edx)
 mov ecx, buf ; apontador para o buffer (mensagem)
 mov ebx, STDOUT ; codigo do handler (saida padrao)
 mov eax, 4 ; codigo de sys_write
 int 0x80 ; chama o nucleo do sistema

 ; retorna ao sistema
 mov ebx, 0 ; codigo de saida (0, tudo ocorreu bem)
 mov eax, 1 ; numero de sys_exit
 int 0x80 ; chama o nucleo do sistema

Em resposta à Marcelo Reis

Re: Uma solução para o exercício da Aula 5

por Samuel Plaça de Paula -
Oi Marcelo!

Primeiro... você poderia explicar o que fez ali na seção bss? sorriso

De qualquer modo, eu tentei fazer esse programa baseado no seu mas algo está dando errado. Ele lê a string de stdin e depois imprime exatamente a mesma string!

Se você puder dar uma olhada pra ver o que está errado... sorriso
Em resposta à Samuel Plaça de Paula

Re: Uma solução para o exercício da Aula 5

por Marcelo Reis -
Eu inicializei a variável "buffer" no segmento .bss, mas poderia tê-lo feito em .data; o segmento .bss permite reservar espaço para variáveis não-inicializadas. Para maiores informações sobre as diferenças entre .data e .bss consulte o verbete ".bss" na wikipédia inglesa.

Sobre o seu programa, envie-o para o meu email que darei uma olhadinha!

[]s,