2010-01-21 45 views
2

在我的项目中,我需要使用内联装配,但它需要是Nasm,因为我对GAS不太了解。
我尝试:使用GCC的Nasm内嵌装配

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

有没有办法做到这一点,但使用的,而不是GAS NASM?

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

+1

它看起来像你正在编写比C更多的程序集。为什么你想把它内联在一个C文件中,而不是完全分离出来? – ephemient 2010-01-21 02:13:02

回答

2

我做了 'NASM + GCC' 快速谷歌,看看 herehere,并 here

简而言之,以沿着与所述的gcc编译对象链接到用于NASM开关是:

 
nasm -f elf 

编辑:上面是绝对无关紧要内森寻找类似的于question..here该代码段的GAS的语法是我的GAS'ified版本尝试...

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,我在这里使用......我可能是错的...

+0

但我需要将其作为函数内部使用的内联代码。 – 2010-01-21 01:42:27

+1

@ Nathan @ Ok ...抱歉有误导性的答案...你可以发布实际的汇编代码,我会尝试GAS的吗? – t0mm13b 2010-01-21 01:44:42

+0

添加纳斯姆代码。 **; - )** – 2010-01-21 01:46:57

5

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

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

如果您要特意使用AT & T语法,查看GDB中的反汇编而不是使用objdump可能会很有帮助。