Programme qui compare 3 nombre assembleur

Syd -  
nicocorico Messages postés 846 Statut Membre -
Bonjour, j'ai fait un programme en assembleur qui compare trois nombres et dit qui est le plus grand mais il me met comme erreur A2022 : instruction operands must be the same size comment puis je le faire merci

TITLE comparaison 3 nombres
INCLUDE IUTInfo.inc
.data
msg BYTE "entrez 3 nombre",0
msg2 BYTE "les trois nombres sont égaux",0
msg3 BYTE "les deux premières valeurs sont égales et plus grande que v3",0
msg4 BYTE "v1=v2 et v1<v3",0
msg5 BYTE " v1=v3 et supérieur a v2",0
msg6 BYTE "v1 est le plus grand",0
msg7 BYTE "v3 est le plus grand",0
v1 WORD ?
v2 WORD ?
v3 WORD ?

.code
main PROC
mov edx,OFFSET msg
call WriteString
mov eax,v1
call readint
mov ebx,v2
call readint
mov ecx,v3
call readint
cmp eax,ebx ; compare les valeurs v1 et v2
je L1 ; saute vers L1 si elles sont égales
jg cas ;si v1>v2

L1:
cmp eax,ecx ; compare les deux autres valeurs à v3
je L2 ; saute vers L2 si elles sont égales
jg L3 ; saute vers L3 si les deux valeurs sont plus grandes que v3
jl L4 ; saute vers L4 si les deux valeurs sont plus petites que v3

L2:
mov edx, offset msg2
jmp fin

L3:
call writeint
mov edx,offset msg3
call writestring
jmp fin

L4:
mov eax,ecx
call writeint
mov edx,offset msg4
call writeint
jmp fin

cas:
mov eax,v1
cmp eax,ecx
je sousa
jg sousb
jl sousc

sousa:
mov edx,offset msg5
call writestring
jmp fin

sousb:
mov edx,offset msg6
call writestring

sousc:
mov edx,offset msg7
call writestring

fin:
exit
main ENDP
END main

4 réponses

  1. nicocorico Messages postés 846 Statut Membre 138
     
    Tu as déclarées les variables V1, V2 et V3 en 'word' et tu les lis en 32 bits, le problème est sûrement là...
    Et tu ne détailles pas la fonction 'ReadInt', mais le chargement de EAX, EBX et ECX avant son appel me semble pour le moins bizarre !

    Le chêne aussi était un gland, avant d'être un chêne
    1
  2. Syd
     
    ca doit etre une erreur d'imcomprehension du cours alors donc je vais réessayer en declarant en DWORD et dappeller ReaInt avant de mettre les valeurs dans les régistres et je verrais
    0
  3. Syd
     
    j'ai rééesayer mais je n'ai pas réussi tu pourrais me montrer en portion de code ce que tu me demande de cooriger stp?
    0
  4. nicocorico Messages postés 846 Statut Membre 138
     
    Voilà, j'ai repris ton code avec explications, mais je n'utilise pas le même assembleur que toi donc j'espère que ça fonctionne ainsi, et je manque de temps donc je donne ici une piste, plutôt qu'un résultat exact, et je finaliserais dès que possible...

    TITLE comparaison 3 nombres
    INCLUDE IUTInfo.inc
    .data
    msg BYTE "entrez 3 nombre",0
    msg2 BYTE "les trois nombres sont égaux",0
    msg3 BYTE "les deux premières valeurs sont égales et plus grande que v3",0
    msg4 BYTE "v1=v2 et v1<v3",0
    msg5 BYTE " v1=v3 et supérieur a v2",0
    msg6 BYTE "v1 est le plus grand",0
    msg7 BYTE "v3 est le plus grand",0
    v1 DWord
    v2 DWord
    v3 DWord

    .code
    main PROC
    mov edx,OFFSET msg
    call WriteString
    call readint
    mov V1,eax
    call readint
    mov V2,eax
    call readint
    mov V3,eax

    Mov eax,V1
    cmp eax,V2 ; compare les valeurs v1 et v2
    jg cas ;si v1>v2

    L1: ;Continue ici si elles sont égales
    cmp eax,V3 ; compare les deux autres valeurs à v3
    jg L3 ; saute vers L3 si les deux valeurs sont plus grandes que v3
    jl L4 ; saute vers L4 si les deux valeurs sont plus petites que v3

    L2: ; Continue ici si elles sont égales
    mov edx, offset msg2
    Jmp @FinWS

    L3:
    Mov EBX,10
    call writeint
    mov edx,offset msg3
    Jmp @FinWS

    L4:
    mov eax,V3
    Mov EBX,10
    call writeint
    mov edx,offset msg4
    Jmp @FinWS

    cas:
    mov edx,offset msg6
    cmp eax,V2
    jg @FinWS
    mov edx,offset msg7
    jl @FinWS
    mov edx,offset msg5

    @FinWS:
    call writestring

    fin:
    exit
    main ENDP
    END main

    Le chêne aussi était un gland, avant d'être un chêne
    0