我正在尝试构建从 Scheme 语言到 X86_64bit 的编译器,同时使用 gdb 进行调试,以查看我的程序在哪里崩溃,这是发生了什么:(我显示了相关的寄存器,你可以看到 rax=1, r15= 1,使我的程序崩溃的命令是 div r15)
0x000000000040088f in L_add_fraction ()
1: $r11 = 1
2: $r12 = 3
3: $rax = 1
4: $r15 = 1
(gdb) disass
Dump of assembler code for function L_add_fraction:
0x000000000040087b <+45>: push %r11
0x000000000040087d <+47>: push %r12
0x000000000040087f <+49>: callq 0x400588 <gcd>
---Type <return> to continue, or q <return> to quit---
0x0000000000400884 <+54>: pop %r12
0x0000000000400886 <+56>: pop %r11
0x0000000000400888 <+58>: mov %rax,%r15
0x000000000040088b <+61>: mov %r11,%rax
0x000000000040088e <+64>: push %rdx
=> 0x000000000040088f <+65>: div %r15
0x0000000000400892 <+68>: pop %rdx
0x0000000000400893 <+69>: mov %rax,%r11
0x0000000000400896 <+72>: mov %r15,%rax
0x0000000000400899 <+75>: mov %r12,%rax
0x000000000040089c <+78>: push %rdx
0x000000000040089d <+79>: div %r15
0x00000000004008a0 <+82>: pop %rdx
0x00000000004008a1 <+83>: mov %rax,%r12
0x00000000004008a4 <+86>: cmp $0x1,%r11
0x00000000004008a8 <+90>: je 0x4008d0 <L_result_is_integer_plus>
0x00000000004008aa <+92>: push %r11
0x00000000004008ac <+94>: push %r12
0x00000000004008ae <+96>: mov $0x8,%edi
0x00000000004008b3 <+101>: callq 0x400570 <my_malloc>
0x00000000004008b8 <+106>: pop %r12
0x00000000004008ba <+108>: pop %r11
0x00000000004008bc <+110>: mov %r11,(%rax)
---Type <return> to continue, or q <return> to quit---
0x00000000004008bf <+113>: shlq $0x22,(%rax)
0x00000000004008c3 <+117>: shl $0x4,%r12
0x00000000004008c7 <+121>: or %r12,(%rax)
0x00000000004008ca <+124>: orq $0x4,(%rax)
0x00000000004008ce <+128>: jmp 0x4008e9 <L_plus_bin_end>
End of assembler dump.
(gdb) ni
Program received signal SIGFPE, Arithmetic exception.
0x000000000040088f in L_add_fraction ()
1: $r11 = 1
2: $r12 = 3
3: $rax = 1
4: $r15 = 1
我搜索了这个问题,但我只能看到除以零时给出 SIGFPE(显然不是这里的情况)