精华内容
下载资源
问答
  • ARM 汇编

    2019-09-05 16:45:12
    arm 汇编语言学习笔记汇编语言源文件格式数据类型 汇编语言源文件格式 arm汇编至少(我也不清楚总共有多少种)有两种----gnu的和armasm 这里的汇编指的是ARMASM的 文件后缀名为.s或.S .s : 汇编 .S: 预处理 + 汇编...

    arm 汇编语言学习笔记

    汇编语言源文件格式

    arm的汇编至少(我也不清楚总共有多少种)有两种----gnu的和armasm
    这里的汇编指的是ARMASM的
    文件后缀名为.s或.S
    .s : 汇编
    .S: 预处理 + 汇编

    每一行的格式如下:

    {symbol} {instruction|directive|pseudo-instruction} {;comment}

    三部分都是可选的

    symbol
    在指令和伪指令中是标签,在某些directive(大概是预处理指令,主要是给汇编器看)代表的是一个变量或者常量;必须顶行写,最好不要包含空白字符

    instruction|directive|pseudo-instruction
    不能顶行,也即必须是 空白+指令
    instruction|pseudo-instruction 最终会经汇编器翻译后进入最终镜像如hex,bin等
    directive 指示汇编器该怎么处理相关文本,影响编译结果
    比如c语言 #include 文件路径

    ;comment
    注释以;开头,可以 \ 跨行,好像没有多行注释

    大小写问题
    symbol和comment可以混合大小写,其他的最好统一大写或小写
    行长最大不超过4095字符

    参考文档中的例子

    	AREA A32ex, CODE, READONLY     ; Name this block of code A32ex
    	ENTRY                          ; Mark first instruction to execute
    start
    	MOV r0, #10                    ; Set up parameters
    	MOV r1, #3
    	ADD r0, r0, r1                 ; r0 = r0 + r1
    stop
    	MOV r0, #0x18                  ; angel_SWIreason_ReportException
        LDR r1, =0x20026               ; ADP_Stopped_ApplicationExit
    	SVC #0x123456                  ; AArch32 semihosting (formerly SWI)
    	END                            ; Mark end of file
    

    源文件可以包含一个或多个CODE段(section),DATA段,段是用指示 AREA标识的,非字母开头的段名要用 |段名| 形式,如

    	AREA A32ex, CODE, READONLY                   ; Name this block of code A32ex
    

    相邻CODE段在镜像中不一定相邻(ld脚本)

    数据类型

    汇编源码可包含 数字字符字符串boolean
    与c类似

    ----2019.21.28

    展开全文
  • ARM汇编

    2015-12-11 17:16:55
    为什么要学习ARM汇编? 1.bootloader初始化代码汇编效率高 2.Linux内核初始化汇编效率高 3.汇编和C语言混合编程 二。ARM汇编分类 1.ARM标准汇编 适合windows平台,如ADS中使用 2.GNU汇编 适合Linux平台,...

    一。为什么要学习ARM汇编?
    1.bootloader初始化代码汇编效率高
    2.Linux内核初始化汇编效率高
    3.汇编和C语言混合编程
    二。ARM汇编分类
    1.ARM标准汇编
    适合windows平台,如ADS中使用
    2.GNU汇编
    适合Linux平台,使用GNU交叉编译器
    三。汇编程序框架
    入口:_start:
    标示:.global _start(方便外部文件引用)
    代码段:.section .text
    未初始化数据:.section .bss
    初始化数据:.section .data
    四。ARM指令分类学习
    推荐资料:ARM汇编手册
    1.算术和逻辑指令
    1.1 MOV:传送
    作用:把一个数传送到另一个寄存器中
    1.2 MVN:传送取反的值
    作用:把一个数取反传送到另一个寄存器中
    1.3 SUB:减法,两个数相减,差值放到另一个寄存器中(注意:减数不能是立即数)
    1.4 ADD:加法
    1.5 AND:逻辑与操作
    1.6 BIC:位清除
    根据掩码的位为1就把对应的位清除为0
    2.比较指令
    2.1 CMP:比较结果三种:大于,小于,等于。结果影响状态寄存器CPRS的 N位和Z位
    2.2 TST:测试位,按位与,影响Z位
    3.跳转指令
    3.1 B:有条件看条件,没条件就无条件跳转
    3.2 BL:调用函数,跳转之前,把下一条指令的地址保存在LR寄存器,以便完成跳转调用函数之后回到跳转的位置继续执行
    4.移位指令
    4.1 LSL:逻辑或算术左移
    4.2 ROR:循环右移
    5.程序状态字访问指令
    注意:状态寄存器不能用通用的指令进行操作,需要用专用的指令搬移到通用寄存器里进行修改再用专用的指令搬回状态寄存器
    专用指令:MSR,MRS
    5.1 MSR:通用寄存器搬移到状态寄存器
    5.2 MRS:状态寄存器搬移到通用寄存器
    以上都是CPU核寄存器
    下面是存储器寄存器
    6.存储器访问指令
    6.1 LDR:内存的值保存到寄存器
    6.2 STR:寄存器的值保存到内存

    展开全文
  • ARM汇编指令ARM汇编指令ARM汇编指令ARM汇编指令ARM汇编指令
  • ARM汇编语言教程ARM汇编语言教程ARARM汇编语言教程M汇编语言教程ARM汇编语言教程ARM汇编语言教程
  • ARM汇编指令集ARM汇编指令集ARM汇编指令集ARM汇编指令集ARM汇编指令集ARM汇编指令集ARM汇编指令集ARM汇编指令集ARM汇编指令集ARM汇编指令集ARM汇编指令集
  • ARM汇编指令集ARM汇编指令集ARM汇编指令集ARM汇编指令集ARM汇编指令集ARM汇编指令集
  • ARM汇编与ARM GNU汇编

    2019-10-31 18:50:40
    目录一、ARM汇编开发的两种的方式二、ARM的编译开发环境三、伪操作,宏指令,伪指令四、ARM汇编伪操作五、ARM汇编伪指令六、ARM GNU编译环境七、两种开发环境的区别 参考链接: ARM编译器(一)ARM汇编与ARM GNU汇编...

    参考链接:
    ARM编译器(一)ARM汇编与ARM GNU汇编
    ARM编译器(二)arm编译器
    ARM编译器(三) 其他

    一、ARM汇编开发的两种的方式

    ARM汇编开发指用ARM提供的汇编指令,进行ARM程序的开发。

    ARM汇编开发,有两种开发方式,一种是使用ARM汇编,一种是使用ARM GNU汇编。两种汇编开发,使用的汇编指令是完全一样的,区别是宏指令,伪指令,伪操作不一样。其实两种开发方式的区别在于所使用的编译工具不一样。

    对于ARM汇编,使用的是ARM公司开发的编译器,而ARM GNU汇编,是使用GNU为ARM指令集开发的编译器,也就是arm-gcc。

    二、ARM的编译开发环境

    两种常用的ARM的编译开发环境

    DS5:ARM提供的集成开发软件。使用的是ARM提供的工具链进行程序编译
    
    GNU开发环境: 由GNU的汇编器as,交叉编译器gcc,和链接器ld等组成
    

    三、伪操作,宏指令,伪指令

    伪操作:ARM汇编语言程序里的一些特殊指令助记符,其作用主要是完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在计算机运行期间由机器执行。如程序段的定义,就属于伪操作。

    宏指令:一段独立的程序代码,可插在源程序中,通过伪操作来定义。

    伪指令:ARM汇编语言程序里的一些特殊指令助记符,不在处理器运行期间执行,在汇编时,被合适的ARM的机器指令代替,从而实现真正的指令操作。

    四、ARM汇编伪操作

    伪操作 语法格式 作用
    GBLA GBLA Varible 声明一个全局的算术变量,并将其初始化为0
    GBLL GBLL Varible 声明一个全局的逻辑变量,并将其初始化成{FALSE}
    GBLS GBLS Varible 声明一个全局的字符串变量,并将其初始化成空串
    LCLA LCLA Varible 声明一个局部的算术变量,并将其初始化为0
    LCLL LCLL Varible 声明一个局部的逻辑变量,并将其初始化成{FALSE}
    LCLS LCLS Varible 声明一个局部的字符串变量,并将其初始化成空串
    SETA SETA Varible expr 给一个全局或局部算术变量赋值
    SETL SETL Varible expr 给一个全局或局部逻辑变量赋值
    SETS SETS Varible expr 给一个全局或局部字符串变量赋值
    RLIST name LIST {list of registers} 为一个通用寄存器列表定义名称
    CN name CN expr 为一个协处理器的寄存器定义名称
    CP name CP expr 为一个协处理器定义名称
    DN/SN name DN/SN expr DN/SN为一个双精度/单精度的VFP寄存器定义名称
    FN name FN expr 为一个FPA浮点寄存器定义名称
    LTORG LTONG 声明一个数据缓冲池(文字池)的开始
    MAP MAP expr {, base-register} 定义一个结构化的内存表(storage map)的首地址
    FIELD {label} FIELF expr 定义一个结构化内存表中的数据域
    SPACE {label} SPACE expr 分配一块连续内存单元,并用0初始化
    DCB {label} DCB expr {,expr}.. 分配一块字节内存单元,并用expr初始化
    DCD/ DCDU {label} DCD/DCDU expr {,expr}… 分配一块字内存单元, 并用expr初始化
    DCDO {label} DCDO expr {,expr}… 分配一块字对齐的字内存单元, 并用expr初始化
    DCFD/DCFDU “{label} DCFD{U} fpliteral ,{,fpliteral}…” 为双精度的浮点数分配字对齐的内存单元
    DCFS/DCFSU “{label} DCFS{U} fpliteral ,{,fpliteral}…” 为单精度的浮点数分配字对齐的内存单元
    DCI {label} DCI expr, {expr}… ARM代码分配一段字对齐的内存单元,填充expr(二进制指令码),THUMB代码中,分配一段半字对齐的半字内存单元。
    DCQ/ DCQU “{label} DCQ{U} {-} literal,{, {-} literal}…” 分配一段以双字(8个字节)为单位的内存
    DCW/DCWU “{label} DCW{U} {-} literal,{, {-} literal}…” DCW用于分配一段半字对齐的半字内存单元

    1、AREA

    创建一段新的程序代码或数据区。

    格式 : AREA name, {,attr,} …

    其中,name是程序段名, atrr是段名属性

    对于属性,有以下一些:

    CODE: 用于定义代码段,默认为是READONLY
    
    DATA: 用于定于数据段,默认为READWRITE
    
    READONLY: 指定本段的内容只读
    
    READWRITE:  指定本段的内容可读可写
    
    ALIGN:  指定对齐为2次幂
    
    COMMON: 定义通用的段。不包含任何用户的代码和数据。各源文件中同名的COMMON属性段共享同一段存储单元
    

    2、ALIGN

    指定对齐

    ALIGN  4  表示4字节地址对齐
    
    ALIGN  8  表示8字节地址对齐
    
    注意:在AREA中使用和单独使用ALIGN的区别,在于格式和对齐的计算不一样。
    

    3、ENTRY

    指定汇编程序的入口。

    一个程序至少有一个入口点,也可以有多个入口点,但是在一个源文件中,最多只能有一个ENTRY。当多个源文件均有ENTRY时,由链接器指定程序真正的入口。

    4、END

    表示源程序的结束

    所以汇编语言源文件必须以END结束,汇编器遇到END, 将结束编译。

    5、EXPORT

    格式: EXPORT 标号 [,WEAK]

    声明一个全局标号,其他源文件可以使用这个标号。WEAK表示碰上其他同名标号时,其他标号优先。

    6、IMPORT

    格式: IMPORT 标号,[,WEAK]

    表示该引用的标号在其他源文件中,单要在当前文件中引用。WEAK表示找不到该标号时,也不报错,一般该标号置为0,如果是B 或BL指令用到该标号,该指令置为nop。

    该标号会加入到当前源文件的符号表中。

    7、EXTERN

    和IMPORT一样,不同在于,如果当前文件没有引用该标号,该标号不会加入到当前源文件的符号表中。

    8、GET(或INCLUDE)

    将一个源文件包含到当前的源文件中

    9、EQU

    对一个常量标号赋值

    格式: name EQU expression

    其中: name符号名, expression寄存器相关或者程序相关的固定值

    如:

        num   EQU   2  ;  为符号赋予数字2
    

    EQU,等同于C语言中用#define定义一个常量

    10、SPCAE

    用于分配一片连续内存单元,并用0初始化。SPACE可用%代替。

    格式: {label} SPACE expr

    label : 是一个标号, 可选

    expr: 分配的内存字节数

    stack SPACE 100 ; 分配100个字节内存单元,并用0初始化。标号stack是这片空间的起始地址
    

    11、DCB

    用于分配段字节内存单元,并用伪操作中的expr初始化。

    格式: {label} DCB expr {,expr}

    label: 是一个标号,可选

    expr: 可以是-128~255的数值或者字符串

    如:

    string  DCB  "HELLO"   ;为HELLO字符串分配空间, string是这块空间的起始地址
    

    12、DCD及DCDU

    用于分配段字内存单元(分配的内存都是字对齐,DCDU并不严格字对齐),并用伪操作中的expr初始化。 DCD 可用 & 代替。

    格式: {label} DCD expr, {,expr}

    label: 是一个标号,可选,表示这块内存单元的首地址

    expr: 数字表达式或程序中的标号

    如:

    data DCD  1,2,3,4     ;分配字对齐的字单元空间,初始化为1,2,3,4
    

    五、ARM汇编伪指令

    ARM伪指令包括: ADR, ADRL,LDR ,NOP

    THUMB伪指令包括:ADR, LDR, NOP

    伪指令 语法格式 作用
    ADR ADR{cond} register, expr 将基于PC或基于寄存器的地址值读取到寄存器中。小范围的地址读取
    ADRL ADRL{cond} register, expr 将给予PC或基于寄存器的地址值读取到寄存器中。中等范围的地址读取
    LDR “LDR {cond} register, =[expr|label]” 将一个32位的立即数或者一个地址值读取到寄存器中。大范围的地址读取
    NON NOP 在汇编时,被替换成空操作

    六、ARM GNU编译环境

    伪操作 语法格式 作用
    .byte .byte expr {,expr}… 分配一段字节内存单元,并用expr初始化
    .hword/.short .hword expr {,expr}… 分配一段半字内存单元,并用expr初始化
    .ascii .ascii expr {,expr}… 定义字符串expr
    .asciz/.string .asciz expr {,expr}… 定义字符串expr(会增加/0为结束符)
    .floar/.single .float expr {,expr}… 定义32bit IEEE浮点数expr
    .double .doubel expr {,expr}… 定义64bit IEEE浮点数expr
    .word/.long/.int .word expr {,expr}… 分配一段字内存单元,并用expr初始化
    .fill .fill repeat {,size} {,value} 分配一段字节内存单元,用sieze长度value填充repeat次
    .zero .zero size 分配一段字节内存单元,并用0填充内存
    .space/.skip .space size, {,value} 分配一段内存单元,用value将内存初始化
    .section .section expr 定义一个段
    .text .text {subsection} 代码段,
    .data .data{subsection} 数据段
    .bss .bss{subsection} bss段
    .cond 16/.thumb .code 16/.thumb 表示之后的汇编指令使用THUMB指令集
    .code 32/.arm .code 32/.arm 表示之后的汇编指令使用ARM指令集
    .end .end 标记汇编文件的结束
    .include .include “filename” 将一个源文件包含到当前源文件中
    .align/.balign .align {alignment} {,fill},{max} 通过填充字节使当前位置满足一定的对齐格式

    七、两种开发环境的区别

    两种开发环境下的汇编代码,有较多不同的点,主要是符号及伪操作的不同。

    ARM汇编的伪操作符 GNU汇编的伪操作符
    INLCUDE .include
    NUM EQU 25 .equ NUM, 25
    EXPORT .global
    IMPORT .extern
    DCD .long
    IF: DEF: .ifdef
    ELSE .else
    ENDIF .endif
    OR |
    SHL <<
    RN .req
    GBLA .global
    NUM SETA 16 .equ NUM , 16
    MACRO .macro
    MEND .endm
    END .end
    AREA WORD, CODE, READONLY .text
    AREA BLOCK, DATE, READWRITE .data
    CODE32 .arm
    CODE16 .thumb
    LTORG .ltorg
    % .fill
    ENTRY ENTRY:
    ldr x0,=0xff ldr x0,=0xff
    展开全文
  • ARM汇编ppt ARM汇编ppt

    2009-02-24 12:07:18
    ARM汇编pptARM汇编pptARM汇编pptARM汇编pptARM汇编pptARM汇编pptARM汇编pptARM汇编pptARM汇编ppt
  • ArmGNU汇编&Arm汇编

    2020-01-16 23:34:18
    Arm汇编 arm芯片做汇编开发有两种汇编形式可以选择,1.arm汇编2.arm gnu汇编 两者用的都是汇编指令,不同在于两者的伪指令、伪操作不一样。 arm汇编用的是arm的编译器,而armgnu的汇编用的是arm–gcc编译器。 GNU-...
    ArmGNU汇编&Arm汇编

    arm芯片做汇编开发有两种汇编形式可以选择,1.arm汇编2.arm gnu汇编
    两者用的都是汇编指令,不同在于两者的伪指令、伪操作不一样。
    arm汇编用的是arm的编译器,而armgnu的汇编用的是arm–gcc编译器。

    GNU-ARM的注释

    代码中的注释可以是@,整段注释//
    整行注释符号#
    语句分隔符;
    立即数的前缀#或者$。
    Linux的汇编语句格式:
    结构如下:

    [label:][instruction/directive/pseudo-instruction}@comment
    label:标号,gnu汇编中任何以冒号结尾的都被视为一个标号,不一定在一行的开始。
    instruction指令,directive伪操作,pseudo-instruction伪指令
    .section伪指令,可以通过.section来定义一个段。.section也有格式要求。
    gnuarm预定义的段名:
    .text代码段
    .data数据段
    .bss未初始化段
    .sdata
    .sbss
    gnu汇编语句入口点:
    汇编语句缺省入口是:_start
    .global用来让某一符号对链接可见,.global _start让start对链接可见,告诉连接器从什么地方开始start执行。
    
    gnu汇编的宏定义:

    格式如下:
    .macro 宏名参数名列表 @伪指令 .macro定义了一个宏
    宏主题
    .endm @.endm表示结束宏。

    gnu汇编中的常数:

    1.十进制以非0的数字开始
    2.二进制以0b开始,其中字母无大小写区别
    3.八进制以0开始。
    4.十六进制以0x开始,
    5.字符串常量用双引号,中间也可以用转义字符。
    6.当前地址以.表示,gnu汇编中以.表示当前指令的地址。

    函数的定义:

    函数名:
    函数体
    返回语句
    函数的编写遵循的规则:
    1.参数、结果暂存到r0-r3中,
    2.函数值返回≯一个字的值,应该把这个字放到r0中,
    3.函数中如果改动了sp/r13堆栈指针、fp/r11框架指针、sl/r10堆栈限制、lr/r14链接寄存器、r4-r11函数结束时要回复这些寄存器的值。
    4. .global/.globl:用来定义一个全局的符号,格式如下: .global/.globl symbol,
    一般的,函数如果需要在其他文件中调用,需要用到.global 伪操作将函数声明
    为全局函数;

    展开全文
  • ARM汇编指令

    2018-12-05 18:04:24
    ARM汇编指令,学习ARM汇编可以下载看看,总结了许多汇编指令
  • arm 汇编

    2013-09-07 17:34:03
    汇编延时代码中常用的: bne指令 B 是最简单的分支。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的地址,从那里继续执行。 BNE指令,是个条件跳转,即:是“不相等(或不为0)跳转指令”。如果不为0就跳转...
  • ARM汇编语言程序设计 ARM汇编语言程序设计 ARM汇编语言程序设计 ARM汇编语言程序设计
  • ARM 汇编指令

    2018-02-04 13:18:52
    ARM 汇编指令,方便指令查询,代码编写。ARM 汇编指令,方便指令查询,代码编写。
  • 欢迎来到ARM汇编基础教程,这套教程是为了让你可以在ARM架构下进行漏洞利用打基础的。在我们能开始写ARM的shellcode以及构建ROP链之前,我们需要先学习相关的ARM汇编基础知识。 这些基础知识包括: Part 1:ARM...
  • ARM汇编语言

    2016-10-24 08:14:11
    ARM汇编语言
  • arm 汇编学习笔记

    2020-08-20 07:30:47
    arm 汇编学习笔记
  • ARM 汇编 汇编语言学校 ARM 指令 学校ARM uoot 移植 底层驱动开发不可或缺
  • ARM汇编语言编程详解

    2018-02-22 09:08:23
    ARM汇编语言编程详解ARM汇编语言编程详解ARM汇编语言编程详解ARM汇编语言编程详解ARM汇编语言编程详解
  • arm 汇编 keil

    2018-10-06 17:21:31
    arm 汇编 keil ARM汇编学习keil模拟器环境搭建 [1].工具介绍及安装 进入02-Yagarto工具包目录,安装以下软件: (1).安装gcc编译工具: yagarto-bu-2.21_gcc-4.6.2-c-c++_nl-1.19.0_gdb-7.3.1_eabi_20111119.exe。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,509
精华内容 4,203
关键字:

arm汇编