Gå til innhold

Assembly: [Løst]mov [esp+24], ebx hva skjer egentlig her?


Anbefalte innlegg

Videoannonse
Annonse

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

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 av fenderebest
Lenke til kommentar
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

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 av fenderebest
Lenke til kommentar
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
  • 9 måneder senere...

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 av TheMaister
Lenke til kommentar
  • 2 uker senere...

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
  • 2 år senere...

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...