EAX=-val2+7-val3+val1

Signaler
Messages postés
17
Date d'inscription
lundi 3 février 2003
Statut
Membre
Dernière intervention
5 novembre 2011
-
Messages postés
75
Date d'inscription
samedi 23 mars 2002
Statut
Membre
Dernière intervention
18 septembre 2006
-
voici un programme qui doit donné un résultat en fonction de la formule suivante,
mais je ne suis pas sur que le résultat obtenu après compilation du programme soit le bon résultat??
TITLE exprarith

;EAX=-val2+7-val3+val1

.386
.MODEL flat,stdcall
.STACK 4096
ExitProcess PROTO,dwExitCode:DWORD
DumpRegs PROTO

INCLUDE Irvine32.inc
.data
val1 SDWORD 8
val2 SDWORD -15
val3 SDWORD 20

.code
main PROC

mov eax,0
mov ebx,0
call dumpregs
mov eax,val2
neg eax
add eax,7
call dumpregs

mov ebx,val3
neg ebx
sub eax,ebx
call dumpregs

mov ebx,val1
add eax,ebx
call dumpregs

call dumpregs
exit
main ENDP
END main

rhumsek

13 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
ben faut juste additionner et soustraire, c'est cela ?
Alors fais dans le simple.
C'est quoi tous ces 'dumpregs', servent a quoi ?

.586
.model flat, stdcall
option casemap :none
option prologue:none
option epilogue:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
val1 DD 8
val2 DD -15
val3 DD 20
szbuff DB 24 dup(0)
szappname DB "Test",0

.code
start:
ALIGN 4
mov eax, val2
neg eax
add eax, 7
sub eax, val3
add eax, val1
mov ecx, offset szbuff
call itoa
push 0
push offset szappname
push offset szbuff
push 0
call MessageBox

progEnd:
push 0
call ExitProcess
itoa PROC ; IN: EAX INT32, ECX *psz
push edi
test eax, eax
mov edi, ecx
jnz short noZero
lea eax, [ecx+1]
mov byte ptr[ecx], '0'
pop edi
mov byte ptr[eax], 0
ret 0
noZero:
jge short supEgZero
mov byte ptr [edi], '-'
neg eax
inc edi
supEgZero:
push esi
mov ecx, eax
mov esi, edi
supZero:
mov eax, -858993459
mul ecx
mov eax, edx
shr eax, 3
mov edx, ecx
lea ecx, [eax+eax*4]
add ecx, ecx
sub edx, ecx
add dl, '0'
mov [edi], dl
mov ecx, eax
inc edi
test eax, eax
jnz short supZero
mov byte ptr[edi], 0
mov eax, edi
reverStr:
cmp esi, edi
jae i32toaExit
dec edi
mov cl, [esi]
mov dl, [edi]
mov [edi], cl
mov [esi], dl
inc esi
jmp short reverStr
i32toaExit:
pop esi
pop edi
ret 0
itoa ENDP

end start

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
17
Date d'inscription
lundi 3 février 2003
Statut
Membre
Dernière intervention
5 novembre 2011

peut tu m'expliqué ces ligne suivante que t'a écrit???

szbuff DB 24 dup(0)
szappname DB "Test",0

rhumsek
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
segment .data (des donnees qu'on reserve pour faire simple).

szbuff DB 24 dup(0)
ici reserve 20 octets initialises a zero depuis l'offset 'szbuff'. Je prefixe par 'sz' pour String Zero, chaine a terminateur null, format employe par API Windows. Ces 20 octets peuvent etre employes a ce que tu veux entre temps, ils sont en lecture ecriture.

szappname DB "Test",0
dans le meme genre, 5 octets deja initialises avec des valeurs. Tu peux remarquer qu'il y a aussi le terminateur NULL.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
pour szbuff DB 24 dup(0), dis plutot 24 octets sinon il va pas comprendre
dumpregs: Affiche les registres a l'écran (Irvine32.inc)
Messages postés
75
Date d'inscription
samedi 23 mars 2002
Statut
Membre
Dernière intervention
18 septembre 2006

Là j'avoue que je comprend pas trop votre code de 4 pages pour un calcul simple comme ça. Moi j'aurais fais ça :

xor eax, eax
sub eax, val2
add eax, 7
sub eax, val3
add eax, val1

Tout simplement. Mais je me trompe peut-être, si oui, expliquez moi :)

@+
Vermi
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
tu ne te trompes pas, on amis la meme chose.
En haut seulement affichage MessageBox en plus.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
75
Date d'inscription
samedi 23 mars 2002
Statut
Membre
Dernière intervention
18 septembre 2006

Oui, pardon, j'avais pas remarquer. C'était + simple d'utiliser un wsprintf lol

@+
Vermi
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Mais tellement plus lent.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
75
Date d'inscription
samedi 23 mars 2002
Statut
Membre
Dernière intervention
18 septembre 2006

rooo, tout de suite ^^ mais non voyont, Windows est une système en ASM Optimisé PTDR.

De toute façon, on peut se permettre d'être lent, si on est pas imparti par le temps, parce que même en ASM lent, on est + rapide que le C++ rapide ^^

@+
Vermi
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Bien sur que dans l'exemple la vitesse n'a pas d'importance mais par principe, vitesse toujours sinon on fait en VB (j'abuse et je le sais...).

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
au fait, je n'incriminais pas Windows parce que wsprintf est lent, c'est normal par conception. On fournit une fonction pour faineant, faut pas demander en plus qu'elle soit rapide.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
75
Date d'inscription
samedi 23 mars 2002
Statut
Membre
Dernière intervention
18 septembre 2006

Pitié ! pas de VB :(
Ya quand même une marge entre vite, et TRES TRES TRES TRES LENT. lol
J'abuse quand même, en VB avec un 223Mhz on peut aller à) 150200 bds sur un port COM. Con, en dessous on peut pas lol.

@+
Vermi
Messages postés
75
Date d'inscription
samedi 23 mars 2002
Statut
Membre
Dernière intervention
18 septembre 2006

lol, mais wsprintf est un API windows :)
@+
Vermi