随笔分类 -  ARM

text .global_start 和_start
摘要:.text定义一个代码段,这是GCC必须的.global_start和_start代码开始地址定义个标记 阅读全文

posted @ 2016-09-19 14:17 屁屁侠 阅读(792) 评论(0) 推荐(0)

安装C/C++交叉编译环境
摘要:转:http://blog.csdn.net/nokiaguy/article/details/8509739X86架构的CPU采用的是复杂指令集(Complex Instruction Set Computer,CICS),而ARM架构的CPU使用的是精简指令集(Reduced Instruction Set Computer,RISC)。由于这两种架构的CPU使用了不同的指令集,因此在X86架构上开发可运行在ARM架构上的程序就必须要使用交叉编译器。 通常交叉编译器和相关工具包含的了很多可执行文件以及大量的共享库及头文件等资源。这些资源的集合称为交叉编译环境。 在Internet上可以找到 阅读全文

posted @ 2013-11-06 17:26 屁屁侠 阅读(4264) 评论(1) 推荐(0)

arm B和BL指令浅析
摘要:arm B和BL指令浅析B或BL指令引起处理器转移到“子程序名”处开始执行。两者的不同之处在于:(1)BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器)。 由于BL指令保存了下条指令的地址,因此使用指令“MOV PC ,LR”即可实现子程序的返回。(2)B指令则无法实现子程序的返回,只能实现单纯的跳转。用户在编程的时候,可根据具体应用选用合适的子程序调用语句。AREA Init,CODE,READONLY;该伪指令定义了一个代码段,段名为Init,属性只读ENTRY ;程序的入口点标识..bl delay ;调用延迟..mov pc,lr ;返回------- 阅读全文

posted @ 2013-10-17 10:34 屁屁侠 阅读(12770) 评论(0) 推荐(1)

运行地址和加载地址
摘要:http://blog.csdn.net/ce123_zhouwei/article/details/6990100运行地址和加载地址在连接目标代码时,会提到运行地址和加载地址。这两者有什么区别呢?加载时地址就是程序放置的地址,运行地址就是程序定位的绝对地址,也即在编译连接时定位的地址。如果程序是在flash里运行,则运行地址和加载地址是相同的。如果程序是在ram里运行,但程序是存储在flash里,则运行地址指向ram,而加载地址是指向flash。代码一般是烧写在NAND里面,比如S3C2440 如果开机从NAND启动 其开始的4K代码会被COPY到2440内部的4KRAM 用于对关键硬件的初 阅读全文

posted @ 2013-10-14 18:12 屁屁侠 阅读(4988) 评论(0) 推荐(1)

ARM获得PC指针为何PC=PC+8
摘要:http://blog.csdn.net/sddzycnqjn/article/details/7691534R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8; 阅读全文

posted @ 2013-10-14 17:37 屁屁侠 阅读(1022) 评论(0) 推荐(0)

arm程序的反汇编程序
摘要:这是汇编源文件:MCU:S3C2440(arm920T)代码实现点亮个led小灯.text.global _start_start: ldr r0,=0x56000010 @GPBCON mov r1,#0x00000400 @ str r1,[r0] @GPB5_out=01 ldr r0,=0x56000014 @GPBDAT mov r1,#0x0 str r1,[r0] @GPBDAT[5... 阅读全文

posted @ 2013-10-14 10:00 屁屁侠 阅读(797) 评论(0) 推荐(0)

为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
摘要:http://www.cnblogs.com/myblesh/archive/2012/04/07/2435737.html之前看了很多关于uboot的分析,其中就有说要为C语言的运行,准备好堆栈。 而自己在Uboot的start.S汇编代码中,关于系统初始化,也看到有堆栈指针初始化这个动作。但是,从来只是看到有人说系统初始化要初始化堆栈,即正确给堆栈指针sp赋值,但是却从来没有看到有人解释,为何要初始化堆栈。所以,接下来的内容,就是经过一定的探究,试图来解释一下,为何要初始化堆栈,即: 为何C语言的函数调用要用到堆栈,而汇编却不需要初始化堆栈。 要明白这个问题,首先要了解堆栈的作用。 关于堆 阅读全文

posted @ 2013-09-16 11:32 屁屁侠 阅读(3824) 评论(1) 推荐(0)

