0

LLVM アセンブリ コードでユーザー入力を取得することについての簡単な質問です。それはメイン関数の引数にありますか? 現在、私の主な機能は次のようになっています。

define i32 @main() nounwind {
factorial.exit:
  %0 = tail call i32 @factorial(i32 3) nounwind   ; <i32> [#uses=1]
  %1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32     0, i32 0), i32 %0) nounwind ; <i32> [#uses0]
  ret i32 0
}

現時点では 3 の階乗、または 3 の場所に入力した数値を計算します。現在、これを端末から実行していますが、最終的に実行するためのメイクファイルを作成します。端末からユーザー入力を取得するにはどうすればよいですか。バイトコードにコンパイルした後、「lli factorial.bc 5」のように実行すると、5 の階乗が得られます。

助けてくれてありがとう!

4

2 に答える 2

0

llvm.org/demoでコードをコンパイルすると、次のようになります。

define i32 @main(i32 %argc, i8** nocapture %argv) nounwind uwtable {
  %1 = getelementptr inbounds i8** %argv, i64 1
  %2 = load i8** %1, align 8, !tbaa !0
  %3 = tail call i64 @strtol(i8* nocapture %2, i8** null, i32 10) nounwind
  %4 = trunc i64 %3 to i32
  %5 = icmp eq i32 %4, 0
  br i1 %5, label %factorial.exit, label %tailrecurse.i

tailrecurse.i:                                    ; preds = %tailrecurse.i, %0
  %X.tr2.i = phi i32 [ %6, %tailrecurse.i ], [ %4, %0 ]
  %accumulator.tr1.i = phi i32 [ %7, %tailrecurse.i ], [ 1, %0 ]
  %6 = add nsw i32 %X.tr2.i, -1
  %7 = mul nsw i32 %accumulator.tr1.i, %X.tr2.i
  %8 = icmp eq i32 %6, 0
  br i1 %8, label %factorial.exit, label %tailrecurse.i

factorial.exit:                                   ; preds = %tailrecurse.i, %0
  %accumulator.tr.lcssa.i = phi i32 [ 1, %0 ], [ %7, %tailrecurse.i ]
  %9 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32 %accumulator.tr.lcssa.i) nounwind
  ret i32 0
}

特に、%1(ie argv+1)と%2(ie )を確認する必要があります。*(argv+1)を呼び出すとlli factorial.bc 5文字列%2へのポインタが含まれます。 5

于 2012-10-07T20:38:38.020 に答える
0

そのため、メイン メソッドで引数を取る代わりに、「cin」ステートメントを使用してそれを行うことができました。C でコーディングし、LLVM Web サイトを使用してアセンブリを生成しました。

于 2012-10-07T22:13:44.073 に答える