
arm汇编
jklinux
一个linux下的渣渣老码农
展开
-
01 arm汇编前的基础
ARM公司只负责设计芯片不生产具体的硬件arm指令集版本, V4(包括arm9以下), V6(arm11), V7(a8, a9, a7, a15, a53)流水线: arm9 5级, arm11 8级, a9 x级一个程序(由多条指令组成)-->程序要执行前先放入内存, 一条条指令执行指令执行过程: 取指(从内存里把指令加载到cpu的缓存中) -->> 译码(把指令转换成硬件的功能信息)原创 2017-05-25 13:21:33 · 959 阅读 · 0 评论 -
02 内嵌汇编的语法及最最常用的arm汇编指令
// arm架构手册 cpu的工作模式 p41 cpu的寄存器 p43, 没有小黑三角的寄存器表示多个工作模式下共用的,带有小黑三角的表示此模式下独有 arm cpu的寄存器r0-r12通用寄存器, 随便使用 PC寄存器装着要取指的下条指令的内存地址(取指-> 译码-> 执行) cpsr: 当前程序状态寄存器, 记录当前工作模式,条件位状态等原创 2017-05-25 13:23:16 · 2631 阅读 · 0 评论 -
03 arm程序调用标准(APCS)
APCS(arm procedure call standard) arm程序(不管什么语言)的调用标准。 也就是返回值,参数怎么传递。怎样返回调用函数的位置等的一套标准做法. 1). PC寄存器是存放从哪个内存地址上取指令. 程序执行其实一条条的指令进行取指,译码,执行. 程序里调用一个函数,需要等这个被调用的函数主动返回才可以接着执行,而且被调用的函数的返回地址得刚好为调用原创 2017-05-27 11:51:49 · 945 阅读 · 0 评论 -
04 局部变量的空间分配及栈回收重用之汇编分析
估计每个人在学C语言时被告之:当函数里的代码执行时,函数体内的局部变量会在栈里分配空间,函数执行结束时回收所分配的空间。 但具体是怎样分配,怎样的回收,这些问题就只能发挥想象力了,学会汇编后,其实我们就可以更加的直观地去了解。对栈不熟悉的话,可以参考程序的段,堆与栈1). 局部变量的分配空间 test.c 1 2 int main(void) 3 {原创 2017-05-29 15:10:32 · 1217 阅读 · 0 评论 -
05 printf函数可变参数的实现原理之汇编分析
如实现一个像printf函数格式的函数:test.c void myprintf(char *line, ...) // line指针变量是局部变量,在栈里分配空间 { printf(line); //调用printf时,r0存放字符串地址 } int main(void) { myprintf("hello test %d, %d, %s, %d,原创 2017-05-29 23:49:40 · 1948 阅读 · 0 评论 -
06 溢出攻击原理之汇编分析
如c程序的代码:test.c: 1 2 #include <stdio.h> 3 4 int main(void) 5 { 6 int buf[10]; 7 8 printf("end\n"); //用于让编译器对lr寄存器压栈 9 return 0; 10 }反汇编后得到的代码:000083cc <main>: 83cc:原创 2017-05-31 11:07:57 · 810 阅读 · 0 评论 -
07 lds文件与自定义段
lds文件用于指定程序链接时的不同段内容的位置安排。linux内核镜像里就是利用lds文件,把不同的内容划分成很多不同的段. uboot里的命令也就是利用此功能,把所有的命令统一到一个段里.arm-linux-gnueabihf-ld –verbose > test.lds //把编译器默认的链接脚本输出到test.lds里修改test.lds, 把最前的6行删除掉, 也要删除最后一行. 在原创 2017-05-31 15:58:01 · 4314 阅读 · 1 评论