Olá,
Estou tentando fazer o programa proposto na Aula 5:
Usando a sintaxe Intel, faça um programa em linguagem de montagem que leia um texto da entrada padrão, passe-o para letras maiúsculas e jogue o resultado para a saída padrão. Caracteres que não são letras minúsculas devem permanecer inalterados.
Surgiram algumas dúvidas/problemas:
A primeira, é como fazer ler da entrada padrão:
Ao fazer
mov edx, 256
mov ecx, buffer
mov ebx, 0
mov eax, 3
int 0x80
equivale, de certa forma, a um scanf em C? Isto é, o programa irá ficar "parado" até que seja dada uma entrada pela entrada padrão? E cada caractere (até um máximo de 256) será armazenado em um byte sequencial, iniciado em buffer? Este foi meu entendimento quando fiz meu programa. Porém, o que acontece se fornecermos uma entrada menor do que 256 bytes? Como fazer para saber o tamanho da entrada fornecida, a fim de evitar que tenhamos que analisar dois parâmetros para parar (se já passou por 256 caracteres ou se o próximo caractere é nulo). Poderia somente comparar com o tamanho da string.
Tive um erro ao montar o programa, na linha
timer 256 buffer db 0
dizendo
error: parser: instruction expected
Não consegui encontrar resposta para esse erro procurando pela internet, porém pelo que li me deu a impressão de ser um erro de sintaxe. Mas foi esse o código que foi passado em aula (a não ser que eu tenha copiado errado!).
Outra dúvida: o comando acima cria bytes com 0 ou nulos?
Tenho uma outra dúvida, porém não relacionada a esse programa: meu computador possui processador de 64 bits, mas uso Ubuntu 32 bits. Isso significa que o código de Assembler é exatamente o mesmo?
Obrigado,
Martin
Porém, o que acontece se fornecermos uma entrada menor do que 256 bytes? Como fazer para saber o tamanho da entrada fornecida, a fim de evitar que tenhamos que analisar dois parâmetros para parar (se já passou por 256 caracteres ou se o próximo caractere é nulo). Poderia somente comparar com o tamanho da string.
Se você utiliza menos de 256 bytes, a chamada ao núcleo sys_read irá lhe devolver em eax o tamanho da string lida.
Se você utiliza menos de 256 bytes, a chamada ao núcleo sys_read irá lhe devolver em eax o tamanho da string lida.
Tive um erro ao montar o programa, na linha
timer 256 buffer db 0
dizendo
error: parser: instruction expected
O que você está utilizando para montar, o NASM? E nessa linha, você quer é alocar um "buffer" de 256 bytes, é isso? Eu faria assim:
Sobre 0 e NULL, se eu entendi a sua pergunta, você confunde o número zero com o código do número zero, não?
Pela tabela ASCII, o código de NULL é 0 (0x0 em hexadecimal), então ter esse valor em algum lugar (digamos, no registrador AH) é *diferente* de ter o número zero (60 ou 0x48 na tabela ASCII).
[]s,
timer 256 buffer db 0
dizendo
error: parser: instruction expected
O que você está utilizando para montar, o NASM? E nessa linha, você quer é alocar um "buffer" de 256 bytes, é isso? Eu faria assim:
SECTION .bss buffer resb 256 SECTION .text (segue... )Pelo comando acima, você está reservando 256 bytes, a partir do endereço apontado por buffer.
Sobre 0 e NULL, se eu entendi a sua pergunta, você confunde o número zero com o código do número zero, não?
Pela tabela ASCII, o código de NULL é 0 (0x0 em hexadecimal), então ter esse valor em algum lugar (digamos, no registrador AH) é *diferente* de ter o número zero (60 ou 0x48 na tabela ASCII).
[]s,
Em resposta à Martin Ichilevici de Oliveira
Re: Dúvidas - Exercício da Aula 5
por Felipe Lamberti Amado -
não era "times"?
usando
buffer times 256 db "0",0x1
ele montou aqui, só nao sei se fez o que a gente queria hehe
buffer times 256 db "0",0x1
ele montou aqui, só nao sei se fez o que a gente queria hehe
Em resposta à Felipe Lamberti Amado
Re: Dúvidas - Exercício da Aula 5
Estou usando o NASM.
Ao usar os dois comandos sugeridos (um pelo Marcelo e outro pelo Felipe) para a declaração do buffer, passo a receber a mensagem de erro
error: beroset-p-650-invalid effective address
na linha
mov eax, [buffer+cont]
Ao usar os dois comandos sugeridos (um pelo Marcelo e outro pelo Felipe) para a declaração do buffer, passo a receber a mensagem de erro
error: beroset-p-650-invalid effective address
na linha
mov eax, [buffer+cont]