44B0X引导程序中伪指令详解 (转载)

ARM汇编程序设计学习笔记(二) 汇编语言程序设计笔记 (二) 为了学习android系统而努力。 这个笔记,记录arm汇编语言的伪指令伪指令的作用仅在完成汇编过程,一旦汇编结束,伪指令的使命就完成了。 有如下几种伪指令: 符号定义伪指令 数据定义伪指令 汇编控制伪指令 信息报告伪指令 宏控制以及其他伪指令 2.1 符号定义伪指令 指示符 功能 GBLA 声明和初始化一个全局算术变量,初始值为0 GBLL 声明和初始化一个全局的逻辑变量,初始值为{FALSE} GBLS 声明和初始化一个全局的字符串变量,初始 阅读详情

从以下地址转载,向原文作者致谢:      http://blog.chinaunix.net/u/28484/showart_248573.html

    

        ARM汇编程序分析过程中,比较难理解的是他的伪操作、宏指令和伪指令。本文是结合44B0X引导程序中出现伪操作、宏指令和伪指令进行总结,便于进一步分析44B0X的引导。

*****************************************************
    一、GET option.s // GET和INCLUDE功能相同
功能:引进一个被编译过的文件。
格式:GET    filename
其中:fiename    汇编时引入的文件名,可以有路径名。
    GET符号在汇编时对宏定义,EQU符号以及存储映射时是很有用的,在引入文件汇编完以后,汇编将从GET符号后开始。在被引入的文件中可能有GET符号再引入其他的文件。GET符号不能用来引入目标文件。 *****************************************************
    二、INTPND EQU 0x01e00004 // EQU可以用“*”代替,在阅读源程序时注意。
功能:对一个数字常量赋予一个符号名。
格式:name    EQU   expression
其中:name   符号名。Expression    寄存器相关或者程序相关的固定值。
    使用EQU定义常量,与C语言中用#define定义一个常量相同。
例:num   EQU   2    ;   数字2赋予符号num *****************************************************
    三、GBLL    THUMBCODE
        [ {CONFIG} = 16
            THUMBCODE SETL {TRUE}
            CODE32
        |  
            THUMBCODE SETL {FALSE}
        ]        [ THUMBCODE
            CODE32   ;for start-up code for Thumb mode
        ] //其中[=IF ,|=ELSE ,]= ENDIF, CODE32 表明一下操作都在ARM状态。这些都是伪操作这段理解为设定THUMCODE的值,然后确定,用户的程序是在ARM状态还是THUM状态。*****************************************************
    四、MACRO
        $HandlerLabel HANDLER $HandleLabel
        $HandlerLabel
        sub sp,sp,#4 ;decrement sp(to store jump address)
        stmfd sp!,{r0} ;PUSH the work register to stack
        ldr r0,=$HandleLabel;load the address of HandleXXX to r0
        ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
        str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
        ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
        MEND //MACRO……MEND
功能:标志一下宏的定义。
格式:MACRO
      Macro_prototype
      MEND
宏表达式的格式如下:
{$label}   macroname    {$ parameter{,parameter2}…}
其中:
$ label   参数,在宏使用时,被给定的符号替代。
Macroname   宏的名称,并不一定以一条指令或者符号名开始。
$parameter    在宏使用时,被替代的参数,格式为:$parameter=“default value”
    在宏体中,参数如:$parameter和变量一样使用,在被宏引用时,被赋于新值,参数必须用“$”符号加于区别。$label在宏定义内部符号时很有用,可以看作宏的参数。使用“|”符号作为使用一个参数缺省值的变量,如果使用的是一个空格符串,将省去该变量。在使用内部标志的宏定义中,将内部标志定义为带后缀的标志,将会很有用。如果在扩展中空间不够,可以作为参数和后继文字之间或者参数之间使用圆点隔开,但在文本和后继参数之间不能使用圆点。宏可以定义局部变量的范围。宏还可以嵌套使用。
例:
MACRO
$label    xmac    $p1,$p2
          LCLS   err
$labell,loopl
          BGE    $pl
$labell,loop2
          BL     $p1
          BEG      $p1
          BEG      $labell,loop2
