web-dev-qa-db-ja.com

アセンブリ「mov」命令

私はcプログラムをそれに相当するアセンブリと比較することによってアセンブリを学んでいます。

これがコードです。

.file   "ex3.c"
.section    .rodata
.LC0:
    .string "I am %d years old.\n"
.LC1:
    .string "I am %d inches tall.\n"
    .text
    .globl  main
    .type   main, @function
main:
    pushl   %ebp    //establish stack frame//
    movl    %esp, %ebp //move esp into ebp, all contents saved down stack//
    andl    $-16, %esp //16 from esp for local var space//
    subl    $32, %esp//stack frame reserving - 32 bytes//
    movl    $10, 24(%esp)
    movl    $72, 28(%esp)
    movl    24(%esp), %eax
    movl    %eax, 4(%esp)
    movl    $.LC0, (%esp)
    call    printf
    movl    28(%esp), %eax
    movl    %eax, 4(%esp)
    movl    $.LC1, (%esp)
    call    printf
    movl    $0, %eax
    leave
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
    .section    .note.GNU-stack,"",@progbits

この行の場合:

movl    $10, 24(%esp)

私が正しく理解していれば、10の値をespレジスタに移動すると言っています。しかし、24は何をしていますか?移動する値は「$」で示されているので、espに移動されるとは思いません(私は思います)

5
user2263800
movl $10,24(%esp)

つまり、リテラルの10進数の10進数(4バイト)を、(espレジスタと10進数の24)が指すアドレスで始まる4バイトのメモリ位置に移動します。基本的にはローカル変数です。 。

10
Dwayne Towell

言い換えれば、movl $10,24(%esp)

意味:_10_を*(esp + 24)にロードします

Cでは次のようになります。

*(unsigned long *)(myptr + 24) = 10;

ここで、myptrespレジスタの値で取得されます。

9