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

时间:2012-06-11 21:31:49

标签: 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”或用户输入的“猜测”进行比较。但无论输入什么,它总是说“低”。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

你更大的问题是你试图用内联装配做太多 你想在汇编中进行比较吗?很好,比较。但为什么要拨打printfscanf以及其他所有内容?