12

こんにちは私はこのアセンブリコードで何が起こっているのかを理解するのに助けが必要です:

        .file   "mystery.c"

        .text

        .globl mystery

              .type mystery, @function

 mystery:
   pushq    %rbp
    movq    %rsp, %rbp

   movl %edi, -20(%rbp)
   movl $1, -16(%rbp)
   movl $0, -12(%rbp)
   movl $0, -8(%rbp)
   cmpl $2, -20(%rbp)
   jg   .L2
   movl $1, %eax
   jmp  .L3

  .L2:
movl    $2, -4(%rbp)
jmp .L4

  .L5:
movl    -12(%rbp), %eax
movl    -16(%rbp), %edx
leal    (%rdx,%rax), %eax
movl    %eax, -8(%rbp)
movl    -16(%rbp), %eax
movl    %eax, -12(%rbp)
movl    -8(%rbp), %eax
movl    %eax, -16(%rbp)
addl    $1, -4(%rbp)

.L4:
movl    -4(%rbp), %eax
cmpl    -20(%rbp), %eax
jle .L5
movl    -8(%rbp), %eax

.L3:
leave
ret

.L5に到達するまで、何が起こっているのかを正確に理解しています。ここでは、コマンドleal(%rdx, %rax)、eaxが私を混乱させています。これまで、iveは値をeaxとedxに移動し、現在はrdxとraxに値を追加しています。rdxとraxはどこから来ており、どのような値を保持していますか?それらはeaxとedxを書くための単なる別の方法ですか?助けてくれてありがとう。

4

3 に答える 3

20

この関連する回答を参照してください。さまざまなレジスタとその進化について説明します。この場合、%raxレジスタは64ビットレジスタです。%eaxは32ビット1であり、%ax16ビットになります。%ahレジスタの16ビットの上位8ビットを%al参照し、下限を参照します。

この小さな図は、同じ質問に対する別の回答から取られたものですが、それをよく示しています...

|63..32|31..16|15-8|7-0|
               |AH.|AL.|
               |AX.....|
       |EAX............|
|RAX...................|
于 2012-10-29T18:38:05.673 に答える
7

これらは、レジスターを説明するための「本当に」他の方法です。「プレフィックス」に応じて、64、32、16、または8ビットのいずれかになります。

  • rax-64ビット
  • eax-32ビット
  • ax-16ビット
  • ah-上位8ビットax
  • al-下位8ビットax
于 2012-10-29T18:36:50.897 に答える
3

64ビットモードでleaは、64ビットの「アドレス」と32ビットの宛先が最短のエンコーディングであるためです。

32ビットアドレスにしても結果には影響しませんが、1バイトかかります。

于 2012-10-29T18:37:05.940 に答える