MEND *****************************************************
    五、$和$$ //$临时变量替换,若程序中需要用字符$则用$$来表示,通常情况下,包含在两个||之间的$并不表示进行变量替换,但是如果|线是在双引号内,则将进行变量替换。用“.”来分割出变量名的用法,
GBLS STR1
GBLS STR2
STR1 SETS "AAA"
STR2 SETS "BBB$$STR1.CCC" //汇编后STR2的值为bbAAACCC *****************************************************
    六、 IMPORT Main    ; The main entry of mon program //该伪操作告诉编译器当前的符号不是在本文件中定义的,在本源文件中可能引用该符号,而不论该源文件是否使用该符号,该符号都将被加入到本源文件中。
格式:
IMPORT symbol {[WEAK]}
    symbol 引用的符号的名称,他是区分大小写的,[WEAK]指定这个选项后,如果symbol所在的源文件中没有被定义,编译器也不会报错。他和EXTERN作用相同,不同之处在于,如果本源文件没有实际引用该符号,该符号将不会被加入到本源文件的符号表中。
*****************************************************
    七、AREA    Init,CODE,READONLY
        ENTRY //功能:指示汇编器汇编一段新的代码或新的数据区。
格式:name 给出的特定段名。以数字开头,必须加竖线,否则,将报错,例如:|1_Data-Area|。某些名字已保留,如:|C$$code|已经被C编译器用作代码,或者用作与C库相连的代码段。
Attr    段名属性,下列属性是有效的:
ALIGN=expression
缺省状态下,AOF段将按4个字节对准,expression可以是2~31之间的整数,该段将按2(上标为expression)字节对准。例如,espression等于10,该段将按1KB对准。 CODE        特定机器指令,缺省为READONLY。
COMDEF      通用段定义。该AOF段可能包括代码和数据,但必须与其他段名相区别。
COMMON      通用数据段,无须再注释定义任何代码和数据,通常由链接器初始化为零。
DATA        包含数据,但是不包含指令,缺省为READWRITE
INTERWORK   表明代码段可以适用ARM/Thumb interworking功能。
NOINIT      表明数据段可以初始化为零,只包含指示符。
PIC         表明定位独立段,可以不修改情况下,在任意地址执行。
READONLY    表明该段可读可写。     汇编时,必须至少有一个AREA指示符。使用AREA符号可以将源程序区分,但是必须不重名。通常需要独立的AOF段做为代码或者数据段,较大程序可以分为多个代码段。AOF段可以定义局部标签的范围,可以使用ROUT符号。如果没有任何的AREA指示符定义,汇编器将会产生名为|$$$$$$$|的AOF段和一条诊断信息,将限制由于缺少指示符而产生的错误信息,但是并不一定会成功汇编。 *****************************************************
    八、LTORG //LTORG是在此指令出现的地方放一个文本池(literal pool). 在ARM汇编中常用到
    ldr   r0, =instruction     将地址instruction载入r0
    此时编译器将ldr尽可能的转变成mov或mvn指令。 如果转变不成, 将产生一个ldr指令,通过pc相对地址从一块保存常数的内存区读出instruction的值。此内存区既是文本池。一般的, 文本池放在END指令之后的地方。但是, 如果偏移地址大于4k空间, ldr指令会出错(因为ldr的相对偏移地址为12-bit的值). 此时使用LTORG放到会出错的ldr指令附近,以解决此问题。 编译器会收集没有分配的ldr的值放到此文本池中。所以必须在LDR指令前后4KB的范围内用LTORG显式地在代码段中添加一个文字池。 *****************************************************
    九、LDR r0,=WTCON ;watch dog disable
       LDR r1,=0x0
功能:将一个32位常量或地址读取至寄存器。
格式:
LDR{condition} register,=[expression|Label-expression]
其中:
condition             可选的条件代码。
register              读取的寄存器。
expression            数字常量:
    如果该数字常量在MOV或MVN指令的范围中,汇编器会产生合适的指令;
    如果该数字量不在MOV或MVN指令的范围中,汇编器把该常量于程序后,用程序相关的LDR伪指令读取,PC与该常量的偏移量不得超过4KB。
