1

これをVC++とMASMを使用するように変換する方法

static __inline__ void io_wait(void)
{
  asm volatile("jmp 1f;1:jmp 1f;1:");
}

asmが__asmに変更され、揮発性を削除することはわかっていますが、次は何ですか?

以下のコードに配置する関数を作成しようとしています

#define PIC1        0x20
#define PIC2        0xA0
#define PIC1_COMMAND    PIC1
#define PIC1_DATA   (PIC1+1)
#define PIC2_COMMAND    PIC2
#define PIC2_DATA   (PIC2+1)
#define PIC_EOI     0x20

#define ICW1_ICW4   0x01        /* ICW4 (not) needed */
#define ICW1_SINGLE 0x02        /* Single (cascade) mode */
#define ICW1_INTERVAL4  0x04        /* Call address interval 4 (8) */
#define ICW1_LEVEL  0x08        /* Level triggered (edge) mode */
#define ICW1_INIT   0x10        /* Initialization - required! */

#define ICW4_8086   0x01        /* 8086/88 (MCS-80/85) mode */
#define ICW4_AUTO   0x02        /* Auto (normal) EOI */
#define ICW4_BUF_SLAVE  0x08        /* Buffered mode/slave */
#define ICW4_BUF_MASTER 0x0C        /* Buffered mode/master */
#define ICW4_SFNM   0x10        /* Special fully nested (not) */

void remap_pics(int pic1, int pic2)
{
    UCHAR   a1, a2;

    a1=ReadPort8(PIC1_DATA);
    a2=ReadPort8(PIC2_DATA);

    WritePort8(PIC1_COMMAND, ICW1_INIT+ICW1_ICW4);
    io_wait();
    WritePort8(PIC2_COMMAND, ICW1_INIT+ICW1_ICW4);
    io_wait();
    WritePort8(PIC1_DATA, pic1);
    io_wait();
    WritePort8(PIC2_DATA, pic2);
    io_wait();
    WritePort8(PIC1_DATA, 4);
    io_wait();
    WritePort8(PIC2_DATA, 2);
    io_wait();

    WritePort8(PIC1_DATA, ICW4_8086);
    io_wait();
    WritePort8(PIC2_DATA, ICW4_8086);
    io_wait();

    WritePort8(PIC1_DATA, a1);
    WritePort8(PIC2_DATA, a2);
}
4

2 に答える 2

1

このコードを使って何をしようとしているのかを教えていただけると、よりよい結果が得られると思います。VC++ でサポートされているプラ​​ットフォームはいずれも、無条件ジャンプを実行して IO の完了を待ちません。

それにもかかわらず、あなたの例を考えると、最初に対処する必要があるいくつかの問題があります。

  1. 「1f」には、16 進数であることを示すサフィックスが必要です。VC++ では、インライン アセンブリで C スタイル (0x1f) またはアセンブリ スタイル (1fh) のサフィックスを使用できます。
  2. 「1」のラベルが 2 つあるようです。同じ名前の 2 つのラベルが衝突するという事実に加えて、VC++ は数字のみを含むラベル名をサポートしていないと思います。
  3. 1fh は、ジャンプする奇妙なアドレスです。リアル モードでは IRQ 領域であり、プロテクト モードでは最初のページ内にあり、ほとんどの OS は NULL 逆参照をキャッチするために非存在のままにします。

それを除けば、コードを VC++ に変換できるのは次のようになります。

__asm {
    jmp 1fh
a1:
    jmp 1fh
b1:
}

しかし、これでは何も役に立ちません。だから、あなたが達成しようとしていることを述べてください

于 2009-10-26T07:41:57.990 に答える