一条进程的栈区、堆区、数据区和代码区在内存中的映射
摘要:一条进程的栈区、堆区、数据区和代码区在内存中的映射 1>栈区:主要用来存放局部变量, 传递参数, 存放函数的返回地址。.esp 始终指向栈顶, 栈中的数据越多, esp的值越小。 2>堆区:用于存放动态分配的对象, 当你使用 malloc和new 等进行分配时,所得到的空间就在堆中。动态分配得到的内存区域附带有分配信息, 所以你 能够 free和delete它们。 3>数据区:全局,静态和常量是分配在数据区中的,数据区包括bss(未初始化数据区)和初始化数据区。注意: 1)堆向高内存地址生长; 2)栈向低内存地址生长; 3)堆和栈相向而生,堆和栈之间有个临界点,称为stkbr 阅读全文

posted @ 2013-09-13 17:00 屁屁侠 阅读(5083) 评论(0) 推荐(2)

加载时域和运行时域
摘要:我们经常用到“存储地址和连接地址不同”(术语上称为加载时域和运行时域)的情况:大多机器上电时是从地址0开始运行的,但是从地址0运行程序在性能方面总有很多限制,所以一般在开始的时候,使用与位置无关的指令将程序本身复制到它的连接地址处,然后使用向pc寄存器赋值的方法跳到连接地址开始的内存上去执行剩下的代码。http://zqwt.012.blog.163.com/blog/static/120446842010113002939616/ 阅读全文

posted @ 2013-09-13 15:20 屁屁侠 阅读(6510) 评论(0) 推荐(0)

bss段和.data的是是非非
摘要:一般情况下,一个程序本质上都是由 bss段、data段、text段三个组成的——本概念是当前的计算机程序设计中是很重要的一个基本概念。而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零(bss段属于静态内存分配,即程序一开始就将其清零了)。比如,在C语言程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始 阅读全文

posted @ 2013-09-13 15:08 屁屁侠 阅读(457) 评论(0) 推荐(0)

