c - 如何将数据与内联汇编进行比较?

标签 c assembly x86 inline-assembly

我在解决这个问题时遇到了很多麻烦。因此,我使用内联汇编,并且基本上尝试将用户在使用 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”或用户输入的“猜测”进行比较。但无论他们输入什么,它总是显示“较低”。

最佳答案

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

你更大的问题是你试图用内联汇编做太多事情。
你想在 assembly 中进行比较吗?很好,比较一下。但为什么要调用 printfscanf 以及其他所有函数呢?

关于c - 如何将数据与内联汇编进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987819/

相关文章:

security - 什么是 retpoline,它是如何工作的?

assembly - 未知使用没有大小后缀的指令助记符 (x86_64)

x86 - 仅使用 SSE3 替换 _mm_cvtepi16_epi32

c - 是否有必要关心未从 dll 导出的函数的调用约定

c - 在链接列表中使用 "void *"时出现问题

C省略双空格和标点符号中的单词计数程序

algorithm - 如何将此排序算法转换为 mips 程序集

c - 二叉搜索树插入导致内存泄漏

assembly - 当我尝试 DIV 时,我得到 "Divide by zero"但它不为零

algorithm - 在 Assembler 上以 10 为基数添加两个数字