AnonimoVeneziano
20-05-2004, 23:35
Ciao ragazzi,
mi trovavo nella situazione di dover "pushare" dei caratteri singoli nello stack di un programmino del cavolo che avevo fatto per imparare un po' l'assembly , quando mi sono accorto che , nonostante i caratteri siano 8bit di dimensione , venivano pushati 32bit di dati nello stack , così ho tentato di fargli pushare solo 8bit così :
push byte 50 <codice ASCII per il mio carattere>
(ASSEMBLATO CON NASM)
ma non funziona , continua a pushare 32bit di roba, in sintassi AT&T sarebbe:
pushb $50
ma se lo provo ad assemblare con GAS mi da un errore , ma è possibile pushare solo 32bit o no? Possibile che se devo passare delle Stringhe come parametri ad una funzione mi devo perdere 24bit per ogni carattere?
La mia idea era quella dopo di usare una funzione per printare a schermo i caratteri che avevo pushato nello stack , così :
Supponendo:
push byte 50
push byte 51
call print
print:
push ebp <Calling Function del C>
mov ebp,esp <''>
mov ebx, epb <Sposto epb in ebx>
add ebx, 8 <Sommo 8 a ebx>
mov edx, 2 <Uso la SYS CALL 4 di Linux , "EDX" numero di caratteri
mov ecx, ebx (Lunghezza del buffer in byte), "ECX" indirizzo dell' inizio del
mov ebx, 1 buffer, "EBX" File Descriptor , "EAX" Codice di della SYSCALL
mov eax, 4 (4) >
int 0x80 <Kernel Linux>
L'output che mi dovrei attendere sarebbero i caratteri corrispondenti ai numeri "3" e "2" , quindi :
32
dovrebbe essere l'output , ma purtroppo dato che appunto la lunghezza del buffer è di 8byte anzichè 2byte come invece gli ho impostato nel registro EDX lui mi visualizza solo il "3" , se imposto ovviamente EDX a 8byte visualizzo i 2 caratteri , ma nello stack perdo 6byte di "0" :( (obbiettivo efficienza :D ) Non posso pushare solo gli il byte facendo incrementare il registro ESP di 1 anzichè di 4 ? O devo farlo io a mano aggiungendo 3 a ESP dopo il PUSH?
Un altra cosa che volevo chiedere è questa :
Per poter dare l'indirizzo del primo carattere ASCII ho dovuto usare questo inghippo :
mov ebx, epb <Sposto epb in ebx>
add ebx, 8 <Sommo 8 a ebx>
Cioè quello di memorizzare EBP dentro EBX , e poi aggiungere 8 a EBX per ottenere in questo l'indirizzo di memoria del primo carattere , che poi passerò tramite REGISTER Addressing a ECX durante la Chiamata di sistema , ma mi chiedevo se non ci fosse un modo per integrare questo passaggio in un unica istruzione , del tipo :
mov ecx, ebp + 8 :D
Questa roba ovviamente non funziona (sennò non ve l'avrei chiesto :D ), quindi , è possibile comunque fare una cosa del genere o devo per forza memorizzare il valore di EBP in qualche registro per poi modificarlo e passarlo (come ho fatto) ?
Grazie delle risposte
Ciao :)
PS= Adesso che ci penso per la seconda invece che passare per EBX sarei potuto andare direttamente in ECX , ma comunque la domanda rimane , ossia se esite un modo per eseguire il Register Addressing in questo modo passando il valore modificato "on the fly" all' interno dell' unica istruzione (non so se mi sono spiegato)
mi trovavo nella situazione di dover "pushare" dei caratteri singoli nello stack di un programmino del cavolo che avevo fatto per imparare un po' l'assembly , quando mi sono accorto che , nonostante i caratteri siano 8bit di dimensione , venivano pushati 32bit di dati nello stack , così ho tentato di fargli pushare solo 8bit così :
push byte 50 <codice ASCII per il mio carattere>
(ASSEMBLATO CON NASM)
ma non funziona , continua a pushare 32bit di roba, in sintassi AT&T sarebbe:
pushb $50
ma se lo provo ad assemblare con GAS mi da un errore , ma è possibile pushare solo 32bit o no? Possibile che se devo passare delle Stringhe come parametri ad una funzione mi devo perdere 24bit per ogni carattere?
La mia idea era quella dopo di usare una funzione per printare a schermo i caratteri che avevo pushato nello stack , così :
Supponendo:
push byte 50
push byte 51
call print
print:
push ebp <Calling Function del C>
mov ebp,esp <''>
mov ebx, epb <Sposto epb in ebx>
add ebx, 8 <Sommo 8 a ebx>
mov edx, 2 <Uso la SYS CALL 4 di Linux , "EDX" numero di caratteri
mov ecx, ebx (Lunghezza del buffer in byte), "ECX" indirizzo dell' inizio del
mov ebx, 1 buffer, "EBX" File Descriptor , "EAX" Codice di della SYSCALL
mov eax, 4 (4) >
int 0x80 <Kernel Linux>
L'output che mi dovrei attendere sarebbero i caratteri corrispondenti ai numeri "3" e "2" , quindi :
32
dovrebbe essere l'output , ma purtroppo dato che appunto la lunghezza del buffer è di 8byte anzichè 2byte come invece gli ho impostato nel registro EDX lui mi visualizza solo il "3" , se imposto ovviamente EDX a 8byte visualizzo i 2 caratteri , ma nello stack perdo 6byte di "0" :( (obbiettivo efficienza :D ) Non posso pushare solo gli il byte facendo incrementare il registro ESP di 1 anzichè di 4 ? O devo farlo io a mano aggiungendo 3 a ESP dopo il PUSH?
Un altra cosa che volevo chiedere è questa :
Per poter dare l'indirizzo del primo carattere ASCII ho dovuto usare questo inghippo :
mov ebx, epb <Sposto epb in ebx>
add ebx, 8 <Sommo 8 a ebx>
Cioè quello di memorizzare EBP dentro EBX , e poi aggiungere 8 a EBX per ottenere in questo l'indirizzo di memoria del primo carattere , che poi passerò tramite REGISTER Addressing a ECX durante la Chiamata di sistema , ma mi chiedevo se non ci fosse un modo per integrare questo passaggio in un unica istruzione , del tipo :
mov ecx, ebp + 8 :D
Questa roba ovviamente non funziona (sennò non ve l'avrei chiesto :D ), quindi , è possibile comunque fare una cosa del genere o devo per forza memorizzare il valore di EBP in qualche registro per poi modificarlo e passarlo (come ho fatto) ?
Grazie delle risposte
Ciao :)
PS= Adesso che ci penso per la seconda invece che passare per EBX sarei potuto andare direttamente in ECX , ma comunque la domanda rimane , ossia se esite un modo per eseguire il Register Addressing in questo modo passando il valore modificato "on the fly" all' interno dell' unica istruzione (non so se mi sono spiegato)