最近在学习ARM的汇编,可是ARM不像x86,能够很便利的调试。不过还好有虚拟机,并且还有GDB这样全能的调试器。Google了好久,又结合自己的实践,总算成功的调试了ARM的汇编,在此向对ARM嵌入式感兴趣的同学共享一下。
首要阐明需求的东西
1. QEMU这个模仿器不只能够模仿x86,还能够模仿ARM和MIPS,可谓强壮
2. GDB(源代码)不必说了,全能调试器,可是需求从源代码编译
3. arm-linux穿插东西链我用的是自己开发板配套的3.4版别,不过去www.uclinux.org随意下载一个就能够(不过圆满uclinux被GFW了……)
先编译GDB,设置target为ARM渠道:
$ ./configure –target=arm-linux
$ make
$ make install
注:默许目录/usr/local/bin/
OK,开端写汇编程序,sample代码很简单,给3个寄存器赋值,之后死循环。留意必定要死循环,不然的话会遇到不合法指令或许不知道指令。
=======test.S========
.globl _start
_start:
mov r0, #0
mov r1, #1
mov r2, #2
loop:
b loop
=======EOF=========
编译:
$ arm-linx-as -o test.o test.S
链接:
$ arm-linux-ld -o test test.o
此刻能够用objdump检查test的内容:
$ arm-linux-objdump -d test
接下来便是调试了,用qemu发动gdb端口监听:
$ qemu-arm -g 11111 test
之后发动gdb,留意发动的时分要指明test,不能发动之后用file指定test(为什么不能不清楚,不过是实验成果):
$ arm-linux-gdb /PATH_TO_TEST 留意这儿的gdb不是体系的gdb,而是刚刚编译好的gdb
(gdb) target remote localhost:11111 设置方针为本机11111端口
(gdb) disassemble 反汇编
(gdb) display /10i $pc-16 这个指令是显现当时pc邻近的10条指令,替代调试x86程序的list指令
(gdb) si si,不是s,是单步碑文指令,假如是s的话就会碑文到下一个标号处。相似的还有ni
(gdb) info register 嗯,这个便是检查寄存器的值啦~
(gdb) x /16 0 这个是检查0x00000000开端的16个字(32 bits per word)的内存信息
差不多就知道这些了,有一个问题是不知道怎么设置指令的断点,今后再试吧……
假如直接运转程序,直接
qemu-arm test
现在能够边看书边着手实践了~QEMU还支撑Thumb指令集和Jazelle指令集,应该都能够这样调试的