Label-expression      程序相关的或外部的表达式。汇编器将其存放在程序后的常量库(称为文字池(literal pool))中,用程序相关的LDR伪指令读取,PC与与该常量的偏移量不得超过4KB。LDR伪指令的使用有两个目的:
     对于不能被MOV和MVN指令所读取的立即数,将其变成常量,进行读取。
     将一个程序相关的或外部的表达式读取进寄存器中。
例:
LDR R1, =0xfff
LDR R2, =place *****************************************************
    十、DCD 0x11110090       ;Bank0=OM[1:0], Bank1~Bank7=16bit, bank2=8bit; //DCD或“&”
功能: 分配一个或多个字,从4个字节边界开始。
格式:
{label}DCD expression{,expression}…
其中:
expression    可以是:
一个数学表达式;
一个程序相关的表达式。    如果在Thumb代码中,使用DCD符号定义带标志的数据时则必须使用DATA符号。
    按4个字节对准时,DCD符号会在第一个字节之前插入3个字节的空字符,如果无须对准的话,可以使用DCDU符号。
例:
datal   DCD    1,5,20
data2   DCD    mem06
data3    DCD glb+4 *****************************************************
    十一、ALIGN //功能:从1个字边界开始。
格式:
ALIGN {expression {,offset-expression} }
其中:
    expression    2(上标为0)到2(上标为31)之间的任意数幂,当前按2(上标为n)字节对准,如果该参数没有指定,ALIGN将按字对准。
    Offset-expression 定义expression指定的对准方式的字节偏移量。    使用ALIGN符号,保证程序正确对准。对于Thumb地址,使用ALIGN符号保证其按字对准,例如:ADR Thuub伪指令只能读取字对准的地址。
    在代码段出现数据定义符时,使用ALIGE符号。当在代码段使用数据定义符(DCB,DCW,DCWU,DCDU和%),程序计数器PC并不一定按字对准。    汇编器会在下一条指令时插入3个字节,保证:
    ARM状态下按字对准;
    Thumb状态下按半字对准。
    在Thumb状态下,可以使用ALIGN2对Thumb代码按半字对准。
    使用ALIGN状态下,还可以充分利用一些ARM处理器的Cache,例如,ARM940T有一个每行4字的Cache,使用ALIGN16按16字节对准,从而最大限度使用Cache。 *****************************************************
    十二、^ _ISR_STARTADDRESS //MAP与"^"
    MAP用于定义一个结构化的内存表(StorageMAP)的首地址。此时,内存表的位置计数器{VAR}(汇编器的内置变量)设置成该地址值。MAP可以用”^”代替。
语法:MAP expr {,base-register}
    其中,expr为数字表达式或者是程序中已经定义过的标号。Base-register为一个寄存器。当指令中没有Base-register时,expr为结构化内存表的首地址。此时,内存表的位置计数器{VAR}设置成该地址值。当指令中包含这一项时,结构化内存表的首地址为expr和Base-register寄存器内容的和。
使用说明:MAP伪操作和FIELD伪操作配合使用来定义结构化的内存表结构。举例:MAP伪操作
MAP fun ;fun就是内存表的首地址
MAP   0x100,R9 ;内存表的首地址为 R9+0x100 *****************************************************
     十三、HandleReset # 4
         HandleUndef # 4
         HandleSWI # 4
