[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: Registrador DX:AX



On Mon, Mar 25 2002 at 12:11:45pm -0300, Juliana Barby Simão wrote:
 
> Gostaria de mover este valor de retorno para uma determinada posição de memória. Porém, não estou sabendo como referenciar um registrador desse tipo...

Lembre-se bem: %dx:%ax nao e' um registrador, sao dois registradores, cada
um de 16 bits; como nos processadores ate' o 286 nao havia registradores
de 32 bits, o unico jeito de lidar com numeros de 32 bits era usando dois
registradores, que e' exatamente o caso aqui: ao multiplicar dois numeros
de 16 bits, o resultado pode ter mais de 16 bits, entao o resultado e'
dividido em 2 "pedacos" e cada um e' colocado num registrador. %dx
corresponde aos dois bytes mais significativos do resultado e %ax
corresponde aos bytes menos significativos do resultado.

Para passar esse valor para algum lugar da memoria, voce tem algumas
opcoes:

1 - "monta" os 2 registradores de 16 bits em um registrador de 32 bits e
grava o conteudo desse registrador na memoria; algo como:

	xorl %ebx, %ebx # "zera" %ebx
	mov %ax, %bx # "guarda" o valor de %ax em %bx
	xorl %eax, %eax # "zera" %eax
	mov %dx, %ax
	sal $16, %eax # "move" os bits para a esquerda
	andl %ebx, %eax # "junta" os dois pedacos em %eax
	movl %eax, endereco-de-destino

2 - grava os dois registradores na ordem "certa" em algum lugar na
memoria. Como as maquinas intel sao "little-endian", primeiro vai o
registrador menos significativo, depois o mais significativo (acho!).
Algo como:

	mov %ax, endereco-de-destino
	mov %dx, endereco-de-destino + 2

Nao testei isso para ver se o papo da "endianness" e' esse mesmo, mas o
caminho e' por ai'.

Ate' +
Nelson