0

私はこれを理解するのに多くの苦労をしてきました. したがって、私はインライン アセンブリを使用しており、基本的には、ユーザーが 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" と表示されます。

4

2 に答える 2

0

gus比較する前に、値ではなくのアドレスをEBXにロードします。

あなたのより大きな問題は、インラインアセンブリでやりすぎを試みることです。
アセンブリで比較したいですか?よく比較してください。しかし、なぜ電話printfして、scanfそして残りすべてを?

于 2012-06-12T14:06:35.903 に答える
0

私が使用したアセンブリのフレーバーがわずかに異なることは認めますが、$20 はリテラル値 20 ではなく、レジスタ 20 の値を使用しないのでしょうか? このアセンブリの動作に応じて、即値として 20 と比較するか、20 をレジスタにロードしてそのレジスタと比較する必要があります。

于 2012-06-11T21:38:02.177 に答える