//FIELD和"#"
FIELD 用于定义一个结构化的内存表中的数据域。FIELD 可用“#”代替。
语法:{label} FIELD expr
其中:{label}为可选的。当指令中包含这一项时,label的值为当前内存表的位置计数器{VAR}的值。汇编编译器处理了这条FIELD伪操作后。内存表计数器的值将加上expr.expr表示本数据域在内存中所占的字节数。使用说明:MAP伪操作和FIELD伪操作配合使用来定义结构化的内存表结构。MAP伪操作定义内存表的首地址。FIELD伪操作定义内存表的数据域的字节长度,并可以为每一格数据域指定一个标号,其他指令可以引用该标号。MAP伪操作中的Base-registe寄存器值队以其后所有FIELD伪操作定义的数据域是默认使用的,直到遇到新的包含Base-registe项的MAP伪操作需要特别注意的是,MAP伪操作和FIELD伪操作仅仅是定义数据结构,他们并不实际分配内存单元。由MAP伪操作和FIELD伪操作配合定义的内存表有3种:基于绝对地址的内存表,基于相对地址的内存表和基于PC的内存表。举例:基于绝对地址的内存表    用伪操作序列定义一个内存表,其首地址为固定的地址8192(0X2000),该内存表中包括5个数据域。       Consta长度为4个字节;constb长为4个字节,x长为8字节;y长为8字节;string长为16字节。这种内存表成为基于绝对地址的内存表。MAP 8192 ; //内存表的首地址8192(0x2000)
Consta FIELD 4 ; //consta 长为4字节,相对位置为0
Constb FIELD 4; //constb长为4字节,相对位置为4
X   FIELD 8; // X长为8字节,相对位置为8
Y    FIELD 8; // y长为8字节,相对位置为16
String FIELD 16 ;// String为16字节,相对位置为24在指令中,可以这样引用内存表中的数据域;LDR R0,consta; //将consta地址处对应内存加载到R0上面的指令仅仅可以访问LDR指令前后4KB地址范围的数据域。举例:相对绝对地址的内存表    下面的伪操作序列定义一个内存表,其首地址为0与R9寄存器值得和,该内存表中包含5个数据域。这种表称为相对地址的内存表。MAP 0,R9;//内存表的首地址寄存器R9的值
Consta FIELD 4 ; //consta 长为4字节,相对位置为0
Constb FIELD 4; //constb长为4字节,相对位置为4
X   FIELD 8; // X长为8字节,相对位置为8
Y    FIELD 8; // y长为8字节,相对位置为16
String FIELD 16;// String为16字节,相对位置为24可以通过下面的指令访问地址范围超过4KB的数据;ADR R9, Field ; //伪指令
LDR R5,Constb;//相当于LDR R5,[R9,#4]    在这里,内存表中的数据都是相对于R9寄存器的内容,而不是相对于一个固定的地址。通过在LDR中指定不同的基址寄存器的值,定义的内存表结构可以在程序中有多个实例。可多次使用LDR指令,用以实现不同的程序实例。举例:基于PC的内存表Data   SPACE 100 ; //分配100字节的内存单元,并初始化为0
MAP Data;//内存表的首地址为Datastruc内存单元
Consta FIELD 4 ; //consta 长为4字节,相对位置为0
Constb FIELD 4; //constb长为4字节,相对位置为4
X   FIELD 8; // X长为8字节,相对位置为8
Y    FIELD 8; // y长为8字节,相对位置为16
String FIELD 16;// String为16字节,相对位置为24可以通过下面的指令访问范围不超过4kb的数据;LDR R5,constb ;相当于 LDR R5,[PC,offset] *****************************************************
    十四、RN
在局部标号中:
%表示引用操作
F指示编译器只向前搜索。
B指示编译器只向后搜索。
A指示编译器搜索宏的所有嵌套层。
T指示编译器搜索宏的当前层次。
若F、B没有指定则先向前搜索,再向后搜索。
若A、T都没有指定则先从当前层到最高层,比当前层低的不再搜索。
ARM中的---汇编指令 一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text"、".data"、".bss" 依次表示的是“以下是代码段”, “以下是初始化数据段”, “以下是未初始化数据段”。 2.".global" 定义一个全局符号,通常是为ld使用。比如经常看到的 .global _start 3.".ascii"、".byte"、".shor... 阅读详情

相关推荐

【ARM64 常见汇编指令学习 20.1 -- ARM 伪指令 .include】

在UEFI(统一可扩展固件接口)开发中,通常会用到汇编语言文件(.s或.S文件)。如果你想在一个汇编语言文件中包含(或者说“include”)另一个汇编语言文件,你可以使用.include指令。这种方法允许你在一个主汇编文件中引用其他汇编文件中的代码或者数据定义,方便代码的复用和模块化管理。假设你有两个汇编文件a.s和b.s,并且你想在a.s中包含b.s,你可以在a.s中添加指令。

