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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top