IMX6ULL裸机-汇编_反汇编_机器码
程序处理的4个步骤
我们编写的C程序是不能直接在ARM等平台上运行的,必须经过一系列的程序处理才可以,我们的第一个LED程序涉及两个文件:start.S、main.c,它们的处理过程如下:
- 对于汇编程序,经过汇编之后,转换成目标文件(里面包含机器码)。
- 对于C程序,经过预处理之后,得到.i文件,在经过编译后得到汇编文件,汇编文件经过汇编后得到目标文件。
- 所有目标文件经过链接之后,生成elf文件(可执行文件),再经过反汇编,得到汇编文件。
我们想深入理解ARM架构,深入理解汇编与C,想深入理解栈的作用,想深入理解C语言的实质,就必须把最终的可执行程序,反汇编后,得到汇编代码。
汇编:将汇编文件(是汇编码)转换成目标文件(里面是机器码)。
反汇编:将可执行文件(目标文件,里面是机器码),转换成汇编文件。
反汇编文件详解
第一列是指令的地址,第二列是机器码,第三列是汇编指令
第一条指令,伪指令将这个数据加载到sp寄存器中,在反汇编文件中,使用到了pc,实际上,是keil在链接程序时,在pc+4这个位置保存了这个值,读到该指令时,会把这个数值加载到sp寄存器中,前面是对应这条指令的机器码 f8dfd004
下面这个指令是在A系列上的机器码,可以看到,相似的指令对应的机器码相差很多,这是因为不同系列平台上使用指令集对应的机器码不同,也就是不同架构使用的指令集的机器码可能会不同,同样,查看使用什么样的指令集就可以知道使用什么样的架构
下面是LDR指令对应的机器码
该机器码的二进制机器码 可以看到bit15-bit12对应的是寄存器,经查看对应的是R13,也就是SP寄存器,后面的就是12位立即数 通过机器码看就是4,至于PC,它内部已经设计好不用我们自己设定了
那么还有一个问题 可以看到,当前指令的地址是0X08000088,而PC+4对应是0x8000090
ARM的A系列 PC=当前地址+8
ARM的M系列 PC=当前地址+4
这里官方给出了解释
CORTEX M3/M4:使用Thumb2指令集,一条指令是16位或32位
CORTEX A7:默认使用ARM指令集,一条指令是32位的。
ARM指令采用流水线机制:当前执行地址A的指令,同时已经对下一条指令进行译码,同时已经在读取下下条指令:PC=A+4(Thumb/Thumb2),PC=A+8(ARM指令集)
图解|30张图,带你深入理解CPU流水线和分支预测的那些事儿 - 知乎
PC=当前地址+8,使用了ARM指令集,一条指令是32位,对应的是4,也就是在执行当前指令时,同时在对下一条指令进行译码,同时又在读取下下条的指令, 三级流水线