CodingCos的博客 750

iar &stm32调试过程中遇到的问题记录

3、adc不能模拟采集,可能由于基准电压引脚没有焊接 2、相同的程序,在两块同系列的板子上定时时间和延时不一样,一块板子上是正常的,另一块上定时一秒可是实际有好几秒 自己在别的板子上可以正常进行,在问题板延时1s,实际大概延时4~5s。还有就是定时器也是这样,怀疑晶振有问题,但是双层板,想着不会所有的都有问题板。实际是要所有的板子换晶振。 因为以前没遇到这种情况,还有就是...

c1063891514的博客 3835

汇编语言笔记-特殊符号

目录寻址方式寄存器寻址寄存器寻址寄存器偏移寻址 寻址方式        寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址的方式,是确定本条指令的数据地址以及下一条要执行的指令地址的方法。(简单来说,就是获取对应操作数的地址,进而获取操作数) 寄存器寻址        寄存器寻址:操作数为寄存器名,指令执行时取出寄存器中的值: MOV R1, R2 ;R

weixin_47447179的博客 2981

s3c44b0x芯片资料

转载于:https://blog.51cto.com/363628/86114

weixin_34013044的博客 243

【转】s3c44b0x开发板之SDRAM配置

最近几个月忙着达芬奇的项目,一个人边学边做赶进度,从底层驱动,再到上层应用,再到DSP优化,天昏地暗,好在自己对这些东西很感兴趣,并不觉得苦。直到项目快要完结,觉得必须得回过头去再把以前的东西系统地看一下了。于是乎就把4年前的ARM7板子翻出来了,抛开操作系统,好好研究一下底层的东西,让自己心里也踏实一些。下面这篇日志的内容刚好和我的开发板的一模一样,索性留下来,作为参考。         上一

liuqiqi677的专栏 2203

44b0中断

前段时间,刚用LPC2214做了一款测试仪器,最近又由于项目需求,开始转手用44B0进行开发,发现两款同属arm7的片子还是有很大区别的。因为我以前就是搞单片机的,所以入手lpc系列时感觉很上手,没遇到什么难度,再加上ZLG的服务态度也不错,所以很快就把产品搞出来了。可是当接触到44B0的时候,感觉就不一样了,单从启动这一块好像就要比lpc的复杂多了,要相系统运行稳定必须得分散加载程序,先

嵌入式相关 1607

简单的S3C44B0X Bootloader

简单的S3C44B0X Bootloader 转载于:https://www.cnblogs.com/arci/archive/2011/04/15/2017575.html

weixin_30432179的博客 102

