Techster Skrevet 17. juni 2009 Del Skrevet 17. juni 2009 Basic spm; når det står slik mov [esp+24], ebx da hentes 32-bits som starter på esp+24 og legges i ebx? Gjelder det samme hvis mov byttes ut med f.eks cmp,add,xor, etc..? Lenke til kommentar
Emancipate Skrevet 17. juni 2009 Del Skrevet 17. juni 2009 mov destination, source Lenke til kommentar
fenderebest Skrevet 17. juni 2009 Del Skrevet 17. juni 2009 Husk at når en addresse omgis av hakeparantser feks [esp+24] så betyr det at da referer man en addresse i minnet. mov [esp+24], ebx vil da dermed sørge for å kopiere verdien i registeret ebx og legge det i den virituelle addressen [esp+24] Lenke til kommentar
Techster Skrevet 18. juni 2009 Forfatter Del Skrevet 18. juni 2009 og den verdien er 32-bits når destination parameteret er 32-bits? som i eax, ebx, ecx etc, mens verdien blir 16-bits hvis man bruker al,ah,bl,bh, etc? hvis det hadde stått mov esp+24, ebx så hadde det vært verdien som ligger i ebx som hadde blitt lagt inn på minneadressen esp+24 peker til? Appropo: vet jeg kløna med source, dest parameterene i første innlegg. slurvefeil. Lenke til kommentar
fenderebest Skrevet 18. juni 2009 Del Skrevet 18. juni 2009 (endret) Den 16 bits tilsvarende registret til eax heter ax. Mens al og ah refererer til henholdsvis til de lave og høye 8 bitene i registeret ax. mov esp+24, ebx blir egentlig en meningsløs funksjon da den ikke refererer til noe minne. Så hakeparantesen er viktig å huske på. Endret 18. juni 2009 av fenderebest Lenke til kommentar
Techster Skrevet 20. juni 2009 Forfatter Del Skrevet 20. juni 2009 Den 16 bits tilsvarende registret til eax heter ax. Mens al og ah refererer til henholdsvis til de lave og høye 8 bitene i registeret ax. mov esp+24, ebx blir egentlig en meningsløs funksjon da den ikke refererer til noe minne. Så hakeparantesen er viktig å huske på. Vil ikke esp+24 hente verdien på den minneadressen som esp+24 peker til da og [esp+24] hente minneadressen? Samme som forskjellen mellom &pointer og pointer i C. Lenke til kommentar
fenderebest Skrevet 20. juni 2009 Del Skrevet 20. juni 2009 (endret) esp+24 peker ikke til noen minneddresse, [esp+24] gjør det. Mao vil esp+24 bare være en verdi. Esp+24 tar bare utgangspunkt i den verdien satt i stakkpekerregisteret og øker den med 24. mov ebp, esp feks setter bare verdien i ebp til verdien i esp. Endret 20. juni 2009 av fenderebest Lenke til kommentar
Emancipate Skrevet 20. juni 2009 Del Skrevet 20. juni 2009 Den 16 bits tilsvarende registret til eax heter ax. Mens al og ah refererer til henholdsvis til de lave og høye 8 bitene i registeret ax. mov esp+24, ebx blir egentlig en meningsløs funksjon da den ikke refererer til noe minne. Så hakeparantesen er viktig å huske på. Vil ikke esp+24 hente verdien på den minneadressen som esp+24 peker til da og [esp+24] hente minneadressen? Samme som forskjellen mellom &pointer og pointer i C. esp+24 er nummeret til minneadressen. Men du kan ikke flytte en verdi (lagret i ebx) inn i et nummer! [esp+24] er en referanse til innholdet lagret i minneadressen. mov [esp+24], ebx kopierer verdien i ebx til innholdet i minneadresse esp+24. Glem hvordan pekere virker i C. Når jeg skulle lære C skjønte jeg ingen ting av pekersystemet, på tross av at jeg vet hvordan pekere faktisk virker (i assembly). C har en virkelighetsfjern pekersyntaks. Lenke til kommentar
TheMaister Skrevet 4. april 2010 Del Skrevet 4. april 2010 (endret) Jasså? Synes pekersyntaksen i C er veldig lik den man ser i x86 asm. [esp+22] er tilsvarende *(foo+22) i C, som er en annen måte å skrive foo[22] på, sett nå at foo er av type der sizeof() == 1. Derfor man kan skrive syke uttrykk som 22[foo], siden det blir *(22 + foo), som gir mening for kompilatoren. Den største forskjellen kanskje mellom C sine pekere og x86 asm sin er pekeraritmetikken, der man slipper å telle bytes for å benytte seg av pekere til structs osv. Hvis man vil tenke i bytes kan man caste på finurlige måter. *((int*)((char*)foo + offset)) = value Veldig hacky måte å gjøre ting på, men det er mulig. Der man i C kan skrive noe som dette int32_t foo[10]; foo[5] = 4; // *(foo+5) = 4; så ville det ha blitt noe ala dette i x86 sub esp, 40 mov [esp+20], 4 ; 5 * sizeof(int32_t) == 20 Jeg ser egentlig ikke forskjellen. Tankegangen er lik. Endret 4. april 2010 av TheMaister Lenke til kommentar
Emancipate Skrevet 17. april 2010 Del Skrevet 17. april 2010 Bra bumpa, men la gå. [esp+22] er tilsvarende *(foo+22) i C Absolutt ikke. Fordi foo er en variabel der verdien er lagret i minne. For å gjøre *(foo+22) i assembly blir det:mov edx, [foo] mov edx, [edx+22] Med andre ord, det som ser ut som én dereference i C blir to i assembly. Fordi C implisitt bruker dereference på alle variabler, også pekere. For å ikke bruke dereference må du sette en & foran variabelen. x86 assembly i intel syntax bruker ikke implisitt dereference. Så hvis du har "int var" og skal ha adressen til var, bruker du "&var", ikke var. Men hvis du har "var dd 0" og skal ha adressen til var, bruker du ganske enkelt "var". *(foo) tilsvarer ikke "mov eax, [foo]", det tilsvarer "mov eax, [foo] mov eax, [eax]" Og når vi kommer til pekeraritmetikk er det ihvertfall annerledes. Lenke til kommentar
LonelyMan Skrevet 6. september 2012 Del Skrevet 6. september 2012 mov [esp+24], ebx setter verdien fra ebx på stacken esp + 24 bytes. Det kan være ett av to ting, verdien på stacken kan være en parameter som ble passert til funksjonen instruksjonen ligger i, i så tilfelle så er det parameter 1 som skrives over om det er 5 parametere, og parameter 2 om det er 6 parametere. Men avhengig av stack frame oppsettet så kan det også bety at en refererer en tilfeldig annen variabel som brukes i funksjonen. mov ebp, esp gjøres for å referere lokale variabler i funksjonen, det er her man setter opp stack framen. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå