Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nasm Inline Assembly Using GCC

In my project I need to use inline Assembly, but it need to be Nasm, because I'm not too much familiar with GAS.
My try:

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

There is any way to do this but using Nasm instead of GAS?

I think I need to add a argument when compiling.

like image 456
Nathan Campos Avatar asked Dec 04 '25 10:12

Nathan Campos


1 Answers

GCC uses AT&T syntax while NASM uses Intel syntax.

If you find you need to manually convert between the two formats the objdump and ndisasm tools will come in very handy. Just assemble in the current format, disassemble in the target format, then fix up any machine-generated craziness added by the disassembler.

If you're going to AT&T syntax specifically, it may be helpful to look at the disassembly in GDB instead of using objdump.

like image 118
Dan Olson Avatar answered Dec 06 '25 23:12

Dan Olson



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!