Chinaunix首页 | 论坛 | 博客
  • 博客访问: 114545
  • 博文数量: 19
  • 博客积分: 396
  • 博客等级: 一等列兵
  • 技术积分: 156
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-29 09:11
文章分类

全部博文(19)

文章存档

2012年(3)

2011年(16)

分类: 嵌入式

2011-12-01 19:26:25

    ARM指令的立即数的范围为-2^31 ~ 2^31 - 1,不过只能为其中的2^12个数字. ARM用12bit来表示一个立即数的,将12位划分为两部分——高4位和低8位,将低8位补0扩展为32位,然后循环右移X位(X=高4位表示的无符号整数 * 2)。
   
    由于汇编语法要求,标号必须顶格写,否则编译器会报错;与之对应的是汇编指令一定不能顶格写。其中伪操作END表示源代码文件结束,编译器会不理会END后面的代码,这些代码不会被编译到可执行文件中。

    汇编伪操作(directive)不会被编译器编译为机器指令,但汇编伪指令(pseudo-instruction)会。一条pseudo-instructon可以编译为一条或多条的机器指令。而指令(instruction)与一条机器指令对应。ARM汇编伪指令共4条:ldr, adr, adrl, nop。

    ldr伪指令的参数有"="号。ldr有两种用法,一是“ldr 寄存器, =常数”,编译器将其替换成一条合适的指令和存放常数的文字池,另一种是"ldr 寄存器, =标号", 其将标号所代码的地址加载到寄存器中。
    adr伪指令将基于PC相对偏移的地址读取到寄存器。adr伪指令要求标号与adr伪指令必须在同一个段中,而ldr伪指令没有这个要求。
    adrl伪指令被编译器替换成两条合适的指令。其本质是:将偏移量这个立即数拆分为两个可以被12bit表示的立即数,然后用两条add(或sub)指令来替换adrl指令。
    nop主要用于短延时操作。
   
阅读(2838) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

图片MM2011-12-04 02:08:31

立即数是32bit?