Gå til innhold

Anbefalte innlegg

Heisann, driver for moroskyld med et assemblyprojekt (skrive en parser som gjør vanlig programmeringskode om til assembly) som er basert på en tutorial som er skrevet for 68000 assembly. Jeg har klart å gjøre mesteparten om til x86 selv (med en del tweaking), men jeg har støtt på noe som i realiteten skal være enkelt, men er ikke sikker på hvordan det skrives i x86.

 

MOVE X(PC), D0

 

Det er 68000-koden, der X er en variabel som inneholder en verdi (integer).

 

Da bør det vel bli noe a lá

 

mov e*x, ??

 

Har aldri sett (PC) blir brukt etter en variabel på en slik måte, så er litt stuck her. Egentlig ganske noobish spørsmål men jeg er ganske ny til dette.

 

Takk for alle svar.

Endret av The Prophet
Lenke til kommentar
Videoannonse
Annonse

Nå kjenner ikke jeg til 68000 assembly, men basert på min kjennskap til assembly og prosessorer står PC for Program Counter?

Isåfall er oversettelsen eip (instruction pointer)

D0 vet jeg ærlig talt ikke, men mine x86 kunnskaper er blitt litt rustne, ettersom det går mest i MIPS assembly for tiden (skriver en MIPS macro assembler)

Men alt i alt ser dette ut som en instruksjon som har til hensikt å gjøre et triks som er svært uvanlig, og vil sannsynligvis ikke fungere i x86. Altså self modifying code.

Lenke til kommentar

Aha, ja jeg forstår. Jeg kan sitere;

 

 

A minor complication in the code generation arises from the fact

that most 68000 operating systems, including the SK*DOS that I'm

using, require the code to be written in "position-independent"

form, which basically means that everything is PC-relative. The

format for a load in this language is

 

(...) koden over etc (...)

 

 

Så ja, det kan nok stemme at PC står for program counter. Får se hva jeg får til. Takk for hjelpen

Endret av The Prophet
Lenke til kommentar
  • 1 måned senere...
  • 2 uker senere...

D0 er bare et data-register. X86:

MOV eax, dword [X]

Du har rett i at D0 er et dataregister, men resten er feil.

 

MOVE X(PC), D0 instruksjonen flytter innholdet av (PC) + X inn i D0.

 

Ta f.eks:

 

$1000 MOVE.W    $500(PC), D0;

 

I og med at PC (eller ip i x86 verden) peker på neste instruksjon, så er PC lik $1002.

Legg til $500 og man ender opp med adresse $1502.

Hvis adresse $1502 inneholder 0xbeef, så blir resultatet i D0 0xbeef.

 

Noe lignende i pseudo x86:

MOV    EAX, EIP        ;spar ip (pc)
ADD    EAX, 0500h        ;kalkuler adresse
MOV    EBX, [EAX]        ;legg innholdet av adressen i eax til ebx

 

Sceptic

Lenke til kommentar

Du trenger ikke bruke PIC på x86, det kommer bare til å gi deg en haug med trøbbel.

Nå var vel dette bare et eksempel på hvordan man 'oversetter' MOVE X(PC), D0 til x86, men jeg er enig, dette er skikkelig nasty programmering.

Hvis du putter inn x istedet for 0500h i eksempelet til Sceptic blir det ihvertfall feil.

Det kommer vel an på hva du vil med koden, eller hva?

 

Eksempel med variabel:

MOV    EAX, EIP        ;spar ip (pc)
ADD    EAX, [X]        ;kalkuler adresse (ip + 07ffh) 
MOV    EBX, [EAX]      ;legg innholdet av adressen i eax til ebx
.
.
.
X    DW    07ffh

Sceptic

Lenke til kommentar

Hvis du putter inn x istedet for 0500h i eksempelet til Sceptic blir det ihvertfall feil.

Det kommer vel an på hva du vil med koden, eller hva?

Ja, men jeg vet tilfeldigvis hva han vil med koden. ;)

 

(Forresten, tror jeg husker tsg1zzn fra GMC…?)
Det kan jo hende.

 

Du kan forresten finne en oversettelse til C og x86 asm her: http://tech.groups.yahoo.com/group/compilers101/files/

 

Grunnen til oversettelsen til Sceptic blir feil er at på 68000 tolker MOVE minneadressen som relativ til PC. For å laste inn fra en absolutt adresse må man derfor legge til PC for å kompensere for dette. På x86 tolker MOV minneadressen som absolutt. Hvis man legger til EIP blir adressen relativ, dette er ikke det som er ment i den originale koden.

Endret av tsg1zzn
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...