、  GNU汇编程序中的常数
<>十进制数以非0数字开头,如:123和9876;
<>二进制数以0b开头,其中字母也可以为大写;
<>八进制数以0开始,如:,;
<>十六进制数以0x开头,如:0xabcd,0X123f;
<>字符串常量需要用引号括起来,中间也可以使用转义字符,如: “You are welcome!\n”;
<>当前地址以“.”表示,在GNU汇编程序中可以使用这个符号代表当前指令的地址;
<>表达式:在汇编程序中的表达式可以使用常数或者数值, “-”表示取负数, “~”表示取补,“<>”表示不相等,
其他的符号如:+、-、*、 /、%、<、<<、>、>>、|、&、^、!、==、>=、<=、&&、|| 跟C语言中的用法相似。 、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 ,,0b01,0x34,,'s' ;
>.short:定义双字节数据,如:.short 0x1234, ;
>.long:定义4字节数据,如:.long 0x12345678,
>.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
.byte 0x23
.endr >.equ/.set: 赋值语句, 格式如下:
.equ(.set) 变量名,表达式
例:
.equ abc, @让abc=   <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]
以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,, ,16或 . 第二个表达式值表示填充的值。
   >.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
.type a, @object
.size a,
a:
.long  例:
.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 , 表明使用Thumb指令, 类似的.arm等同于.code
  >.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相同)   、 GNU ARM汇编特殊字符和语法
<>代码行中的注释符号: ‘@’
<>整行注释符号: ‘#’
<>语句分离符号: ‘;’
<>立即数前缀: ‘#’ 或 ‘$’

GNU风格 ARM汇编语法5的更多相关文章

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

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

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

    原文地址:http://zqwt.012.blog.163.com/blog/static/120446842010111482417545/ 6.GNU汇编程序中的常数 <1>    十 ...

  3. GNU风格 ARM汇编语法2

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

  4. GNU风格 ARM汇编语法1

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

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

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

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

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

  7. GNU风格 ARM汇编语法3

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

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

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

  9. GNU风格 ARM汇编语法4

    .GNU汇编语言定义入口点 汇编程序的缺省入口是_start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点. 例:定义入口点 .section .data < initializ ...

随机推荐

  1. linux sar命令详细说明相关参数

    详细说明linux的sar命令 sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括: ...

  2. Unix 网络编程 读书笔记1

    第一章: C/C++语言提供两种不同的编程模式:IPL32和PL64.► IPL32 ● 表示integer/pointer/long三种数据类型是32位(4个字节),在这种模式下,提供32位的地址空 ...

  3. DX:神奇的LayoutControl.BestFit()

    自动生成LayoutControl后,界面总是不对:在LayoutControl中找到一个BestFit()方法,调用后神奇的结果出现了,这不正是我想要的吗?测试代码: public partial ...

  4. tomcat 的配置文件 server.xml 详解

    server.xml位于$TOMCAT_HOME/conf目录下,作为整个 tomcat 服务器最核心的配置文件,server.xml的每一个元素都对应了 tomcat中的一个组件,通过对xml中元素 ...

  5. nexus 介绍

    http://juvenshun.iteye.com/blog/349534

  6. iOS GCD中级篇 - dispatch_group的理解及使用

    上一篇GCD基础篇,以及同步.异步,并发.并行几个概率的理解 关于dispatch_group的概念以及几种场景下的使用 1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相 ...

  7. Java中的资源文件加载方式

    文件加载方式有两种: 使用文件系统自带的路径机制,一个应用程序只能有一个当前目录,但可以有Path变量来访问多个目录 使用ClassPath路径机制,类路径跟Path全局变量一样也是有多个值 在Jav ...

  8. 【LeetCode】49. Anagrams (2 solutions)

    Anagrams Given an array of strings, return all groups of strings that are anagrams. Note: All inputs ...

  9. 关于android闹钟,设置定时提醒的一点心得

    首先在设置提醒之前你需要一个入口,比如说onclick事件中,在此不做赘述. android中使用闹钟进行提醒其实非常简单,你只需要告知系统你想在什么时候被提醒,然后需要一个闹钟的广播接收器,当到你设 ...

  10. .Net4.0 任务(Task)[转]

    .Net4.0 任务(Task) 任务(Task)是一个管理并行工作单元的轻量级对象.它通过使用CLR的线程池来避免启动专用线程,可以更有效率的利用线程池.System.Threading.Tasks ...