我一直在努力解决这个问题。所以我使用的是内联汇编,我基本上试图将使用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”或用户输入的“猜测”进行比较。但无论输入什么,它总是说“低”。
答案 0 :(得分:0)
我承认我使用的程序集的味道略有不同,但是$ 20不使用寄存器20中的值,而不是字面值20?根据此程序集的工作方式,您应该将20作为立即值进行比较,或者将20加载到寄存器中并与该寄存器进行比较。
答案 1 :(得分:0)
在比较之前,您将gus
的地址而不是其值加载到EBX。
你更大的问题是你试图用内联装配做太多
你想在汇编中进行比较吗?很好,比较。但为什么要拨打printf
和scanf
以及其他所有内容?