原文地址:http://zqwt.012.blog.163.com/blog/static/120446842010111482417545/

6、GNU汇编程序中的常数

<1>    十进制数以非0数字开头,如:123和9876;

<2>    二进制数以0b开头,其中字母也可以为大写;

<3>    八进制数以0开始,如:0456,0123;

<4>    十六进制数以0x开头,如:0xabcd,0X123f;

<5>    字符串常量需要用引号括起来,中间也可以使用转义字符,如: “You are welcome!\n”;

<6>    当前地址以“.”表示,在GNU汇编程序中可以使用这个符号代表当前指令的地址;

<7>    表达式:在汇编程序中的表达式可以使用常数或者数值, “-”表示取负数, “~”表示取补,“<>”表示不相等,其他的符号如:+、-、*、 /、%、<、<<、>、>>、|、&、^、!、==、>=、<=、&&、|| 跟C语言中的用法相似。

7、GNU ARM汇编的常用伪操作

在前面已经提到过了一些为操作,还有下面一些为操作:

  • 数据定义伪操作: .byte,.short,.long,.quad,.float,.string/.asciz/.ascii,重复定义伪操作.rept,赋值语句.equ/.set ;

  • 函数的定义;

  • 对齐方式伪操作 .align;

  • 源文件结束伪操作.end;

  • .include伪操作;

  • if伪操作;

  • .global/ .globl 伪操作 ;

  • .type伪操作 ;

  • 列表控制语句 ;

别于GNU AS汇编的通用伪操作,下面是ARM特有的伪操作:

.reg ,.unreq ,.code ,.thumb ,.thumb_func ,.thumb_set, .ltorg ,.pool

<1>数据定义伪操作

byte:单字节定义,如:.byte 1,2,0b01,0x34,072,'s' ;

.short:定义双字节数据,如:.short 0x1234,60000 ;

.long:定义4字节数据,如:.long 0x12345678,23876565

.quad:定义8字节,如:.quad 0x1234567890abcd

.float:定义浮点数,如:.float 0f-31415926535897932384626433832795028841971.693993751E-40 @ – pi

.string/.asciz/.ascii:定义多个字符串,如:

	.string "abcd", "efgh", "hello!"
.asciz "qwer", "sun", "world!"
.ascii "welcome\0"
注意:ascii伪操作定义的字符串需要自行添加结尾字符'\0'。

.rept:重复定义伪操作, 格式如下:

	.rept 重复次数
数据定义
.endr @结束重复定义
例:
.rept 3
.byte 0x23
.endr

.equ/.set: 赋值语句, 格式如下:

	.equ(.set) 变量名,表达式
例:
.equ abc, 3 @让abc=3

<2>函数的定义伪操作

函数的定义,格式如下:

函数名:

函数体

返回语句

一般的,函数如果需要在其他文件中调用, 需要用到.global伪操作将函数声明为全局函数。为了不至于在其他程序在调用某个C函数时发生混乱,对寄存器的使用我们需要遵循APCS准则。函数编译器将处理函数代码为一段.global的汇编码。

函数的编写应当遵循如下规则:

a.         a1-a4寄存器(参数、结果或暂存寄存器,r0到r3 的同义字)以及浮点寄存器f0-f3(如果存在浮点协处理器)在函数中是不必保存的;

b.         如果函数返回一个不大于一个字大小的值,则在函数结束时应该把这个值送到 r0 中;

c.         如果函数返回一个浮点数,则在函数结束时把它放入浮点寄存器f0中;

d.         如果函数的过程改动了sp(堆栈指针,r13)、fp(框架指针,r11)、sl(堆栈限制,r10)、lr(连接寄存器,r14)、v1-v8(变量寄存器,r4 到 r11)和 f4-f7,那么函数结束时这些寄存器应当被恢复为包含在进入函数时它所持有的值。

<3>.align .end .include .incbin伪操作

align:用来指定数据的对齐方式,格式如下:

.align [absexpr1, absexpr2]

以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或 32. 第二个表达式值表示填充的值。

end:表明源文件的结束。

.include:可以将指定的文件在使用.include 的地方展开,一般是头文件,例如:

.include “myarmasm.h”

.incbin伪操作可以将原封不动的一个二进制文件编译到当前文件中,使用方法如下:

.incbin "file"[,skip[,count]]

skip表明是从文件开始跳过skip个字节开始读取文件,count是读取的字数.

