2

在我的项目中,我需要使用内联汇编,但它必须是 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 而不是 GAS?

我想我需要在编译时添加一个参数。

4

3 回答 3

5

GCC 使用 AT&T 语法,而 NASM 使用 Intel 语法。

如果您发现需要在两种格式之间手动转换,objdump 和 ndisasm 工具将非常方便。只需以当前格式汇编,以目标格式反汇编,然后修复反汇编程序添加的任何机器生成的疯狂。

如果您要专门研究 AT&T 语法,那么查看 GDB 中的反汇编而不是使用 objdump 可能会有所帮助。

于 2010-01-21T01:52:33.750 回答
2

我在“nasm + gcc”上做了一个快速的谷歌搜索,看看这里这里这里

简而言之,用于 nasm 以便与 gcc 编译对象链接的开关是:

nasm -f 精灵

编辑:以上内容绝对无关紧要,因为 Nathan 正在寻找类似于问题中的代码片段的 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);

从 RTC 时钟所在的 BIOS 数据来看,使用的端口是 0x70、0x71,我在这里使用过……我可能错了……

于 2010-01-21T01:38:26.633 回答
1

由于这是我搜索的首位,我将添加相关信息:

去看看 我可以在 GCC 中使用 Intel 的 x86 程序集语法吗?

GCC 还具有“-fverbose-asm”、“-fno-asynchronous-unwind-tables”和“-fconserve-stack”,它们可以使生成的汇编程序更容易阅读。

于 2014-11-17T08:47:22.607 回答