原文地址: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. 微软推出精简版Windows10Lean系统意欲何为?

    提起Windows系统,自然无须多言都知道它的重要性.在经历了Windows Vista的失败. Windows 7的成功.Windows 8的平庸和Windows 10的复兴之后,微软算是积累下了大 ...

  2. Redhat7 配置https

    Redhat7 配置https 分为自签名证书和第3方证书(此时实验为第3方,自签名略) 安装: # yum install httpd mod_ssl 生成key: # openssl genrsa ...

  3. [LC] 257. Binary Tree Paths

    Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...

  4. 两种方法使用js读写cookie实现一个底部广告浮层效果

    下面一个案例实现了js实现一个页面浮层并且使用两种方法使用js读写cookie:来实现用户关闭广告的显示状态: 读者可以将下面代码复制到一个html文件试试效果:html的pre标签未两种js实现的方 ...

  5. java 字符串转日期格式

    /** * 字符串转日期格式 * */ public static Date date(String date_str) { try { Calendar zcal = Calendar.getIns ...

  6. 有用户及目录判断的删除文件内容的Shell脚本

    [root@localhost Qingchu]# cat Qingchu_version2.sh #!/bin/bash #描述: # 清除脚本! #作者:孤舟点点 #版本:2.0 #创建时间:-- ...

  7. VMware虚拟机里安装CentOS 6.3图文教程

    著名服务器版本 CentOS 6.3 已经发布 http://www.centoscn.com/CentosSoft/iso/2013/0720/370.html CentOS 6.3 网易镜像下载: ...

  8. 周鸿祎身价超过刘强东,A股上市的360能让周鸿祎成为中国首富吗?

    不得不说,互联网大佬们的财富波动实在是太大了.股价的上涨或下跌,分分钟就是几亿.几十亿的差别--普通人十辈子都挣不到的钱! 在1月3日,持股比例为23.41%的周鸿手中的股票已经价值880.9亿元,超 ...

  9. Promethues配置

    # my global config global: scrape_interval: 10s # Set the scrape interval to every 15 seconds. Defau ...

  10. 【年度开源、工具合集】牛津计划,DMTK,Graph Engine…提高你的工作效率!

    本篇合集包括以下三个部分的内容: 1.微软亚洲研究院过去一年的所有开源合集,如分布式机器学习工具包DMTK等. 2.利用微软研究院的技术提高工作效率的工具合集,如让没有机器学习背景的开发人员也能开发出 ...