<4>..if伪操作

根据一个表达式的值来决定是否要编译下面的代码, 用.endif伪操作来表示条件判断的结束, 中间可以使用.else来决定.if的条件不满足的情况下应该编译哪一部分代码。

.if有多个变种:

.ifdef symbol                @判断symbol是否定义

.ifc string1,string2        @字符串string1和string2是否相等,字符串可以用单引号括起来

.ifeq expression            @判断expression的值是否为0

.ifeqs string1,string2        @判断string1和string2是否相等,字符 串必须用双引号括起来

.ifge expression            @判断expression的值是否大于等于0

.ifgt absolute expression    @判断expression的值是否大于0

.ifle expression            @判断expression的值是否小于等于0

.iflt absolute expression    @判断expression的值是否小于0

.ifnc string1,string2    @判断string1和string2是否不相等, 其用法跟.ifc恰好相反。

.ifndef symbol, .ifnotdef symbol @判断是否没有定义symbol, 跟.ifdef恰好相反

.ifne expression            @如果expression的值不是0, 那么编译器将编译下面的代码

.ifnes string1,string2        @如果字符串string1和string2不相等, 那么编译器将编译下面的代码.

<5>.global .type .title .list

.global/ .globl :用来定义一个全局的符号,格式如下:

.global symbol 或者 .globl symbol

.type:用来指定一个符号的类型是函数类型或者是对象类型, 对象类型一般是数据, 格式如下:

.type 符号, 类型描述

例:

	.globl a
.data
.align 4
.type a, @object
.size a, 4
a:
.long 10

例:

	.section .text
.type asmfunc, @function
.globl asmfunc
asmfunc:
mov pc, lr

<6>列表控制语句:

.title:用来指定汇编列表的标题,例如:

.title “my program”

.list:用来输出列表文件.

<7>ARM特有的伪操作

.reg: 用来给寄存器赋予别名,格式如下:

别名 .req 寄存器名

.unreq: 用来取消一个寄存器的别名,格式如下:

.unreq 寄存器别名

注意被取消的别名必须事先定义过,否则编译器就会报错,这个伪操作也可以用来取消系统预制的别名, 例如r0, 但如果没有必要的话不推荐那样做。

.code伪操作用来选择ARM或者Thumb指令集,格式如下:

.code 表达式

如果表达式的值为16则表明下面的指令为Thumb指令,如果表达式的值为32则表明下面的指令为ARM指令.

.thumb伪操作等同于.code 16, 表明使用Thumb指令, 类似的.arm等同于.code 32

.force_thumb伪操作用来强制目标处理器选择thumb的指令集而不管处理器是否支持

.thumb_func伪操作用来指明一个函数是thumb指令集的函数

.thumb_set伪操作的作用类似于.set, 可以用来给一个标志起一个别名, 比.set功能增加的一点是可以把一个标志标记为thumb函数的入口, 这点功能等同于.thumb_func

.ltorg用于声明一个数据缓冲池(literal pool)的开始,它可以分配很大的空间。

.pool的作用等同.ltorg

.space <number_of_bytes> {,<fill_byte>}

分配number_of_bytes字节的数据空间,并填充其值为fill_byte,若未指定该值,缺省填充0。(与armasm中的SPACE功能相同)

.word <word1> {,<word2>} …

插入一个32-bit的数据队列。(与armasm中的DCD功能相同)。可以使用.word把标识符作为常量使用。

例:

	Start:
valueOfStart:
.word Start
这样程序的开头Start便被存入了内存变量valueOfStart中。

.hword <short1> {,<short2>} …

插入一个16-bit的数据队列。(与armasm中的DCW相同)

8、GNU ARM汇编特殊字符和语法

<1>    代码行中的注释符号: ‘@’

<2>    整行注释符号: ‘#’

<3>    语句分离符号: ‘;’

<4>    立即数前缀: ‘#’ 或 ‘$’

