NASM -Inline -Baugruppe mit GCC
-
21-09-2019 - |
Frage
In meinem Projekt muss ich die Inline -Baugruppe verwenden, aber es muss Nasm sein, weil ich mit Gas nicht zu viel vertraut bin.
Mein Versuch:
void DateAndTime()
{
asm
(.l1: mov al,10 ;Get RTC register A
out RTCaddress,al
in al,RTCdata
test al,0x80 ;Is update in progress?
jne .l1 ; yes, wait
mov al,0 ;Get seconds (00 to 59)
out RTCaddress,al
in al,RTCdata
mov [RTCtimeSecond],al
mov al,0x02 ;Get minutes (00 to 59)
out RTCaddress,al
in al,RTCdata
mov [RTCtimeMinute],al
mov al,0x04 ;Get hours (see notes)
out RTCaddress,al
in al,RTCdata
mov [RTCtimeHour],al
mov al,0x07 ;Get day of month (01 to 31)
out RTCaddress,al
in al,RTCdata
mov [RTCtimeDay],al
mov al,0x08 ;Get month (01 to 12)
out RTCaddress,al
in al,RTCdata
mov [RTCtimeMonth],al
mov al,0x09 ;Get year (00 to 99)
out RTCaddress,al
in al,RTCdata
mov [RTCtimeYear],al
ret);
}
Es gibt eine Möglichkeit, dies zu tun, als Nasm anstelle von Gas zu verwenden?
Ich denke, ich muss beim Kompilieren ein Argument hinzufügen.
Lösung
Ich habe ein schnelles Google auf 'Nasm + GCC' gemacht, schau mal an hier, hier, und hier.
Kurz gesagt, die Schalter für NASM verwendet werden, um zusammen mit dem GCC -kompilierten Objekt zu verknüpfen, lautet:
nasm -f elf
Bearbeiten: Das obige war absolut irrelevant, da Nathan nach einer Gassyntax suchte, die dem Code -Snippet in der Frage ähnelt. Hier ist mein Versuch der Gasversion ...
void DateAndTime()
{
int RTCaddress, RTCdata, RTCtimeSecond, RTCtimeHour, RTCtimeMinute, RTCtimeDay, RTCtimeMonth, RTCtimeYear;
// Set RTCaddress and RTCdata respectively first...
RTCaddress = 0x70;
RTCdata = 0x71;
asm
(
.l1:
movb $10, %al ;Get RTC register A
out %al, RTCaddress ; Think RTCaddress needs to be declared...
in RTCdata, %al ; RTCdata needs to be declared
test $80, %al ;Is update in progress?
jne .l1 ; yes, wait
movb $0, %al ;Get seconds (00 to 59)
out %al, RTCaddress
in RTCdata, %al
movb %al, [RTCtimeSecond]
movb $2, %al ;Get minutes (00 to 59)
out %al, RTCaddress
in RTCdata, %al
movb %al, [RTCtimeMinute]
movb $4, %al ;Get hours (see notes)
out %al, RTCaddress
in RTCdata, %al
movb %al, [RTCtimeHour]
movb $7, %al ;Get day of month (01 to 31)
out %al, RTCaddress
in RTCdata, %al
movb %al, [RTCtimeDay]
movb $8, %al ;Get month (01 to 12)
out %al, RTCaddress
in RTCdata, %al
movb %al, [RTCtimeMonth]
movb $9, %al ;Get year (00 to 99)
out %al, RTCaddress
in RTCdata, %al
movb %al, [RTCtimeYear]
ret);
Nach den BIOS -Daten zu urteilen, in denen sich die RTC -Uhr befindet, sind die verwendeten Ports 0x70, 0x71, die ich hier verwendet habe ... Ich kann mich irren ...
Andere Tipps
GCC verwendet die AT & T -Syntax, während NASM die Intel -Syntax verwendet.
Wenn Sie feststellen, dass Sie zwischen den beiden Formaten manuell konvertieren müssen, werden die Werkzeuge von Objdump und NDISASM sehr praktisch. Montieren Sie einfach im aktuellen Format, zerlegen Sie im Zielformat und reparieren Sie dann alle vom Disassembler hinzugefügten maschinellgenerierten Verrücktheit.
Wenn Sie speziell zur AT & T -Syntax gehen, kann es hilfreich sein, die Demontage in GDB zu betrachten, anstatt Objdump zu verwenden.
Da dies ganz oben auf meiner Suche kam, füge ich die entsprechenden Informationen hinzu:
Geh schau Kann ich die Intel -Syntax der X86 -Baugruppe mit GCC verwenden?
GCC hat auch "-Fverbose-asm", "-Fno-asynchronous-unwind-Tabellen" und "-Fconserserv-Stack", was den generierten Assembler zu einer einfacheren Lektüre machen kann.