Dúvidas - Exercício da Aula 5

Dúvidas - Exercício da Aula 5

por Martin Ichilevici de Oliveira -
Número de respostas: 5
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
Em resposta à Martin Ichilevici de Oliveira

Re: Dúvidas - Exercício da Aula 5

por Marcelo Reis -
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.
Em resposta à Martin Ichilevici de Oliveira

Re: Dúvidas - Exercício da Aula 5

por Marcelo Reis -
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:

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 -
Em resposta à Felipe Lamberti Amado

Re: Dúvidas - Exercício da Aula 5

por Felipe Lamberti Amado -
usando

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

por Martin Ichilevici de Oliveira -
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]