44b0软实现中断嵌套(转载

写在前面作者一直支持GPL的精神。允许任何人自由使用、转载、复制和再分发,但必须保留作者署名,必须保证全文完整转载,包括完整的版权声明。由于作者水平有限,因此不能保证文章内容准确无误,请批判阅读。如果你发现任何错误或对文章内容有任何建议,欢迎你与我联系:Email: caiallen@tom.com  QQ群: 14765968  最近因为公司项目忙,好久没更新这里了。也因

咕唧咕唧shubo.lk的专栏 1579

ARM S3C44B0X 之 看门狗定时器

ARM S3C44B0X 之 看门狗定时器 来源:[url]http://www.diybl.com/course/6_system/linux/Linuxjs/20090305/158292.html[/url] 当受到故障,如噪声或系统错误的干扰时,s3c44b0x看门狗定时器能够产生复位信号,使CPU复位,它也可以用作一个普通的16位定时器使用,计算完产...

weixin_33810302的博客 290

44B0X串口扩展

现在常用的扩展多串口的方式有几种:1.采用16C55X来扩展,成本高,控制复杂。2.多串口的单片机,比如77E58,PIC的18S,AT90S8515等系列,价格高,60~70多不等。要想用三串口的单片机更贵。3.用软件模拟,软件模拟的采样率也就1两次/BIT,可靠性和波特率都不够。4.用CPLD进行扩展,可以根据需要扩展串口,有点在于配置灵活,缺点在于相对开发难度和成本都比较高,而且CPLD工作...

weixin_34331102的博客 360

s3c44b0x开发板之时钟配置

s3c44b0x的时钟发生器可以为CPU以及外围设备产生所需的时钟信号. 时钟发生器可通过软件(s3c44b0x用户指南中简写为S/W)控制(CLKCON寄存器)为每个外设提供或断开时钟来降低功耗. s3c44b0x电源管理由五种模式组成: 正常模式(Normal mode), 低速模式(Slow mode), 空闲模式(Idle mode), 停止模式(Stop mode), SL空闲模式(...

weixin_30588907的博客 213

44b0软实现中断嵌套

写在前面(太感谢原作者了....本人转于:http://blog.csdn.net/liukun321) 作者一直支持GPL的精神。允许任何人自由使用、转载、复制和再分发,但必须保留作者署名,必须保证全文完整转载,包括完整的版权声明。 由于作者水平有限,因此不能保证文章内容准确无误,请批判阅读。如果你发现任何错误或对文章内容有任何建议,欢迎你与我联系: Email: caiall

ranjuanlian的专栏 485

[转载][ARM] ARM无痛苦起步(S3C44B0X)

转自21IC,上面的好文还真多,版权当然归原作者所有,不过我不知道是谁写的抱歉 arm(44b0x)无痛苦起步  这两个星期在看arm的资料,在朋友的帮助下弄明白了是怎么回事后,我觉得我原来看的入门资料总有些说的不详细的地方。所以决定写一个文档,总结开始arm开发的入门知识,给后来的朋友参考,也希望得到高手指正我认识上的错误。      我的开发板是s3c44b0x的,2m NOR

wenzhengko的专栏 432

U-Boot 1.1.6 基于S3C44B0的移植

U-Boot 1.1.6 基于S3C44B0的移植<br /><br /><br />说明1:本文档基于hfrk 的ARM7 S3C44B0 开发板配置平台。<br />说明2:U-Boot 1.1.6 的移植,基于ARM7 S3C44B0的hfrk U-Boot 1.1.1能够正常工作的包裹提取适当文件合并至U-Boot 1.1.6中,并适当修改Makefile实现。<br /><br />提供U-Boot 1.1.6 -MQ问题的解决方案。<br />提供U-Boot 1.1.6 的测试与修改方案。<b

咕唧咕唧shubo.lk的专栏 1917

ARM7(sc44b0)外部中断笔记---转载

ARM7(sc44b0)外部中断笔记[ 2009-10-14 3:00:00 | By: Eddy ] 我的人生,何去何从                 ARM7(sc44b0)外部中断笔记   对于sc44b0它也是一种单片机,一种比较高级的单片机而已,所以他也跟51单片机一样有外部中断,不同51单片机的是,他有8个外部中断源,对应的是8个管脚,(51只有两个,int0和int1,P3.3和P3.4),分别是Port G八个管脚。而对于外部中断4 /5/6/7很多都是共用寄存器,他们是通过或逻辑公用一个

773

基于S3C44B0的红外解码

         这是我学习S3C44B0以来的第一个成功实验具有代码自动纠错复位,模仿驱动程序写成驱动接口。现在整理了相关资料与大家分享.。这里我上传了我的源代码包括了 红外解码 A/D转换 UART相关技术,所有的结果都用超级终端输出。(源代码我建议大家用source insight查看)IR部分:NEC遥控器数据格式(上传ir_data.txt):IR_decode部分的流程图(

wanqilin 547

linux boot 缺省状态,Bootload启动过程全描述(uclinux)【转载

一.Bootloader理论上,uClinux引导时并非一定需要一个独立于Kernel Image的BootloaderImage。然而,将Bootloader与Kernel分开设计能够使软件架构更加清晰,也有助于灵活地支持多种引导方式,实现一些有用的辅助功能。Bootloader的主要任务可以概括如下:1.硬件初始化和系统引导;2.加载uClinux Kernel Image (如果需要);3....

weixin_39598094的博客 292
上一篇: 引导代码分析
下一篇: macro mend
micro9981
博客等级 码龄17年 840粉丝 733原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值