我在uni学习ARM程序集,我编写了一个简单的程序来调试gdb
以获得乐趣。问题是当我设置一个断点时,它表示断点已经设定但实际上并没有停在它上面
ARM源代码在这里:http://pastebin.com/skwnniLy它应该对开始时移入r0 r1和r2的三个值进行排序,从较大的较低位置开始。
我用arm-none-eabi-as -gdwarf-2 -o sort.o sort.s
编译它,所以它确实有调试选项,obj转储显示这个:
(TL; DR:反汇编一切都很好)
qreon@Trillian:~$ arm-none-eabi-objdump -d sort.o
sort.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <init>:
0: e3a00491 mov r0, #-1862270976 ; 0x91000000
4: e3a0131a mov r1, #1744830464 ; 0x68000000
8: e3a0232a mov r2, #-1476395008 ; 0xa8000000
0000000c <compare>:
c: e1500001 cmp r0, r1
10: 51a04000 movpl r4, r0
14: 51a03001 movpl r3, r1
18: 41a04001 movmi r4, r1
1c: 41a03000 movmi r3, r0
20: e1520004 cmp r2, r4
24: 51a07002 movpl r7, r2
28: 51a06004 movpl r6, r4
2c: 51a05003 movpl r5, r3
30: 5a000007 bpl 54 <end>
34: 41530002 cmpmi r3, r2
38: 51a07004 movpl r7, r4
3c: 51a06003 movpl r6, r3
40: 51a05002 movpl r5, r2
44: 5a000002 bpl 54 <end>
48: 41a07004 movmi r7, r4
4c: 41a06002 movmi r6, r2
50: 41a05003 movmi r5, r3
00000054 <end>:
54: e1a00007 mov r0, r7
58: e1a01006 mov r1, r6
5c: e1a02005 mov r2, r5
60: e3a03000 mov r3, #0
64: e3a04000 mov r4, #0
68: e3a05000 mov r5, #0
6c: e3a06000 mov r6, #0
70: e3a07000 mov r7, #0
然后我启动gdb
:
qreon@Trillian:~$ arm-none-eabi-gdb sort.o
GNU gdb (7.8-0ubuntu1+6) 7.8 [...]
Reading symbols from sort.o...done.
(gdb) target sim
Connected to the simulator.
(gdb) load
Loading section .text, size 0x74 vma 0x0
Start address 0x0
Transfer rate: 928 bits in <1 sec.
(gdb) b init
Breakpoint 1 at 0x4: file sort.s, line 4.
(gdb) run
Starting program: /home/qreon/sort.o
[Inferior 1 (process 42000) exited normally]
我注意到我设置为标签init
的断点实际上设置为line 4
,这是源代码中init
标签下面的第二条指令。但即使它不在正确的位置,我也会在指令上设置断点,所以程序应该停止,而且它不会。我认为这可能是因为两个分支,但它们位于compare
标签的中间,而不是init
......
有什么想法吗? :(