[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
Re: Registrador DX:AX
- Subject: Re: Registrador DX:AX
- From: Nelson Posse Lago <lago@that.com.br>
- Date: Mon, 25 Mar 2002 15:22:49 -0300
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