x86 assemblée de multiplier et de diviser l'instruction des opérandes, 16 bits et plus
Je suis un peu confus sur la façon dont le multiplier et diviser des opérations de travaux en x86 assemblée. Par exemple, le code ci-dessous ne semble pas trop difficile car les traite avec 8 bits.
8-Bits De Multiplication:
; User Input:
; [num1], 20
; [num2] , 15
mov ax, [num1] ; moves the 8 bits into AL
mov bx, [num2] ; moves the 8 bits into BL
mul bl ; product stored in AX
print ax
Mais ce qui arrive quand vous voulez multiplier deux nombres 16 bits? Comment multiplier deux 16 bits numéros de la même manière comme il a été fait avec les 8 bits les nombres?
Je suis confus quant à ce que les registres les valeurs seront stockées. Auraient-ils être stockés dans AL et AH ou serait-il simplement stocker le 16-nombre de bits dans AX. Pour montrer ce que je veux dire:
; User Input:
; [num1], 20
; [num2], 15
mov eax, [num1] ; Does this store the 16-bit number in AL and AH or just in AX
mov ebx, [num2] ; Does this store the 16-bit number in BL and BH or just in BX
mul ??? ; this register relies on where the 16-bit numbers are stored
print eax
Quelqu'un pourrait-il élaborer un peu sur la façon dont la multiplication et la division de marche? (plus précisément, avec 16 bits et 32 bits des nombres? Aurais-je besoin de faire pivoter bits si les valeurs sont stockées dans le bas de l'AL et AH?
Ou peut-on simplement mov num1
et num2
en ax
et bx
, respectivement, et puis les multiplier pour obtenir le produit dans eax
?
OriginalL'auteur StartingGroovy | 2012-03-20
Vous devez vous connecter pour publier un commentaire.
Un rapide coup d'œil à la la documentation montre qu'il existe 4 opérande tailles pour
MUL
. Les entrées et les sorties sont résumées dans un tableau pratique:mul
. Je me demandais si, quand je stocker la valeur danseax
(avantmul
) si il stocke dans les bits de poids faible (AL et AH) plutôt que les bits supérieurs (AX). Si elle ne les stocker dans les bits de poids faible, suis-je capable de pivoter à la HACHE, puis il suffit de multiplier AX et BX et imprimer la réponse (je crois qu'il serait dans EAX)?Si vous stocker une valeur dans
eax
c'est dans tous deeax
. Je ne suis pas sûr de comprendre. Je pense que vous pourriez être source de confusion parties deeax
sontah
,al
, etax
, trop. Vous pouvez consulter le tableau dans le volume 1 de la même documentation. En particulier,ax
se réfère à la même 16 bits commeah:al
, pas la partie "supérieure" de la 16-bits deeax
.À proximité, mais le produit sera en
DX:AX
. Consulter le tableau dans ma réponse.Bien sûr, il ne - DX est de 16 bits, et AX est de 16 bits. Qui rend DX:AX un nombre de 32 bits. 16+16=32, droit?
AX est déjà là - c'est le fond de 16 bits de EAX. Vous devez déplacer le DX de la moitié dans la moitié supérieure de EAX, oui.
OriginalL'auteur Carl Norum