2015-06-18 52 views
0

在C,如果我想叫基於鍵盤輸入的功能,我會寫這樣的:大會相當於函數指針數組嗎?

#include <stdio.h> 

char A(void) { 
     return 'a'; 
} 

char B(void) { 
     return 'b'; 
} 

char C(void) { 
     return 'c'; 
} 

char (*CHARS[])(void) = {A, B, C}; 
int main(void) { 
     char calls[] = {'a', 'b', 'c'}; 
     char c = CHARS[getc(stdin) - 'a'](); 
     printf("%c\n", c); 
     return 0; 
} 

我可以在組件調用數組?如果該事實具有相關性,我正在使用nasm來編譯內核。

編輯 周圍的一些打的多就在剛纔,我想出了:

 jmp main 
f0: 
f1: 
f2: 
     mov  ax, 0 
main: 
     mov  bx, fns 
     add  bx, ax 
     cmp  bx, 0 
     je  end 
     call [bx] 
     inc  ax 
     jmp  main 
     fns  dw f0, f1, f2, 0 
end: 
     hlt 

是上述正確的(我是從字面上就像兩個天進​​裝配)?

+0

您的更新代碼有正確的想法。但是:(1)你假設每個地方都有16位地址。那是你要的嗎? (2)你可以擺脫「ax」的使用。假設一個16位尋址模式,你想每次通過你的'main'循環加2到'bx',(3)你想檢查'[bx]'是否爲0,而不是'bx'是否爲0。 bx'不會是0,因爲它是一個指向你的地址表的指針。 – lurker

+0

@lurker是的,它是16位模式。謝謝。 – motoku

回答

0

您可以創建一個跳轉表,並修改PC(程序計數器)以跳轉到表中正確的索引。例如

ADD PC, $c  # Add index entered by the user to the PC 
    BRA function_a 
    BRA function_b 
    BRA function_c 
end_jump_table: 
    # ... 

而且別的地方:

function_a: 
    # do your thing 
    BRA end_jump_table 
function_b: 
    # do your thing 
    BRA end_jump_table 
function_c: 
    # do your thing 
    BRA end_jump_table 

沒有任何特定的彙編語言,但你的想法。