Devo scrivere le istruzioni in assembler che permettano di determinare i valori di CF e OF (nella posizione n. 0 e n. 11 del registro dei flag) dopo una somma... ç_ç ...
Da dove comincio???
Devo scrivere le istruzioni in assembler che permettano di determinare i valori di CF e OF (nella posizione n. 0 e n. 11 del registro dei flag) dopo una somma... ç_ç ...
Da dove comincio???
...il fatto che non risponda nessuno... è perchè è una str****** e a nessuno va di spiegarmelo, o perchè nessuno lo sa fare? O_o'
è molto semplice.........
dopo l'operazione metti questo
jc etichettaoverflow 'salti alla etichetta di overflow
jmp okay 'qui salti con un jmp se non c'è overflow
etichettaoverflow:
stampa il messaggio di overflow
-------------
ciao
E jo per l`OF.
infatti, jc non e' per il carry?
comunque puoi anche fare un controllo su ogni bit del registro, usando il comando BIT (muahauah che fantasia)... a dirla tutta non ci ho mai provato, pero' credo si possa fare
In ogni modo e' + immediato farlo con i jump
Ciauz
#exclude <windows.h>
Powered by Gentoo GNU/Linux
Cos'e' l'impossibile se non una questione di tempo?
Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]
scusa non avevo letto bene quello che ti serviva, come da messaggio...........
ovvero quello che ti ho scritto è giusto e cioè:
mul ebx
jc overf
..... se il risultato non entra nel registro va all'etichetta overf
se no ti stampa un risultato errato (proprio perchè azzeri il contachilometri)
---------------
quello che chiedi tu è questo:
dopo un operazione puoi testare i bit così:
facendo una maschera, il comando da usare è test
per esempio dopo una imul il risultato è in eax
TEST ebx,000010000000000b ;controlla l'11 bit l'OF
je salta
.......
TEST ebx,000010000000001b ;controlla l'11 bit l'OF e il primo CF
je salta ;se l'11=1 e l'1=1
ciao jo
infatti, fare un test (cioe' l'AND) con una maskera di bit per ogni flag che ti serve, e' come usare l'istruzione BIT, che dovrebbe fare da sola.
Ciauz
#exclude <windows.h>
Powered by Gentoo GNU/Linux
Cos'e' l'impossibile se non una questione di tempo?
Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]
Normalmente si usa un jne (o jnz) dopo un test, di modo che se ( x & y != 0 ) significa che almeno un bit della "maschera" e` settato a 1. E basta osservare il codice in alto per trovare un errore. La condizione scritta sopra sara` vera sse ( ebx & 00001... == 0 ), e fa esattamente il contrario di cio` che si vuole: il salto verra` fatto se nessun bit della maschera e` settato in ebx. Ma poi cosa rappresenta quell`ebx? Che ci sta dentro?codice:TEST ebx,000010000000001b ;controlla l'11 bit l'OF e il primo CF je salta ;se l'11=1 e l'1=1
Se si vuole fare realmente un controllo a mano sui flags (tutti), vi si puo` accedere cosi`:
E poi si fanno i test sui bits di eax.codice:pushfd ; salva eflags sullo stack pop eax ; preleva eflags dallo stack e lo memorizza in eax
Ciao.
r0x, una domanda, sull'x86 non c'e' modo per accedere direttamente al registro di flag?
bisogna per forza farlo passare per lo stack?
ciaux
#exclude <windows.h>
Powered by Gentoo GNU/Linux
Cos'e' l'impossibile se non una questione di tempo?
Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]
x rox...........
TEST ebx,000010000000001b
je over
in ebx che c'è???
MUL ebx ;moltiplica il contenuto di eax per ebx e salva il risultato in edx:eax
Spero di averti chiarito le idee..............
questo sopra è un taglia e incolla da un mio prg, per far solo capire all'amico del post che deve usare l'istruzione test per verificare lo stato dei flag (per quello che serve a me va benissimo, non c'è nessun errore......hehheh!!)
Per questo motivo in asm normalmente non si posta codice, ognuno deve studiarsi da solo il problema e fare da solo la propria routine che gli serve
L'importante è che il nostro amico sa che deve usare l'istruzione test
L'istruzione TEST risulta molto utile quando noi vogliamo controllare lo stato di uno o più bit all'interno di un registro o una locazione di memoria
Esempi:
TEST eax,1 ;controlla il primo bit (ovvero quello meno significativo) di eax
JZ nonsettato ;salta all'etichetta "nonsettato" se quel bit è azzerato (ma ognuno può fare quello che + gli aggrada)
TEST al,0000100b ;controlla il terzultimo bit di al
JNZ settato ;salta se è uguale ad 1 ma ognuno può fare quello che + gli aggrada)
in effetti sarebbe meglio mettere ........jcc (poi fai come ti pare)
.....mai l discorso sui jcc(salti condizionali esula dalla domanda del nostro amico.......), per i salti condizionali useremo un'altro post attinente
-----------------
----------------------
code:--------------------------------------------------------------------------------
pushfd ; salva eflags sullo stack
pop eax ; preleva eflags dallo stack e lo memorizza in eax
-------------------------------------
......non ti confondere le idee akiross.............
Assolutamente no , non serve passare per lo stack
il registro di flag viene controllato sempre dopo un'operazione....
questo è l'importante........
comunque......
Quando la CPU incontra il codice macchina di PUSHFD, sottrae 4 byte a ESP e copia il contenuto a 32 bit del registro EFLAGS nella locazione di memoria SS:ESP
....... ma rox è conosciuto per confondere le idee
ciao