2009-10-26 17 views
1

如何轉換這種使用VC++和MASM內嵌IO等待使用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); 
} 

回答

1

我認爲你必須告訴我們你想使用此代碼做什麼更好的運氣。 VC++支持的平臺都不會通過執行無條件跳轉來等待IO完成。

儘管如此,考慮到你的榜樣,我看你需要先解決幾個問題:

  1. 「1F」需要有一個後綴,這表明它的十六進制。在VC++中,你可以在內聯彙編中使用C風格(0x1f)或彙編風格(1fh)後綴
  2. 似乎你有兩個「1」標籤。除了兩個同名的標籤會發生碰撞,我相信VC++不支持僅包含數字的標籤名稱
  3. 1fh是一個奇怪的地址可以跳轉到。在實模式下,它是IRQ區域,在保護模式下它位於第一頁內,大多數操作系統保持不存在以捕獲NULL解引用。

除非是,你的代碼可以被轉換爲VC++應該是這樣的:

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

但是,這不會讓你任何有用的東西。所以請說明你想要完成什麼

+0

我想他是指[this](http://wiki.osdev.org/8259_PIC#Initialisation)。 – Mehrdad 2012-05-20 02:37:25