2009-04-04 4 views
4

私が取り組んでいるカスタムマイクロコントローラ用のアセンブラを書いています。私はバイナリに命令をアセンブルするポイントにアセンブラを持っています。yyparse()を使用して2パスのアセンブラを作成しますか?

しかし、私は現在、ラベルを使用することに問題があります。現在、私のアセンブラは新しいラベルに遭遇すると、ラベルの名前とその参照先のメモリ位置を格納します。命令がラベルを参照すると、アセンブラはラベルをルックアップし、ラベルを適切な値に置き換えます。

これはうまくやっていますが、ラベルがそれを参照する命令の後で定義されていればどうなりますか?このため、私はパーサーをコード上で2回実行させる必要があります。ここで

は、私は現在、私の主な機能を持っているものです。

303 int main(int argc, char* argv[]) 
304 { 
305 
306  if(argc < 1 || strcmp(argv[1],"-h")==0 || 0==strcmp(argv[1],"--help")) 
307  { 
308   //printf("%s\n", usage); 
309   return 1; 
310  } 
311  // redirect stdin to the file pointer 
312  int stdin = dup(0); 
313  close(0); 
314 
315  // pass 1 on the file 
316  int fp = open(argv[1], O_RDONLY, "r"); 
317  dup2(fp, 0); 
318 
319  yyparse(); 
320 
321  lseek(fp, SEEK_SET, 0); 
322 
323  // pass 2 on the file 
324  if(secondPassNeeded) 
325  { 
326   fp = open(argv[1], O_RDONLY, "r"); 
327   dup2(fp, 0); 
328   yyparse(); 
329  } 
330  close(fp); 
331 
332  // restore stdin 
333  dup2(0, stdin); 
334 
335  for(int i = 0; i < labels.size(); i++) 
336  { 
337   printf("Label: %s, Loc: %d\n", labels[i].name.c_str(), labels[i].memoryLoc); 
338  } 
339  return 0; 
340 } 

私はフレックス/バイソン設定内にこれを使用しています。

+0

パスが2回必要か、コードが正しいかどうか尋ねていますか? – grieve

答えて

8

これだけであれば、2パスの完全アセンブラは必要ありません。ラベルを参照するときにラベルが定義されていない場合は、スタンド・イン・アドレス(0x0000など)を出力し、前方参照を持つすべての場所とその参照先のシンボルをリストするデータ構造を持つだけです。ファイルの最後(またはローカルシンボルがある場合はブロック)で、そのリストを調べてアドレスにパッチを当てるだけです。

関連する問題