使用GCC的Nasm内联汇编

使用GCC的Nasm内联汇编,c,gcc,inline,nasm,inline-assembly,C,Gcc,Inline,Nasm,Inline Assembly,在我的项目中,我需要使用内联汇编,但它必须是Nasm,因为我对GAS不太熟悉。 我的尝试: 有没有办法做到这一点,但使用Nasm而不是气体 我想我需要在编译时添加一个参数。我在“nasm+gcc”上快速搜索了一下,看了一下,然后 简而言之,nasm用于与gcc编译对象链接的开关是: nasm -f elf 根据RTC时钟所在的BIOS数据判断,使用的端口是0x70、0x71,我在这里使用了这些端口。。。我可能错了…GCC使用AT&T语法,而NASM使用Intel语法 如果您发现需要在这两种格式之

在我的项目中,我需要使用内联汇编,但它必须是Nasm,因为我对GAS不太熟悉。
我的尝试:

有没有办法做到这一点,但使用Nasm而不是气体

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

我在“nasm+gcc”上快速搜索了一下,看了一下,然后

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

nasm -f elf
根据RTC时钟所在的BIOS数据判断,使用的端口是0x70、0x71,我在这里使用了这些端口。。。我可能错了…

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

如果您发现需要在这两种格式之间手动转换,objdump和ndisam工具将非常方便。只需以当前格式组装,以目标格式拆解,然后修复由拆解器添加的任何机器生成的疯狂


如果您要特别了解AT&T语法,在GDB中查看反汇编而不是使用objdump可能会有所帮助。

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

去看看

GCC还有“-fverbose asm”、“-fno异步展开表”和“-fconserve堆栈”
这可能使生成的汇编程序更容易阅读。

但我需要作为内联代码在函数中使用。@Nathan@Ok。。。对不起,回答有误导性…你能发布实际的汇编代码吗?我会尝试GAS'ify吗?可能有输入错误…在GAS中,语法是助记符src,dest,MASM/TASM是相反的,即助记符dest,src。助记符前缀分别是b、s、i、l(字节、短、int、长)。寄存器的前缀为%。作为常量的数字前缀为$。请查看此处,关于更多细节…这是我从上面的链接中学到的关于GAS的基本知识…看起来你用的程序集比用C写的要多。为什么你想把这个内联到C文件中,而不是把它完全分离出来? nasm -f elf
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);