【问题标题】:How To Compare Data With Inline Assembly?如何使用内联汇编比较数据?
【发布时间】:2012-06-11 21:31:48
【问题描述】:

我在弄清楚这一点时遇到了很多麻烦。所以我使用的是内联汇编,我基本上是在尝试将用户在使用 Scanf 时键入的数字与数字“$20”进行比较。

但我认为这是比较位置而不是实际值。

这是我所拥有的:

asm(
    "main:                                                                                              \n"
    "                                                                                              \n"
    "push $msg                                                                                             \n"
    "call _printf                                                                                              \n"
    "add $4, %esp                                                                                              \n"
    "                                                                                              \n"
    "push $gus                                                                                              \n"
    "push $fmt                                                                                              \n"
    "call _scanf                                                                                              \n"
    "add $8, %esp                                                                                              \n"
    "                                                                                              \n"
    "movl $20, %eax                                                                                         \n"
    "movl $gus, %ebx                                                                                          \n"
    "cmp %eax, %ebx                                                                                             \n"
    "jg lower                                                                                              \n"
    "jl higher                                                                                              \n"
    "                                                                                              \n"
    "lower:                                                                                              \n"
    "push $lss                                                                                              \n"
    "call _printf                                                                                              \n"
    "add $4, %esp                                                                                              \n"
    "jmp next                                                                                              \n"
    "                                                                                              \n"
    "higher:                                                                                              \n"
    "push $gtr                                                                                              \n"
    "call _printf                                                                                              \n"
    "add $4, %esp                                                                                              \n"
    "jmp next                                                                                              \n"
    "                                                                                              \n"
    "next:                                                                                              \n"
    "jmp main                                                                                              \n"
    "ret                                                                                              \n"
    "                                                                                              \n"
    ".section .data                                                                                              \n"
    "msg: .asciz \"Please enter your guess: \"                                                                                              \n"
    "gtr: .asciz \"Higher! \"                                                                                     \n"
    "lss: .asciz \"Lower! \"                                                                               \n"
 //   "crr: .asciz \"Please enter your guess: \"                                                                                              \n"
    "fmt: .asciz \"%d\"                                                                                              \n"
    ".double 100                                                                                             \n"
    ".byte 0                                                                                             \n"
    "gus: .double 100                                                                                             \n"
    ".byte 0                                                                                         \n"
    );

是的,我知道这段代码确实没有实际使用的意义。我写这篇文章的目的实际上只是为了弄清楚如何比较。

但我的问题是:

 "movl $20, %eax                                                                                         \n"
"movl $gus, %ebx                                                                                          \n"
"cmp %eax, %ebx  

它应该将 20 与用户输入的“gus”或“guess”进行比较。但无论他们输入什么,它总是显示“Lower”。

【问题讨论】:

  • 如果push $gus将保存用户输入的变量的地址推入,movl $gus, %ebx不会将gus的地址而不是gus的值放入ebx吗?我不熟悉 AT&T 语法。

标签: c assembly x86 inline-assembly


【解决方案1】:

在比较之前,您将gus 的地址而不是其值加载到EBX。

您更大的问题是您尝试使用内联汇编做太多事情。
你想在汇编中进行比较?很好,对比一下。但是为什么要打电话给printfscanf 以及其他所有的电话呢?

【讨论】:

    【解决方案2】:

    我承认我使用的汇编风格略有不同,但是 $20 不使用寄存器 20 中的值,而不是字面值 20?根据此程序集的工作方式,您应该将 20 作为立即数进行比较,或者将 20 加载到寄存器中并与该寄存器进行比较。

    【讨论】:

    • 不,没有寄存器20,$表示立即数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多