Ik zie net Niels z'n uitleg voor ik op verstuur drukte, maar
ik stuur dit toch maar omdat ik Niels zo te zien aanvul op
enkele punten.
Door Anoniem op 17 oktober 2006 16:17
Is deze string nog gevult eigenlijk met 0 bytes ?
Als we uitgaan van jouw C-code:
char msg[] ="hello";
dan gaat het om een standaard ASCII C string.
Een ASCII C string is -bij normaal gebruik- nooit
gevuld met bytes die de waarde 0 hebben, want hij
eindigt met zo'n byte met waarde 0 (als het goed is).
Met jouw bovenstaande C source reserveert de compiler ergens
minstens 6 bytes (5 voor "hello", 1 voor de afsluitende 0 en
mogelijk 2 extra ongebruikte plaatsen om op een veelvoud van
4 uit te komen) in wat uiteindelijk je executable file
wordt, en onthoudt het adres daarvan "in msg". Dat wil
zeggen, overal in de source waar je naar "msg" refereert,
vult de compiler dat adres in. Het is dus eigenlijk gewoon
een label.
In de call
printf(msg); heeft printf bij aanvang geen
idee hoe lang de string is; printf leest gewoon byte voor
byte uit het geheugen vanaf het gegeven adres in "msg"
totdat er een 0 gelezen wordt; alles voorafgaand aan die 0
wordt naar je scherm gestuurd.
Overigens vind ik het prima als je assembler en C wilt
leren, maar je bent af en toe wel erg naar de "bekende"
(RTFM) weg aan het vragen. Dat je Nederlands niet perfect is
maakt me weinig uit (zolang ik je kan volgen) maar
slordigheden in sourcecode waar je vervolgens uitleg over
vraagt vind ik nogal klungelig:
mov mov 0x8048448,eax
mov ax,0xffffffec(ebp)
Wat "mov mov" is weet ik niet en ik gok dat in de tweede
regel "eax" hoort in plaats van ax. Probeer voortaan zoveel
mogelijk te knippen en plakken vanaf je scherm.
P.S. als je hier een account aanmaakt verschijnen je
bijdragen meteen (je kunt ze dan ook corrigeren - maar doe
dat zo min mogelijk); bovendien halen wij dan niet meerdere
anonieme gebruikers door elkaar.