2014-10-26 73 views
1

我一直在Unix操作系統下編程硬件(鼠標,鍵盤等),Minix和我遇到一些問題時提示將它與程序集(AT & T語法)相結合。ASM/C中的中斷處理程序 - 如何? -Minix

截至目前,我正在對鍵盤進行編程(獲取和打印掃描代碼),並且我需要在C和ASM中執行此操作。我已經開發了C函數,它正在正常工作,現在我必須用ASM函數替換IH(中斷處理程序),如以下代碼所示:(要替換的代碼位於函數「receiver_loop」中)

int timer_subscribe_int(void) { 

    int temp = hook_id; //integer between 0 and 31 
    sys_irqsetpolicy(TIMER0_IRQ, IRQ_REENABLE,&hook_id); // returns a hook id that you can then use to enable and disable irqs. 
    sys_irqenable(&hook_id); 
    return temp; 
} 

int timer_unsubscribe_int() { 

    if (sys_irqrmpolicy(&hook_id)!= OK) return 1; 
    return 0; 
} 


void receiver_loop() { 

    int ipc_status,r, seconds = 0, running = 1; 
    message msg; 

    int shift = keyboard_subscribe_int(); 
    int shift_timer; 
    if(timer_flag) shift_timer = timer_subscribe_int(); 

     while(running && (seconds < time)) { 
      /* Get a request message. */ 
      if (driver_receive(ANY, &msg, &ipc_status) != 0) { 
       printf("driver_receive failed with: %d", r); 
       continue; 
      } 
      if (is_ipc_notify(ipc_status)) { /* received notification */ 
       switch (_ENDPOINT_P(msg.m_source)) { 
       case HARDWARE: /* hardware interrupt notification */ 
        if (msg.NOTIFY_ARG & BIT(shift)) { /* subscribed interrupt bit 1 fica a 1, logo é 1*/ 

        // Handle interruption 
        /*Replace the following commented code with ASM function(s) 

         if(keyboard_int_handler()) running = 0; 
         else seconds = 0; 

        } 

        else if (msg.NOTIFY_ARG & BIT(shift_timer) && timer_flag) { // subscribed interrupt bit 1 fica a 1, logo é 1 
         //printf("\n Entrou aqui. Counter %d \n", counter); 
         timer_int_handler(); 
         if (counter%60 == 0){ 
          //as the frequency of interruptions is 60Hz as assumed, that means every 60 interrupts 1 second has passed 
          //so whatever is inside this if-block happens each second 
          seconds++; // increments the seconds counter 
          //printf("\n Segundos: %d \n", seconds); 
        };*/ 
       } 
       break; 
      default: 
       break; /* no other notifications expected: do nothing */ 
      } 
     } else { /* received a standard message, not a notification */ 
      /* no standard messages expected: do nothing */ 
     } 
    } 

    if(seconds >= time) { 
     printf("\nTimeout. Terminating...\n"); 
    } 


    keyboard_unsubscribe_int(); 
    timer_unsubscribe_int(); 
    return; 
} 

這是我得到了什麼,到目前爲止,說實話,我有點停留在如何從這裏走,並得到了類似的ASM功能,以取代註釋代碼。任何人都可以幫我一把嗎?

+0

你的目標CPU是什麼?什麼操作系統? – nrz 2014-10-26 18:03:57

+0

Minix 3.1.8。你對第一個問題的意思是? – Khabz 2014-10-26 18:08:29

+0

你正在使用什麼處理器? – nrz 2014-10-26 18:15:08

回答

3

gcc提供了一個簡單的方法來獲取您的c代碼並輸出相關的彙編程序。所以如果你需要把一些C代碼轉換成彙編器。一個簡單的方法看起來像這樣:

  1. 首先將代碼本地化爲一個例程。
  2. __attribute__((noinline))標記此例程以防止gcc 將您的例程內聯到其他例程中。雖然通常內聯是一件好事,它可以讓你的代碼更快運行,但如果你試圖隔離特定的代碼,那不是你所需要的。
  3. 使用如下命令行編譯代碼:gcc -S -o test.s test.c。請注意,您可以(也可能應該)打開 優化(gcc -O2 -S -o test.s test.c)。
  4. test.c程序集現在正在測試中。檢查它找到你的例行程序 。

請注意,默認情況下,i386上的輸出將採用att格式。如果您更喜歡英特爾格式,則可以使用-masm=intel