View Full Version : [Asm]Domanda su Cmp
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
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...
indi qualcosa capisco da solo?
Cosa intendi per "comparazione fra numeri interi e naturali"?
[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;
}
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...
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?
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.