Nasm Inline Assembly с использованием GCC - PullRequest
2 голосов
/ 21 января 2010

В моем проекте мне нужно использовать встроенную сборку, но это должен быть Nasm, потому что я не слишком знаком с GAS.
Моя попытка:

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);
}

Есть ли способ сделать это, но используя Nasm вместо ГАЗА?

Я думаю, мне нужно добавить аргумент при компиляции.

Ответы [ 3 ]

5 голосов
/ 21 января 2010

GCC использует синтаксис AT & T, а NASM использует синтаксис Intel.

Если вы обнаружите, что вам нужно вручную выполнить конвертацию между двумя форматами, инструменты objdump и ndisasm окажутся очень полезными. Просто соберите в текущем формате, разберите в целевом формате, затем исправьте любое машинное сумасшествие, добавленное дизассемблером.

Если вы собираетесь использовать синтаксис AT & T специально, может быть полезно взглянуть на разборку в GDB вместо использования objdump.

2 голосов
/ 21 января 2010

Я быстро просмотрел Google 'nasm + gcc', посмотрел здесь , здесь и здесь .

В двух словах, ключи, которые будут использоваться для nasm для связи с скомпилированным объектом gcc:

nasm -f elf

Редактировать: Вышесказанное было абсолютно неактуально, так как Натан искал синтаксис GAS, похожий на фрагмент кода в вопросе. Вот моя попытка версии, модифицированной GAS ...

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);

Судя по данным BIOS, где часы RTC, используются порты 0x70, 0x71, которые я использовал здесь ... Я могу ошибаться ...

1 голос
/ 17 ноября 2014

Поскольку это стало вершиной моего поиска, я добавлю соответствующую информацию:

иди посмотри Можно ли использовать синтаксис Intel сборки x86 с GCC?

GCC также имеет "-fverbose-asm", "-fno-asynchronous-unwind-tables" и "-fconserve-stack" что может облегчить чтение сгенерированного ассемблера.

...