2

私のプロジェクトでは、インライン アセンブリを使用する必要がありますが、GAS にあまり詳しくないため、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 を使用しますか?

コンパイル時に引数を追加する必要があると思います。

4

3 に答える 3

5

GCC は AT&T 構文を使用し、NASM は Intel 構文を使用します。

2 つの形式を手動で変換する必要がある場合は、objdump および ndisasm ツールが非常に便利です。現在の形式でアセンブルし、ターゲット形式で逆アセンブルしてから、逆アセンブラによって追加されたマシン生成の狂気を修正します。

具体的に AT&T 構文を使用する場合は、objdump を使用する代わりに、GDB で逆アセンブリを確認すると役立つ場合があります。

于 2010-01-21T01:52:33.750 に答える
2

「nasm + gcc」で簡単にグーグルで検索しました。こちらこちら、およびこちらをご覧ください。

簡単に言えば、gcc コンパイル済みオブジェクトとリンクするために nasm に使用されるスイッチは次のとおりです。

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

RTC クロックがある BIOS データから判断すると、使用されているポートは 0x70、ここで使用した 0x71 です...間違っている可能性があります...

于 2010-01-21T01:38:26.633 に答える
1

これが私の検索のトップになったので、関連情報を追加します。

Can I use Intel syntax of x86 assembly with GCC? を参照 してください。

GCC には「-fverbose-asm」、「-fno-asynchronous-unwind-tables」、および「-fconserve-stack」もあり、生成されたアセンブラーが読みやすくなります。

于 2014-11-17T08:47:22.607 に答える