2009-10-26 2 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. "1 층"은 16 진수로 나타내는 접미사를 가질 필요가 : 귀하의 예를 제공 그럼에도 불구하고

    은 내가 먼저 해결해야 할 몇 가지 문제를 참조하십시오. VC++에서는 인라인 어셈블리에서 C 스타일 (0x1f) 또는 어셈블리 스타일 (1fh) 접미어를 사용할 수 있습니다.
  2. 두 개의 "1"레이블이있는 것으로 보입니다. 같은 이름의 두 레이블이 충돌한다는 사실 외에도 VC++은 숫자 만 들어있는 레이블 이름을 지원하지 않습니다.
  3. 1fh는 이동할 수있는 이상한 주소입니다. 리얼 모드에서는 IRQ 영역입니다. 보호 모드에서는 첫 번째 페이지 안에 있습니다. 대부분의 OS가 NULL 디 레퍼런스를 포착하지 않습니다.

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

    을하지만 이것은 당신에게 아무것도 유용을받지 않습니다 : 그 없다면

이 코드를 VC로 번역 할 수 있습니다 ++과 같아야합니다. 따라서 성취하고자하는 바를 말씀하십시오.

+0

나는 그가 [this] (http://wiki.osdev.org/8259_PIC#Initialisation)를 언급하고 있다고 생각합니다. – Mehrdad

관련 문제