gpt4 book ai didi

gcc - X86中mov和movl指令的区别?我在阅读汇编时遇到了一些麻烦

转载 作者:行者123 更新时间:2023-12-03 22:31:33 28 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Assembly do we need the endings? [duplicate]

(1 个回答)


5 个月前关闭。




最近,我读了一些关于计算机科学的书。我写了一些 C 代码,并使用 反汇编了它们。 gcc objdump .

以下C代码:

#include <stdio.h>
#include <stdbool.h>

int dojob()
{
static short num[ ][4] = { {2, 9, -1, 5}, {3, 8, 2, -6}};
static short *pn[ ] = {num[0], num[1]};
static short s[2] = {0, 0};
int i, j;

for (i=0; i<2; i++) {
for (j=0; j<4; j++){
s[i] += *pn[i]++;
}
printf ("sum of line %d: %d\n", i+1, s[i]);
}

return 0;
}

int main ( )
{
dojob();
}

得到以下汇编代码(AT&T 语法;仅汇编函数 dojob 和一些数据是列表):
00401350 <_dojob>:
401350: 55 push %ebp
401351: 89 e5 mov %esp,%ebp
401353: 83 ec 28 sub $0x28,%esp
401356: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
40135d: eb 75 jmp 4013d4 <_dojob+0x84>
40135f: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp)
401366: eb 3c jmp 4013a4 <_dojob+0x54>
401368: 8b 45 f4 mov -0xc(%ebp),%eax
40136b: 8b 04 85 00 20 40 00 mov 0x402000(,%eax,4),%eax
401372: 8d 48 02 lea 0x2(%eax),%ecx
401375: 8b 55 f4 mov -0xc(%ebp),%edx
401378: 89 0c 95 00 20 40 00 mov %ecx,0x402000(,%edx,4)
40137f: 0f b7 10 movzwl (%eax),%edx
401382: 8b 45 f4 mov -0xc(%ebp),%eax
401385: 0f b7 84 00 08 50 40 movzwl 0x405008(%eax,%eax,1),%eax
40138c: 00
40138d: 89 c1 mov %eax,%ecx
40138f: 89 d0 mov %edx,%eax
401391: 01 c8 add %ecx,%eax
401393: 89 c2 mov %eax,%edx
401395: 8b 45 f4 mov -0xc(%ebp),%eax
401398: 66 89 94 00 08 50 40 mov %dx,0x405008(%eax,%eax,1)
40139f: 00
4013a0: 83 45 f0 01 addl $0x1,-0x10(%ebp)
4013a4: 83 7d f0 03 cmpl $0x3,-0x10(%ebp)
4013a8: 7e be jle 401368 <_dojob+0x18>
4013aa: 8b 45 f4 mov -0xc(%ebp),%eax
4013ad: 0f b7 84 00 08 50 40 movzwl 0x405008(%eax,%eax,1),%eax
4013b4: 00
4013b5: 98 cwtl
4013b6: 8b 55 f4 mov -0xc(%ebp),%edx
4013b9: 83 c2 01 add $0x1,%edx
4013bc: 89 44 24 08 mov %eax,0x8(%esp)
4013c0: 89 54 24 04 mov %edx,0x4(%esp)
4013c4: c7 04 24 24 30 40 00 movl $0x403024,(%esp)
4013cb: e8 50 08 00 00 call 401c20 <_printf>
4013d0: 83 45 f4 01 addl $0x1,-0xc(%ebp)
4013d4: 83 7d f4 01 cmpl $0x1,-0xc(%ebp)
4013d8: 7e 85 jle 40135f <_dojob+0xf>
4013da: b8 00 00 00 00 mov $0x0,%eax
4013df: c9 leave
4013e0: c3 ret


Disassembly of section .data:

00402000 <__data_start__>:
402000: 08 20 or %ah,(%eax)
402002: 40 inc %eax
402003: 00 10 add %dl,(%eax)
402005: 20 40 00 and %al,0x0(%eax)


Disassembly of section .bss:

...

00405008 <_s.1927>:
405008: 00 00 add %al,(%eax)
...

我有两个问题:
  • 我不明白 之间的区别mov movl 操作说明?为什么编译器会生成 mov 对于一些代码,和 movl 为他人?
  • 我完全理解 C 代码的含义,但不理解编译器生成的程序集。谁能给点意见让我理解?我会非常感谢的。
  • 最佳答案

    MOVL生成指令是因为你放了两个 int (i 和 j 变量),MOVL 将执行 32 位的 MOV,整数大小为 32 位。

    存在所有 MOV* 的非详尽列表(如 MOVD 表示双字或 MOVQ 表示四字)以优化您的代码并使用更好的表达式来获得尽可能多的时间。

    PS:可能是-M intel objdump 的论点可以帮助你更好地理解反汇编,很多关于 Intel 语法的人可能很容易找到。

    关于gcc - X86中mov和movl指令的区别?我在阅读汇编时遇到了一些麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50694701/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com