原文地址: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. UFT三种录制方式

    1.正常录制(Normal Recording) QTP默认的录制模式,这种录制模式是QTP最突出的特点,是直接对对象的操作,可以说此类模式继承了对象模型的所有优点,能够充分发挥对象库的威力.它通过识 ...

  2. Docker学习笔记_10 docker应用 - 部署TOMCAT服务

    选择基镜像 基镜像使用dokcer hub官方提供的tomcat8 alpine当前最新版本,https://hub.docker.com/_/tomcat/ docker pull tomcat:8 ...

  3. 聊聊H5与JS近几年的黑科技

    聊聊H5与JS近几年的黑科技 自ajax技术的诞生,编程界兴起了一股WEB开发热,facebook,Twitter等众多大佬级企业都在网页应用上大放异彩,这十年我们见证了前端技术的崛起.这期间产生了众 ...

  4. 三年无限流量免费随身WiFi充电宝是真的还是套路?

    一般来说大家现在看到"无限流量"."免费"等字眼,总会有一种"这是陷阱"."这是大坑"."就要黑你钱" ...

  5. Java Timer和TimerTask

    Timer是JDK中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的任务,可以指定一次或多次. TimerTask是一个实现了Runnable接口的抽象类,代表一个可被执行的任 ...

  6. 直播问答App乃虚火,调侃知识终不能长久盈利

    ​ 随着王思聪在微博宣布"我.我乐意",一款叫"冲顶大会"的App冲到了大众面前,紧接着"芝士超人"携10亿元奖金从天而降,瞬间之内,在线答 ...

  7. 阿里云服务器上搭建seafile专业版

    因为官方一键安装教程在阿里云服务器上无法安装,由于水平有限,无法解决,所以选择手动安装 参考资料: 1,.腾讯云搭建seafile服务器 2.How to Install Seafile with N ...

  8. Swift iOS实现把PCM语音转成MP3格式

    最近折腾了swift的语音录制识别和转码,这块还是比较坑的,由于语音识别的准确度实测大概也就80%左右,所以还是需要上传录音文件啊.首先是用讯飞语音SDK实现语音录制和识别(语音听写),第一个坑是讯飞 ...

  9. Docker Swarm和Kubernetes在大规模集群中的性能比较

    Contents 这篇文章主要针对Docker Swarm和Kubernetes在大规模部署的条件下的3个问题展开讨论.在大规模部署下,它们的性能如何?它们是否可以被批量操作?需要采取何种措施来支持他 ...

  10. 手写实现vue的MVVM响应式原理

    文中应用到的数据名词: MVVM   ------------------        视图-----模型----视图模型                三者与 Vue 的对应:view 对应 te ...