我正在尝试学习如何使用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