尝试从x86外部函数打印int值时出现分段错误

时间:2017-12-06 23:25:40

标签: c gcc assembly x86 gas

我正在尝试学习如何使用x86 DIV 指令。这是我的外部函数,位于.S文件中:

.intel_syntax noprefix
.text
.global divExtern

divExtern:
        mov edx, 0
        mov eax, [esp+4]
        mov ebx, [esp+8]
        div ebx
        ret

这是我的C代码:

#include <stdio.h>

int extern divExtern(int n, int m);

int main() {
        printf("%d", divExtern(10, 5));
        return 0;
}

正如您所看到的,我正在测试是否10/5 = 2.使用GDB我在执行 RET 之前确认2确实在 EAX 中。

0x565555eb <divExtern>          mov    $0x0,%edx                                                                   3
   30x565555f0 <divExtern+5>        mov    0x4(%esp),%eax                                                              3
   30x565555f4 <divExtern+9>        mov    0x8(%esp),%ebx                                                              3
   30x565555f8 <divExtern+13>       div    %ebx                                                                        3
  >30x565555fa <divExtern+15>       ret

(gdb) p $eax
$2 = 2

但是我仍然遇到了段错误。

GDB向我展示了 EAX 在执行函数和printf之间发生了变化。为什么会这样呢?我该怎么做才能防止这种情况发生?

0x565555af <main+15>    call   0x56555470 <__x86.get_pc_thunk.bx>                                                  3
   30x565555b4 <main+20>    add    $0x1a4c,%ebx                                                                        3
   30x565555ba <main+26>    sub    $0x8,%esp                                                                           3
   30x565555bd <main+29>    push   $0x5                                                                                3
   30x565555bf <main+31>    push   $0xa                                                                                3
   30x565555c1 <main+33>    call   0x565555eb <divExtern>                                                              3
   30x565555c6 <main+38>    add    $0x10,%esp                                                                          3
   30x565555c9 <main+41>    sub    $0x8,%esp                                                                           3
   30x565555cc <main+44>    push   %eax                                                                                3
   30x565555cd <main+45>    lea    -0x1980(%ebx),%eax                                                                  3
   30x565555d3 <main+51>    push   %eax                                                                                3
  >30x565555d4 <main+52>    call   0x56555400 <printf@plt>


(gdb) p $eax
$3 = -6523

如果你需要知道我是通过运行gcc test.c divExtern.S -m32 -o test

来编译的

0 个答案:

没有答案