J'apprends 80386 de PC Assembly by paul caurterdans la compréhension des instructions et mul IMUL de langue Assemblée
mul source
- Si l'opérande est l'octet de taille, il est multiplié par l'octet dans le registre AL et le résultat est stocké dans les 16 bits de AX.
fine.
- Si la source est de 16 bits, il est multiplié par le mot AX et le résultat 32 bits est stocké dans DX: AX.
Q1: Pourquoi DX: AX? Pourquoi ne peut-il pas stocker dans EAX/EDX?
imul
est vraiment déroutant
imul dest, source1
imul dest, source1, source2
alt text http://img697.imageshack.us/img697/8976/imul.gif
J'ai problème dans la compréhension de la table.
Q2: dans la deuxième entrée de la table. Encore une fois, pourquoi DX: AX. Pourquoi pas EAX ou EDX?
code suivant maintenant considérer extrait:
imul eax ; edx:eax = eax * eax
mov ebx, eax ; save answer in ebx
mov eax, square_msg ; square_msg db "Square of input is ", 0
call print_string ; prints the string eax
mov eax, ebx
call print_int ; prints the int stored in eax
call print_nl ; prints new line
Q3: Son dit que previsously The notation EDX:EAX means to think of the EDX and EAX registers as one 64 bit register with the upper 32 bits in EDX and the lower bits in EAX.
Donc, la réponse est également stockée dans EDX, non? Dans le code ci-dessus, nous n'avons pas considéré EDX, nous faisons simplement référence à EAX Comment cela fonctionne-t-il encore?
Q4: J'ai un problème avec le reste de toutes les entrées de la table. le pire résultat de multiplication de deux nombres de n bits (n = 8/16/32 bits) est de 2n bits. Comment se fait-il que le stockage de deux résultats de multiplication 16/32 bits aboutisse à un registre de même taille?
@ Q3: Je le savais. c'est le code de ce livre de paul carter. Pouvez-vous me dire comment le code devrait être? Je suis confus comment imprimer le résultat. – claws
Le code tel que donné est juste un exemple; le texte doit mentionner quelque part qu'il ne calculera pas correctement le carré si l'entrée est en dehors de la plage attendue. Puisque vous appelez une fonction 'print_int' pour imprimer un entier de 32 bits, voyez si vous pouvez trouver une fonction' print_int64' pour imprimer un entier de 64 bits. –
@ Q4: Ouais, c'est comme ça que ça se passe mais la table dit que la multiplication 16 bits est stockée en résultat 16bit. 4ème entrée: 'dest * = source1' => dest = dest * source1; dest est 16bit et source1 est 16bit. Et c'est le même cas pour toutes les entrées de la table. même la dernière entrée source1 & source2 est de 32 bits et dest est également de 32 bits. – claws