PDA

View Full Version : [Asm]Domanda su Cmp


Luc@s
17-07-2004, 12:43
Da quanto ho capito, quando faccio cmp dst, src in asm e come se facessi sub dst, src ma senza pero modificare nulla.
Cioe alla fine ho(in metacodice):
Result := dst-src
E se il risultato è zero sono uguali(e lo ZF(0 flag) viene settato e poi usato per i vari Jump) se sono no i 2 operandi sono diversi.
Ora........ho capito o c'è qualcosa nel mio ragionamente che falla?


Tnk

cionci
17-07-2004, 15:27
Va bene, ma non agisce solo su ZF, ma anche su altri bit come OF e CF...così come la sub...
Questi altri due bit servono per usare i vari salti condizionati relativi alla comparazione fra numeri interi e naturali...

Luc@s
17-07-2004, 18:05
indi qualcosa capisco da solo?
Cosa intendi per "comparazione fra numeri interi e naturali"?

Luc@s
17-07-2004, 18:30
[BITS 16]
[ORG 0100h] ; for .com

[SECTION .text]

start:
mov ax, 100 ; set ax to 10
cmp ax, 10; compare ax with 10 values
je OK ; jump if ax = 10
JNE NO ; jump if ax NOT 10
OK:
mov dx, Message_OK ; Message_OK = ds:dx
or ah, ah ; set ah to 0
mov ah, 09h ; set int 21h service 09h
int 21h
ret
NO:
mov dx, Message_NO ; Message_NO = ds:dx
or ah, ah ; set ah to 0
mov ah, 09h ; set int 21h service 09h
int 21h
ret

; set int 21h service 4Ch(exit)
mov ah, 4Ch
int 21h

[SECTION .data]

Message_OK db 'AX is equals 10', 13, 10, '$'
Message_NO db 'AX is NOT equals 10', 13, 10, '$'


Indi sto code in C sarebbe + o -

#include <stdio.h>

int main()
{
unsigned int a = 0;
if(a == 0){
puts("AX is equals 10");
}else {
puts("AX is NOT equals 10");
}
return 0;
}

cionci
17-07-2004, 18:52
Direi che quello è più questo (a parte il return 0)...c'è una leggera differenza...ma l'if funziona in quel modo...

[BITS 16]
[ORG 0100h] ; for .com

[SECTION .text]

start:
mov ax, 100 ; set ax to 10
cmp ax, 10; compare ax with 10 values
je OK ; jump if ax = 10
jmp NO ; jump if ax NOT 10
OK:
mov dx, Message_OK ; Message_OK = ds:dx
or ah, ah ; set ah to 0
mov ah, 09h ; set int 21h service 09h
int 21h
jmp fineif
NO:
mov dx, Message_NO ; Message_NO = ds:dx
or ah, ah ; set ah to 0
mov ah, 09h ; set int 21h service 09h
int 21h
fineif:
ret

; set int 21h service 4Ch(exit)
mov ah, 4Ch
int 21h

[SECTION .data]

Message_OK db 'AX is equals 10', 13, 10, '$'
Message_NO db 'AX is NOT equals 10', 13, 10, '$'

Esistono salti condizionali che tengono conto dei flag interpretabili per numeri interi (memorizzati in complemento a 2 - int) o naturali (senza numeri negativi - unsigned int)...
Ad esempio:
JL - Jump if Less: è per numeri interi e salta se SF != OF
JB - Jump if Below: è per numeri naturali e salta se CF = 1

Testano entrambi se x < y...

Luc@s
17-07-2004, 18:55
quindi l'If e + o - fatto cosi :D
Forte l'asm.....+ lo scopro + mi piace!
Ma secondo te..........capire queste cose aiuta a capire meglio C/C++ e tutte le cose che fanno?

cionci
17-07-2004, 18:57
Aiuta a capire meglio qualsiasi cosa fa un computer o un programma ;)

Comunque puoi vedere il sorgente del tuo programma scritto in C o C++ in questo modo:

gcc -S source.c -o out.asm