2010-08-02 28 views
1

J'ai un pointeur sur un tableau, DI.Pointeurs et index dans l'assembly Intel 8086

Est-il possible d'aller à la valeur pointée par DI et un autre pointeur?

par exemple:

mov bl,1   
mov bh,10 
inc [di+bl] 
inc [di+bh] 

Et, sur une note connexe, est-il un opcode ligne unique pour échanger les valeurs des deux registres? (Dans mon cas, BX et BP?)

Répondre

4

Pour les programmes 16 bits, les formes d'adressage sont pris en charge que:

[BX+SI] 
[BX+DI] 
[BP+SI] 
[BP+DI] 
[SI] 
[DI] 
[BP] 
[BX] 

Chacun peut comprendre soit un déplacement constant de 8 ou 16 bits.

(Source: Intel Developer's Manual volume 2A page 38)

Le problème avec l'exemple fourni est que bl et bh sont des registres de huit bits et ne peut pas être utilisé comme pointeur de base. Toutefois, si vous définissez bx à la valeur souhaitée, alors inc [di+bx] (avec un spécificateur de taille approprié pour le pointeur) est valide.


En ce qui concerne la permutation « les bits haut et bas d'un registre, » J-16 SDiZ's suggestion de ror bx, 8 est très bien pour l'échange bl et bh (et IIRC, il est la meilleure façon de le faire). Cependant, si vous voulez échanger le bit 0 (par exemple) bl avec le bit 7 de bl, vous aurez besoin de plus de logique que cela.

+0

Existe-t-il un moyen d'échanger deux registres alors? Dis, BX et BP? –

+1

L'instruction 'XCHG' (par exemple' XCHG BX, BP'). La source est encore le manuel d'Intel lié dans ma réponse (en fait le volume 2B). Je recommande de les avoir à portée de main lors du développement d'assemblages. Ils ont toujours les informations 16 bits, ainsi que 32 bits, 64 bits et toutes les autres extensions depuis. – Zooba

1

DI n'est pas un pointeur, c'est un index.

Vous pouvez ROR BX, 8 faire pivoter un octet inférieur/supérieur d'un registre.