、  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. webpack entry和output配置属性

    1.entry entry的三种配置方式: (1)传递字符串: 单个入口语法:传递一个字符串 entry: './src/js/main.js', (2)传递数组 将创建“多个主入口(multi-ma ...

  2. JavaSE入门学习17:Java面向对象之package(包)

           一Java包(package)        为了更好地组织类,Java提供了包机制,用于差别类名的命名空间.        包的作用:        A把功能类似或相关的类或接口组织在 ...

  3. or1200中载入存储类指令说明

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 OR1200中实现的载入存储类指令有8条,每条指令的作用与说明如表9.1所看到的. watermark/2/text/aHR0cDo ...

  4. python之模块csv之CSV文件的写入(基本结构)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #CSV文件的写入(基本结构) import csv #csv文件,是一种常用的文本格式,用以存储表格数据,很 ...

  5. linuxGDB下动态链接库的调试

    (gdb) file <你的exe>(gdb) load <你的so>                #这条应该是可选的 (gdb) dir <so'dir>(gd ...

  6. Ajax Control Toolkit 34个服务器端控件的使用

    摘自:http://blog.csdn.net/yaoshuyun/article/details/2218633 1. Accordion[功能概述] Accordion可以让你设计多个panel  ...

  7. HDUOJ-----3591The trouble of Xiaoqian

    The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  8. iOS10 推送必看 UNNotificationContentExtension

    来源:徐不同(@2016徐小爷) 链接:http://www.jianshu.com/p/45933f5450a4 大伙久等啦~这绝对是最全最详细的 UNNotificationContentExte ...

  9. hadoop集群虚拟机配置

    hadoop_1, hadoop_2, hadoop_3 用户名riluo 密码19841984 查看Linux自带的JDK是否已安装 (卸载centOS已安装的1.4) 安装好的CentOS会自带O ...

  10. gVim中重新载入当前文件

    http://club.topsage.com/thread-2251455-1-1.html有些时候当前打开的文件可能被外部程序不知不觉改变了,这个时候我们就需要重新打开这个文件,或是重读/重载一个 ...