- 104
- 3
- CPU
- i5-10500 3.2Ghz
- Dissipatore
- Non specificato
- Scheda Madre
- Non specificata
- HDD
- M.2 251GB e M.2 500GB
- RAM
- 16GB DDR4 2666mhz
- GPU
- Grafica Intel® UHD 630
- Audio
- Non specificata
- Monitor
- 1920x1080 27"
- PSU
- Non specificato
- Case
- Non specificato
- Periferiche
- Nono specificato
- Net
- Eolo
- OS
- Ubuntu
No, non mi riferisco all'istruzione "ret", stavo studiando le procedure a basso livello quando riflettendoci un po capisco che molto probabilmente se la funzione chiamata eseguisse una "pop", verebbe rimosso dallo stack l'indirizzo di ritorno e memorizzato nell'operando specificato, a questo punto l'istruzione "ret" eseguirebbe una "pop" della locazione indirizzata dello SP che non è più l'indirizzo di ritorno bensì una locazione da me inizializzata a 3h, infatti lo SP e stato incrementato all'esecuzione della pop.
Lo so che questo non si dovrebbe mai fare, infatti il programma si blocca, ma mentre eseguivo il debbug mi accorgo che il registro nella quale memorizzo il dato rimosso dallo stack, non contiene l'indirizzo di ritorno ma un valore che non capacito a capire da dove provenga:
Questo è il codice:
Come si può notare l'istruzione "pop" memorizza in "AX" l'indirizzo di ritorno e l'istruzione "ret" dovrebbe memorizzare nello "IP" il byte allocato nello stack e inizializzato a tre.
Il debbuger però non la pensa come me : )
Dopo l'istruzione il valore di[ "AX" è pari a 5 e non 4, la memorizzazione della seguente istruzione "call" richiede 3byte, se così però l'istruzione successiva si dovrebbe trovare alla locazione con offset 0004h e non 0005h. Perché accade ciò?
Lo so che questo non si dovrebbe mai fare, infatti il programma si blocca, ma mentre eseguivo il debbug mi accorgo che il registro nella quale memorizzo il dato rimosso dallo stack, non contiene l'indirizzo di ritorno ma un valore che non capacito a capire da dove provenga:
Questo è il codice:
Codice:
;non ho bisogno di un segmento logico per dati
;MASM 6.14
;ISA: x86-16bit
;SO: MS-DOS
stack SEGMENT PARA STACK
dw 3h
stack ENDS
code SEGMENT PARA PUBLIC
ASSUME cs: code, ss: stack
cosa PROC NEAR
pop ax ;memorizzo in ax l'indirizzo di ritorno
ret ;dovrebbe eseguire una rimozione dallo stack errata
cosa ENDP
_start:
call cosa
mov ah, 04ch
mov al, 1
int 21h
code ENDS
END _start
Il debbuger però non la pensa come me : )
Dopo l'istruzione il valore di[ "AX" è pari a 5 e non 4, la memorizzazione della seguente istruzione "call" richiede 3byte, se così però l'istruzione successiva si dovrebbe trovare alla locazione con offset 0004h e non 0005h. Perché accade ciò?
Ultima modifica: