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主要用于短延时操作。
阅读(2883) | 评论(1) | 转发(1) |