|
|
|
![]() |
|
Strumenti |
![]() |
#1 | |
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
[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): Quote:
Ora........ho capito o c'è qualcosa nel mio ragionamente che falla? Tnk
__________________
Gnu/Linux User ![]() |
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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... |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
indi qualcosa capisco da solo?
Cosa intendi per "comparazione fra numeri interi e naturali"?
__________________
Gnu/Linux User ![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
Codice:
[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, '$' Codice:
#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; }
__________________
Gnu/Linux User ![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Direi che quello è più questo (a parte il return 0)...c'è una leggera differenza...ma l'if funziona in quel modo...
Codice:
[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, '$' 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... |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
quindi l'If e + o - fatto cosi
![]() 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?
__________________
Gnu/Linux User ![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:16.