使用B或BL跳转时,下一条指令的地址的计算
摘要:1.text2.global _start3_start:4 b step15 step1:6 ldr pc, =step27 step2:8 b step2反汇编代码:0: eaffffff b 0x44: e59ff000 ldr pc, [pc, #0] ; 0xc8: eafffffe b 0x8c: 30000008 tsteq r0, #8 ; 0x8b跳转指令:它是个相对跳转指令,其机器码格式如下:[31:28]位是条件码;[27:24]位为"1010"(0xeaffffff为... 阅读全文

posted @ 2013-09-12 16:41 屁屁侠 阅读(2155) 评论(0) 推荐(0)

ARM GNU常用汇编语言介绍
摘要:ARM GNU常用汇编语言介绍ARM汇编语言源程序语句,一般由指令,伪操作,宏指令和伪指令组成.ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令。伪操作,是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序运行汇编程序时处理,而在计算机运行期间没有有机器执行.也就是说,这些伪操作只是汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之消失.宏指令,是一段独立的程序代码,可以插在程序中,它通过伪操作来定义。 1>宏在被使用之前必须提前定义好,宏之间可以互相调用,也可自己递归调用。 2>通过直接书写宏名来使用宏.并本具宏指令的格式输入 阅读全文

posted @ 2013-09-12 11:49 屁屁侠 阅读(2714) 评论(0) 推荐(0)

GNU风格 ARM汇编语法5
摘要:6、 GNU汇编程序中的常数 十进制数以非0数字开头,如:123和9876; 二进制数以0b开头,其中字母也可以为大写; 八进制数以0开始,如:0456,0123; 十六进制数以0x开头,如:0xabcd,0X123f; 字符串常量需要用引号括起来,中间也可以使用转义字符,如: “You are welcome!\n”; 当前地址以“.”表示,在GNU汇编程序中可以使用这个符号代表当前指令的地址; 表达式:在汇编程序中的表达式可以使用常数或者数值, “-”表示取负数, “~”表示取补,“”表示不相等, 其他的符号如:+、-、*、 /、%、... 阅读全文

posted @ 2013-09-11 18:12 屁屁侠 阅读(823) 评论(0) 推荐(0)

GNU风格 ARM汇编语法4
摘要:4、GNU汇编语言定义入口点 汇编程序的缺省入口是_start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点。 例:定义入口点 .section .data .section .bss .section .text .globl _start _start: 5、 GNU汇编程序中的宏定义 格式如下: .macro 宏名 参数名列表 @伪指令.macro定义一个宏 宏体 .endm @.endm表示宏结束 如果宏使用参数,那么在宏体中使用该参数时添加前缀“\”... 阅读全文

posted @ 2013-09-11 16:50 屁屁侠 阅读(346) 评论(0) 推荐(0)

GNU风格 ARM汇编语法3
摘要:3、 GNU汇编程序中的分段 .section伪操作 .section {,””} Starts a new code or data section. Sections in GNU are called .text, a code section, .data, an initialized data section, and .bss, an uninitialized data section. These sections have default flags, and the linker understands the default nam... 阅读全文

posted @ 2013-09-11 16:47 屁屁侠 阅读(392) 评论(0) 推荐(0)

GNU风格 ARM汇编语法2
摘要:2、GNU汇编程序中的标号symbol(或label) 标号只能由a~z,A~Z,0~9,".",_等(由点、字母、数字、下划线等组成,除局部标号外,不能以数字开头)字符组成。 Symbol的本质:代表它所在的地址,因此也可以当作变量或者函数来使用。 1>段内标号的地址值在汇编时确定; 2>段外标号的地址值在连接时确定。 Symbol的分类:3类(依据标号的生成方式)。 基于PC的标号。基于PC的标号是位于目标指令前的标号或者程序中数据定义伪操作前的标号。 这种标号在汇编时将被处理成PC值加上(或减去)一个数字常量,常用于表示跳转指... 阅读全文

posted @ 2013-09-11 16:31 屁屁侠 阅读(474) 评论(0) 推荐(0)

GNU风格 ARM汇编语法1
摘要:汇编源程序一般用于系统最基本的初始化:初始化堆栈指针、设置页表、操作 ARM的协处理器等。这些初始化工作完成后就可以跳转到C代码main函数中执行。1、GNU汇编语言语句格式 任何Linux汇编行都是如下结构: [:][} @comment instruction为指令 directive为伪操作 pseudo-instruction为伪指令 : 为标号, GNU汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。 comment为语句的注释 下面定义一个"add"的函数,最终返回两个参... 阅读全文

posted @ 2013-09-11 16:21 屁屁侠 阅读(847) 评论(0) 推荐(0)

反汇编
摘要:反汇编是把目标代码转为汇编代码的过程。 通常,编写程序是利用高级语言进行编程的,然后再经过编译程序生成可以被计算机系统直接执行的文件。反汇编即是指将这些二进制可执行文件反编译进而还原成汇编语言或其他高级语言。但通常反编译出来的程序与原程序会存在许多不同,虽然执行效果相同,但程序代码 会发生很大的变化,非编程高手很难读懂。 简单地讲,如果我们对反汇编出来的程序清单进行阅读,可了解软件的编程思路,可以破解部分资源,可以将软件汉化等,例如找到它是如何注册的,从而解出它的注册码。http://zqwt.012.blog.163.com/blog/static/12044684201011301... 阅读全文

posted @ 2013-09-10 09:22 屁屁侠 阅读(377) 评论(0) 推荐(0)

ARM工作模式
摘要:ARM工作模式1. 工作状态从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:1)第一种为ARM状态,此时处理器执行32的字对齐ARM指令,绝大部分工作在此状态;2)第二种为Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。ARM微处理器有32位的ARM指令集和16位的Thumb指令集,微处理器可以随时在两种工作状态之间切换,并且,处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。2. 存储器格式ARM体系结构将存储器看作从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字(32位)数据,从第四个字节到第七个字节放置第二个存 阅读全文

posted @ 2013-04-19 15:44 屁屁侠 阅读(489) 评论(0) 推荐(0)

ARM伪指令
摘要:伪指令在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。在ARM的汇编程序中,有如下几种伪指令:1)符号定义伪指令、2)数据定义伪指令、3)汇编控制伪指令、4)宏指令5)其他伪指令。一、符号定义伪指令符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪指令有如下几种:1)定义全局变量的GBLA、GBLL和GBLS2) 阅读全文

posted @ 2013-04-19 11:28 屁屁侠 阅读(1010) 评论(0) 推荐(0)

导航