(转)GNU风格ARM汇编语法指南(非常详细)5的更多相关文章

  1. GNU风格 ARM汇编语法指南

    汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设置页表.操作 ARM的协处理器等.这些初始化工作完成后就可以跳转到C代码main函数中执行. 1.  GNU汇编语言语句格式 任何Linux汇编 ...

  2. (转)GNU风格ARM汇编语法指南(非常详细)2

    原文地址:http://zqwt.012.blog.163.com/blog/static/120446842010111481828392/ 2.GNU汇编程序中的标号symbol(或label) ...

  3. (转)GNU风格ARM汇编语法指南(非常详细)1

    原文地址:http://zqwt.012.blog.163.com/blog/static/120446842010111481551809/ 汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设 ...

  4. (转)GNU风格ARM汇编语法指南(非常详细)3

    原文地址:http://zqwt.012.blog.163.com/blog/static/120446842010111482023804/ 3.GNU汇编程序中的分段 <1>    . ...

  5. (转)GNU风格ARM汇编语法指南(非常详细)4

    原文地址:http://zqwt.012.blog.163.com/blog/static/12044684201011148226622/ 4.GNU汇编语言定义入口点 汇编程序的缺省入口是_sta ...

  6. GNU风格 ARM汇编语法5

    . GNU汇编程序中的常数 <>十进制数以非0数字开头,如:123和9876: <>二进制数以0b开头,其中字母也可以为大写: <>八进制数以0开始,如:,: &l ...

  7. GNU风格 ARM汇编语法2

    .GNU汇编程序中的标号symbol(或label) 标号只能由a-z,A-Z,-,".",_等(由点.字母.数字.下划线等组成,除局部标号外,不能以数字开头)字符组成. Symb ...

  8. GNU风格 ARM汇编语法1

    汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设置页表.操作 ARM的协处理器等. 这些初始化工作完成后就可以跳转到C代码main函数中执行. 1.GNU汇编语言语句格式 任何Linux汇编行 ...

  9. GNU风格 ARM汇编语法3

    . GNU汇编程序中的分段 <1>.section伪操作 .section <section_name> {,”<flags>”} Starts a new cod ...

随机推荐

  1. python3的数据类型转换问题

    问题描述:在自我学习的过程中,写了个登陆,在input处,希望能够对数据类型进行判断,但是因为python3的输入的数据会被系统默认为字符串,也就是1,1.2,a.都会被系统默认为字符串,这个心塞啊, ...

  2. WEB前端资源集(二)

    在上一篇为大家整理出了一些资源网站,接下来给大家整理了一些开发中常用的工具. 开发工具篇 开发工具集 Sublime Text 3:SublimeText 3是一个代码编辑器,也是HTML和散文先进的 ...

  3. VRRP笔记一:基本简介(注意iptables和selinux的问题)

    LAN客户端判定哪个路由器应该为其到达目标主机的下一跳网关的方式有动态及静态决策两种方式,其中,觉的动态路由发现方式有如下几种: 1.Proxy ARP —— 客户端使用ARP协议获取其想要到达的目标 ...

  4. Python-多任务复制文件夹

    import multiprocessing import os import time def copy_file(queue, file_name, old_folder_name, new_fo ...

  5. btrace简单使用

    基本安装 在github上btrace项目的release下 下载最新的btracehttps://github.com/btraceio/btrace/releases 解压完后,将btrace的b ...

  6. es6 转载

    1.let命令 1)let和var的区别:let声明的变量只有所在的代码块有效. 2)没有变量的提升,一定要声明后使用.使用let命令声明变量之前,该变量都是不可用的.形成“暂时性死区”. 3)typ ...

  7. 吴裕雄--天生自然 R语言开发学习:分类(续一)

    #-----------------------------------------------------------------------------# # R in Action (2nd e ...

  8. AI超越人类大脑,或许是场“别有用心者”的骗局

    ​ 谷歌.微软.苹果.特斯拉.百度.腾讯.阿里等互联网巨头企业,以及纳德拉.马斯克.扎克伯格.马云等互联网大佬,近年来一直都对人工智能--AI非常上心.在众多场合对AI给予了或肯定,或恐惧的评价.但无 ...

  9. 苹果为何要一定要去印度生产iPhone

    ​ 现在,关于苹果手机有几种流行的猜想和期待,今年恰逢iPhone问世十周年,新产品估计会有颠覆性创新,消费者正望穿秋水,翘首企盼,但只需待到金秋便可知晓,何况iPhone8或许也就是一小撮发烧友的选 ...

  10. 初学Qt——QTableView+QSqlqueryModel

    我们在显示报表时可以用到上面两个类来实现,QTableView负责对视图显示:QSqlqueryModel则负责数据模块. 这里数据查询使用QSqlqueryModel主要是这个类可以通过自己写的查询 ...