【问题标题】:Taking a user input in LLVM assembly code在 LLVM 汇编代码中获取用户输入
【发布时间】:2012-10-07 18:37:28
【问题描述】:

关于在 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 的位置放置的任何数字。我目前正在从终端执行此操作,但我将制作一个 makefile 最终执行它。我如何让它从终端获取用户输入,我想我会在将它编译为字节码之后执行它类似于“lli factorial.bc 5”,它会给我5的阶乘。

感谢您的帮助!

【问题讨论】:

  • 转到llvm.org/demo。在 C 中键入您的代码。分析输出的 LLVM 程序集。
  • 是的,我一直在尝试。这很难解释,当我尝试实现它时,我得到了一大堆错误。我收到了很多关于 i8 和 i32 的错误。

标签: assembly input llvm bytecode


【解决方案1】:

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(即argv+1)和%2(即*(argv+1)):当您调用lli factorial.bc 5时,%2将包含指向字符串 5.

【讨论】:

  • 谢谢,这有帮助。虽然我能够以另一种方式做到这一点,但使用“cin”语句并以这种方式生成程序集。
【解决方案2】:

所以我能够使用“cin”语句而不是在 main 方法中接受参数。我用 C 对其进行编码并使用 LLVM 网站生成程序集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2012-01-05
    相关资源
    最近更新 更多