1
        .file   "calcnew.c"
        .text
.globl calcnew
        .type   calcnew, @function
calcnew:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %edx
        movl    12(%ebp), %ecx
        leal    0(,%ecx,8), %eax
        subl    %ecx, %eax
        leal    (%edx,%edx,2), %edx
        addl    %edx, %eax
        imull   $14, 16(%ebp), %edx
        addl    %edx, %eax
        popl    %ebp
        ret
        .size   calcnew, .-calcnew
        .ident  "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
        .section        .note.GNU-stack,"",@progbits

lealこのアセンブリ コードのand操作をすべて削除し、それらの機能をand操作imullのみに置き換えたいと考えています。これが私の試みです:sall addlsubl

    .file   "calcnew.c"
        .text
.globl calcnew
        .type   calcnew, @function
calcnew:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %edx
        movl    12(%ebp), %ecx
        sall    $3, %ecx
        movl    %ecx, %eax
        ;leal   0(,%ecx,8), %eax
        subl    %ecx, %eax
        movl    %edx, %ecx
        sall    $1, %edx
        addl    %ecx, %edx
        ;leal   (%edx,%edx,2), %edx
        addl    %edx, %eax
        movl    16(%ebp), %edx
        movl    %edx, %ecx
        sall    $4, %edx
        sall    $1, %ecx
        subl    %ecx, %edx
        ;imull  $14, 16(%ebp), %edx
        addl    %edx, %eax
        popl    %ebp
        ret
        .size   calcnew, .-calcnew
        .ident  "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
        .section        .note.GNU-stack,"",@progbits

新しいアセンブリ ファイルを使用して C コードをコンパイルしたときの出力は、元のアセンブリ ファイルを使用してコンパイルした場合と同じになるはずですが ( lealandmull操作を使用)、出力が間違っています。私は何を間違えましたか?

アセンブラ ファイルを呼び出す C コードは次のとおりです。

#include <stdio.h>

int calcnew(int x, int y, int z);

int main()
{
        int x = 2;
        int y = 6;
        int z = 11;
        int result;

        result = calcnew(x,y,z);

        printf("x=%d, y=%d, z=%d, result=%d\n",x,y,z,result);
}
4

1 に答える 1

0

あなたが交換します

    leal    0(,%ecx,8), %eax

    sall    $3, %ecx
    movl    %ecx, %eax

しかしecx、これは の値を壊してしまいます。その代わり:

    movl    %ecx, %eax
    sall    $3, %eax
于 2013-11-04T06:16:04.433 に答える