アイデアは簡単です。あなたは十分にアセンブリ言語がわからない場合は、以下の同等のCコードを理解してみてください(私が定義するプロセスの自由を取った_ *()明確な文字を印刷し、()メインで投げるなど):
#include <stdio.h>
void Process_A(void)
{
printf("A\n");
}
void Process_B(void)
{
printf("B\n");
}
void Process_C(void)
{
printf("C\n");
}
void Process_D(void)
{
printf("D\n");
}
typedef struct
{
char Char;
void (*Subroutine)(void);
} CaseTableEntry;
CaseTableEntry CaseTable[] =
{
{ 'A', &Process_A }, // equivalent to "BYTE 'A'" + "DWORD Process_A"
{ 'B', &Process_B },
{ 'C', &Process_C },
{ 'D', &Process_D }
};
void Process(char Char)
{
const size_t NumberOfEntries = sizeof(CaseTable)/sizeof(CaseTableEntry);
CaseTableEntry* entry = &CaseTable[0]; // equiv to "mov ebx, CaseTable"
size_t count = NumberOfEntries; // equiv to "mov ecx, NumberOfEntries"
do
{
// "L1:" would be here
if (entry->Char == Char) // equiv to "cmp al,[ebx]" + "jne L2"
{
entry->Subroutine(); // equiv to "call PTR [ebx + 1]"
break; // equiv to "jmp L3"
}
// "L2:" would be here
entry++; // equiv to "add ebx, EntrySize"
} while (--count > 0); // equiv to "loop L1"
// "L3:" would be here
}
int main(void)
{
Process('A');
Process('B');
Process('X');
Process('C');
Process('D');
return 0;
}
出力:
A
B
C
D
ここで唯一の問題は、$
とmov ebx, CaseTable
のようなものです。
$ evaluates to the assembly position at the beginning of the line containing the expression; so you can code an infinite loop using JMP $.したがって
EntrySize = ($ - CaseTable)
テーブルの最初のエントリの大きさを算出し、同様にNumberOfEntries = ($ - CaseTable)/EntrySize
最初テーブル全体のサイズを計算した後、あなたのテーブルのエントリの数を与える一つのエントリのサイズで除算。
他のアセンブラ(MASMやTASMなど)とは異なり、NASM mov ebx, CaseTable
は、CaseTable
という名前のオブジェクトのアドレスをebxにロードすることを意味します。他のアセンブラでは、CaseTable
という名前のオブジェクトから最初の4バイトをebxに読み込むことができます。 同様に、DWORD Process_A
は、Process_A
という名前のオブジェクトのアドレスを含むDWORDを定義します。
他のアセンブラでは、等価物はmov ebx, OFFSET CaseTable
とDWORD OFFSET Process_A
と書く必要があります。
残りについては、the official NASM documentationおよびIntel's/AMD's x86 CPUマニュアルを参照してください。あなたの宿題は基本的に行います。何かが明確でない場合は、のの質問にお答えください。
Cに精通しているなら、それは2D配列ではなく 'struct'であると考えるほうが役に立つかもしれません。 'struct {char lookup; function_ptr_tプロセス。 } CaseTable [] = {{A '、Process_A}、/ * ... * /}; '#define NumberOfEntries(sizeof(CaseTable)/ sizeof(CaseTable [0]))' – user786653
Btw、実際には2次元アレイ。これは要素の配列であり、各要素には2つの要素があります。配列は通常、同じサイズの要素を持ちます。 "BYTE 'A'"と "DWORD Process_A"はありません。 –