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