Inaktivbruker_101125 Skrevet 9. februar 2010 Del Skrevet 9. februar 2010 (endret) 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 9. februar 2010 av The Prophet Lenke til kommentar
GeirGrusom Skrevet 9. februar 2010 Del Skrevet 9. februar 2010 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
Inaktivbruker_101125 Skrevet 9. februar 2010 Forfatter Del Skrevet 9. februar 2010 (endret) Aha, ja jeg forstår. Jeg kan sitere; A minor complication in the code generation arises from the factthat 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 9. februar 2010 av The Prophet Lenke til kommentar
HDSoftware Skrevet 9. februar 2010 Del Skrevet 9. februar 2010 Programmerte litt på Amiga en gang for mange år siden og mener bestemt at D0 til D7 er 8 data registere. Lenke til kommentar
Inaktivbruker_101125 Skrevet 9. februar 2010 Forfatter Del Skrevet 9. februar 2010 Jepp, det er korrekt. Forskjellen er som man ser, at sourcen er første parameter/kommando og deretter registeret. Stikk motsatt fra x86 med andre ord. Litt spesielt at x86 er slik. Lenke til kommentar
GeirGrusom Skrevet 9. februar 2010 Del Skrevet 9. februar 2010 (endret) Vel, det er mye sært med x86 ^^ edit: når det er sagt, har de klart å dytte inn noen rare ting i MIPS sine 30-ish instruksjoner også... Endret 9. februar 2010 av GeirGrusom Lenke til kommentar
Emancipate Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 D0 er bare et data-register. X86: MOV eax, dword [X] Lenke til kommentar
Sceptic Skrevet 20. mars 2010 Del Skrevet 20. mars 2010 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
Inaktivbruker_101125 Skrevet 20. mars 2010 Forfatter Del Skrevet 20. mars 2010 Wow! Utrolig. Flott, takker. Lenke til kommentar
Emancipate Skrevet 20. mars 2010 Del Skrevet 20. mars 2010 The Prophet, du bør nok bruke min oversettelse, selv om den er "feil". Du trenger ikke bruke PIC på x86, det kommer bare til å gi deg en haug med trøbbel. Hvis du putter inn x istedet for 0500h i eksempelet til Sceptic blir det ihvertfall feil. Lenke til kommentar
Sceptic Skrevet 20. mars 2010 Del Skrevet 20. mars 2010 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
Inaktivbruker_101125 Skrevet 20. mars 2010 Forfatter Del Skrevet 20. mars 2010 Jeg må iallefall takke begge to, dere har fått meg på rett spor. Virker mye klarere nå. Igjen - takk! (Forresten, tror jeg husker tsg1zzn fra GMC…?) Lenke til kommentar
Emancipate Skrevet 21. mars 2010 Del Skrevet 21. mars 2010 (endret) 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 21. mars 2010 av tsg1zzn 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å