• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Zagor

Duvidas em Assembly

14 mensagens neste tópico

Boas,

Este é o meu 1º post no forum. E estou a precisar da vossa ajuda.

Ando a aprender assembly e basicamente tenho um trabalho para ser entregue em que consiste em ir a um ficheiro de texto buscar 2 operandos e os operadores, fazer o calculo e depois escrever esse resultado no mesmo ficheiro. Por exemplo:

No ficheiro:

23

15

+

Resultado escrito no final desse ficheiro:

38

Os calculos são feitos em hexadecimal. Tenho visto alguns códigos na net e tenho andado a tentar aprender e gostaria que me exclarececem algumas duvidas:

1)

branco	db	0xA

Isto é uma varíavel do chamado branco do tipo data byte.. mas não estou a preceber o que significa 0xA

2)Função para converter texto em numeros:

conv2num:
push	ebp
mov	ebp, esp
xor	edx, edx	; apaga edx
xor	eax, eax	; apaga eax
mov	esi, dword[ebp+8]
cld
mov	ecx, dword[ebp+12]
converte:
lodsb
cmp	al, '9'
jbe	algarismo
add	al, 9
algarismo:
and	al, 0xF
shl	edx, 4
or	edx, eax
loop	converte
mov	eax, edx
pop	ebp
ret

Este bloco de código, tem 2 particularidades que gostaria de vos perguntar... a primeira é a parte do 0xF em vez de 0xA   :P o que não estou mesmo a perceber o que isso quer dizer. a segunda é perguntar se isto está a converter para valores em hexadecimal.. binário ou octal e onde está isso especificado?

Não estou a pedir que me façam o programa, só estou a pedir que expliquem isto que vos tou a perguntar. Se poderem, agradecia  :)

Obgd.

Cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

1) Como na 2ª questão falas em valores hexadecimais, suponho que conheces essa base numérica. 0xA não é mais que a representação do valor hexadecimal A; outras representações seriam 0xB, 0x10, ou 0x1A. O 0x antes do número é para indicar que o mesmo se encontra na base 16.

2) A parte do 0xF está explicada em cima. No caso do and a1, 0xF está a colocar os bits superiores de maior valor de a1 a 0.

A representação dos números inteiros em memória é sempre feita da mesma maneira, por isso o texto não é convertido para nenhuma base em especial. Pegando no valor que tens em memória é que o podes representar em dada base.

Ou se preferires, os números são sempre armazenados em base binária; de cada vez que um é escrito no ecrã, é formatado para uma dada base.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A representação dos números inteiros em memória é sempre feita da mesma maneira, por isso o texto não é convertido para nenhuma base em especial.

O texto não é convertido para nenhuma base em especial porque é convertido sempre para binário, mas é muito diferente ele achar que está a ler decimal ou hexadecimal, por exemplo.

Isto porque a representação binário de 10 (em decimal) é diferente de 10 (em hexadecimal). São números completamente diferentes, logo o conversor tem que saber o que vai ler.

(isto sem saber x86, parti do principio que ele vai ler texto, logo ascii)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A minha resposta é directamente à pergunta dele:

a segunda é perguntar se isto está a converter para valores em hexadecimal.. binário ou octal e onde está isso especificado?

"converter para" e não "converter de"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas...

O teu código recebe um conjunto de caracteres que não são mais que a representação gráfica dos valores que tens no teu ficheiro.

Aquele 0xF como disse o TheDark, apagam a parte superior. Pegando na primeira linha do ficheiro, como primeiro caracter temos '2' que (pela tabela ASCII) é o valor 0x32 (hexadecimal) pelo que ao efectuar o AND resulta em 0x02. Como podes observar, o nibble inferior é o valor que precisas.

Através do SHL o code vai "enfiando" os valores no edx.

No final, ficas com o número 23 (decimal), 0x17 (hexadecimal), 0b00010111 (binário)... o resultado é sempre o mesmo, tens o mesmo valor em eax, podes é depois mostrá-lo de várias formas (bases).

Inté

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu agradeço bue a vossa ajuda. Consegui avançar um bom bocado no meu programa. Mas agora tou com um pequeno problema que não consigo resolver.

O meu objectivo agora é retirar uma parte de uma string até à mudança de linha.

Por exemplo, esta string:

20

30

+

Sei que o caracter de mudança de linha é o 0xA

E quero retirar o 20 desta string.

Tentei com isto

RetiraNum:
xor	eax,eax
xor	ebx,ebx
mov	esi,	strFich
mov	ebx,	strFich
cld
mov	ecx,	MAX_STRING
Retirar:
	lodsb
	cmp	al,	0xA
	je	End
	sub	ebx,eax

	loop	Retirar
End:
mov	strFich,ebx
ret

strFich é a propria string e MAX_STRING é o tamanho dela.

E deu-me o seguinte erro na compilação:

invalid combination of opcode and operands

Alguem sabe como resolver isto? Ando aqui as voltas e não consigo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

em que linha é que isso te deu erro, por norma costuma indicar onde é que isso ocorreu

calculo que o teu problema seja nesta linha

cmp al, 0xA

ele não aceita o 0xa como segundo argumento válido

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu por acaso tirei essa função e tentei por outra. Mas não deve ser essa linha, porque eu no programa tenho uma linha igual a essa e não me causa problemas nenhuns. Estou a tentar fazr de outra forma, mas não consigo chegar lá  :)

Posso é voltar a por essa função no meu programa e vejo em que linha dá esse erro. Mas soponho que seja do sub ebx,eax.. é o unico operando que estou a fazer nessa função.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como sugeriu o CuotlX, o teu compilador não indica em que linha ocorreu o erro?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não podes fazer isso

o maximo que podias fazer era o inverso ou então tenta passar o StrFich para um registo e ai fazes a sub entre esse registo e o ebx

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E está feito. Estou a fazr um sub de ebx com o eax, e depois passo o resultado que está no ebx e passo para o StrFich

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isto que vou dizer ate pode estar errado mas não tens que meter o StrFich assim [strFich]?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois se calhar é por isso. Já tenho o trabalho praticamente pronto, arranjei outra solução mais fácil, mas obrigado pela ajuda  :cheesygrin:

Falta-me só uma coisa que se faz rápido e dá pa ter 20  :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora