Page 1 sur 2
MUL mal maitrisé
Publié : mar. 19/juil./2005 18:12
par kelly
Voici une erreur que je n'arrive pas a corriger.
La partie ASM doit multiplier 2 registres 8 bit et ecrire le resultat dans AX :
Code : Tout sélectionner
Result.b
Resulta.w
Address = @n64(i)
! MOV ebx, dword [v_Address]
! MOV al, [ebx]
Address = @i1
! MOV ebx, dword [v_Address]
! MOV dl, [ebx]
! MOV ah, 0
! MUL dl ; je pense que l'erreur est la
! MOV [v_Resulta], ax ; ou la
i2.w= Resulta
Debug ("====")
Debug i2
i2=n64(i)*i1 ; la vrai valeiur de i2
Debug i2
Publié : mar. 19/juil./2005 18:39
par comtois
en attendant les spécialistes de l'ASM
peut-être que ça t'aidera ?
http://menuet.homelinux.net/Asm:Mul
Publié : mar. 19/juil./2005 23:12
par filperj
L'erreur vient probablement de la ligne "Address = @i1 " qui modifie EAX.
Ton utilisation de MUL a l'air correcte

Publié : mer. 20/juil./2005 3:13
par VPureBasic
Salut Kelly,
Je penses bien qu'un code comme celui-ci pourra repondre a ton besoin...
Code : Tout sélectionner
Global i.l ; Index du Tableau
Global i1.b ; Multiplicateur
Global i2.w ; Resultat
Dim n64.b(10) ; Tableau de 10 variables de type bytes
; ASM SOURCE
!PUSH dword Ebx ; Sauvegarde ce Registre Important Pour PB
;
!MOV dword Ebx,[a_n64] ; Charge Address Initial du Tableau
!ADD dword Ebx,[v_i ] ; Additionne la valeur l'index du tableau
;
!MOVSX byte Eax,[Ebx ] ; Charge une valeur bits dans eax
!MOVSX byte Ebx,[v_i1 ] ; Charge la valeur i1 dans ebx
;
!IMUL dword Eax,Ebx ; Effectue la multiplication
;
!MOV word [v_i2 ],Ax ; Sauvegarde le resultat
!XOR dword Eax,Eax ; Efface le registre (Mettre a 0)
!POP dword Ebx ; Replace le registre
Donne-moi des nouvelles...
Roger
La seule limite de PureBasic... c'est notre imagination!
Publié : mer. 20/juil./2005 12:53
par kelly
merci mais ca va, j'ai pas mal debuggué. Je reviendrais ici pour savoir une autre chose...
thx
Publié : jeu. 21/juil./2005 11:30
par kelly
Bon, je maitrise de plus en plus, j'en suis ravie. But look :
Code : Tout sélectionner
...........
Repeat
Address = @n64(i)
! MOV edx, dword [v_Address]
! MOV ax, [edx]
i+1
.........
A la place d'augmenter I, comment dire directement a la ligne "! MOV edx, dword [v_Address] " que "[v_Address]" doit etre a +1 ?
Ca s'ecrit avec une ligne de code comme "! add v_Address, 1" ??
Publié : jeu. 21/juil./2005 11:32
par fweil
Pour incrémenter de 1, on peut utiliser l'instruction INC :
! INC edx
après le premier MOV placera la valeur + 1 dans edx.
Publié : jeu. 21/juil./2005 11:34
par kelly
"! INC edx "
Non, tu fais erreur. Car je pense que ca augmente de 1 la valeur qui etait dans EAX. Mais ca ne permet pas de regarder la valeur suivante dans un Dim !!
Publié : jeu. 21/juil./2005 12:29
par VPureBasic
Salut Kelly,
Est-ce que as essayer le code que je t'avais suggerer? Si oui alors pour augmenter la lecture du prochain n64(i), tu n'as qu'a augmenter sa valeur de 1 comme suit...
Code : Tout sélectionner
Global i.l ; Index du Tableau
Global i1.b ; Multiplicateur
Global i2.w ; Resultat
Dim n64.b(10) ; Tableau de 10 variables de type bytes
; ASM SOURCE
!PUSH dword Ebx ; Sauvegarde ce Registre Important Pour PB
;
!MOV dword Ebx,[a_n64] ; Charge Address Initial du Tableau
!ADD dword Ebx,[v_i ] ; Additionne la valeur l'index du tableau
;
!MOVSX byte Eax,[Ebx ] ; Charge une valeur bits dans eax
!MOVSX byte Ebx,[v_i1 ] ; Charge la valeur i1 dans ebx
;
!IMUL dword Eax,Ebx ; Effectue la multiplication
;
!MOV word [v_i2 ],Ax ; Sauvegarde le resultat
; Ajoute Ceci
!MOV dword Eax,[v_i] ; Copier la valeur de l'index
!INC dword Eax ; Augmente de 1
!CMP dword Eax,10 ; Compare avec limite du DIM
!JNE near Suite_Du_Code ; Si Eax <> Maximum
!MOV dword [v_i],0 ; Remet index a 0
!Suite_Du_Code:
!XOR dword Eax,Eax ; Efface le registre (Mettre a 0)
!POP dword Ebx ; Replace le registre
Roger
La seule limite de PureBasic,... c'est notre imagination!
Publié : jeu. 21/juil./2005 14:08
par kelly
@VPureBasic :
Non, je n'ai pas utilisé ton code car j'avais en fait 3 blocs asm a "souder" et j'y suis arrivée avant de te lire.
Bon, apparement, EBX est important pour PB. Donc, un push semble essenciel avant d'utiliser EBX. Alors, il n'y a plus qu'a.
Je vais tester ca....
Publié : jeu. 21/juil./2005 14:55
par kelly
Ha tiens, un probleme interessant. Comment mettre la valeur 0 a l'adresse Addi ?
Je veux le contraire de ca quoi :
Publié : jeu. 21/juil./2005 15:21
par Anonyme2
kelly a écrit :Ha tiens, un probleme interessant. Comment mettre la valeur 0 a l'adresse Addi ?
Je veux le contraire de ca quoi :
Tu devrais lire le tut 7 que j'ai fait. Je suis pas un grand spécialiste mais tu pourras te familiariser avec l'instruction la plus utilisée, MOV
Code : Tout sélectionner
Global Addi
SUB eax, eax
MOV dword [v_Addi], eax
; ou
XOR eax, eax
MOV dword [v_Addi], eax
; ou
MOV eax, 0
MOV dword [v_Addi], eax
; ou
MOV dword [v_Addi], 0
; ou
PUSH Dword 0
POP Dword[v_Addi]
; ou
ADDI = 12 ; pour montrer que Addi vaut au départ 12
MessageRequester("","Addi =" +Str(Addi),16)
MOV eax, [v_Addi]
SUB Dword[v_Addi], eax
MessageRequester("","Addi =" +Str(Addi),16)
Publié : jeu. 21/juil./2005 15:31
par kelly
waouw, merci denis
Publié : jeu. 21/juil./2005 16:12
par kelly
C'est poussé mais ca ne marche pas.
comme ma valeur "Addi" est un .l en PB, je dois bien mettre dword ptr, non ?
ca devrait augmenter de 1 cette valeur, mais ca marche pô
Publié : jeu. 21/juil./2005 16:24
par Anonyme2
y a pas de ptr
! MOV edx, dword [v_Addi]
! ADD dword [edx], 1
si tu veux ajouter 1 à Addi, utilise l'instruction INC
! INC dword[v_Addi]