arm汇编指令集整理


在学习汇编的时候,我们常常会被要去记忆各种各样的指令集所烦恼,其实在开发过程中,我们需要使用的指令就那么几条,下面是我们在使用中的积累:

一、常用汇编指令

1. b, bl  (相对跳转指令)

2. mov  (数据传输, ldr地址读取伪指令)        

<span style="font-family:SimSun;">mov r1, r2               ;将r2里面的值复制到r1中

mov r1, #4096            ;常数必须用立即数表示</span>

当不知道数是否是"立即数"来表示时,可以使用ldr来赋值。ldr是伪指令, 由编译器会把它扩展成真正的指令。

如果是立即数用mov指令替换,否则 编译时将改常数保存在某个位置,使用内存读取指令把它读出来。

 ldr 本意为大范围的地址读取伪指令

<span style="font-family:SimSun;">       ldr r1, =4096    ; 把常量赋给寄存器
       ldr r2, =label   ; 获取代码的绝对地址
label:
       ...</span>

    movs : 数据传输,并且影响z条件标志位,如果目标寄存器为0,则z条件标志位为1,

               接下来beq就成立,如下:

<span style="font-family:SimSun;">        movs r10, r5                     ; invalid processor (r5=0)?
        beq  error_p                   ; yes, error 'p'
error_p:
        ...
</span>

3.ldr, str, stm, ldm

3.1 ldr, str

         ldr的第二个参数前面是"="时,表示伪指令,否则为内存访问指令        

<span style="font-family:SimSun;">ldr r0, [r1]         //从r1中的存储器地址处读取一个字,然后放入到r0中
str r0, [r1]         //把r0的值写入寄存器r1所指向的地址中。</span>

3.2  stm ldm(多寄存器加载/存储指令)

         ‘!’ : 表示指令执行后寄存器被更新。

                stmia r0!,  {r2-r7}  //将r2-r7的数据存储到r0指向的地址,r0值更新

                ldmia r0!,  {r2-r7}  //加载r0指向的地址上的多字数据,保存到r2-r7中,r0的值更新。

          IA  执行后增加  (increase after), 这时对应的{r2-r7},赋值的顺序是r2~r7

          IB  执行前增加  (increase before)

          DA 执行后减少 (decrease after), 这时对应的{r2-r7}, 赋值的顺序是r7-r2

          DB 执行前减少 (decrease before)

3.3 小结

         ldm ldr 都是往寄存器里面load,ldm是内存往寄存器组,ldr是寄存器往寄存器。

         stm str 都是

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
;******************************************************** ; Name : 44BINIT.S * ; Modify : hugang, [email protected] * ; Description: * ; C start up codes * ; Configure memory, Initialize ISR ,stacks * ; Initialize C-variables * ; Fill zeros into zero-initialized C-variables * ;******************************************************** GET ..\inc\option.inc GET ..\inc\memcfg.inc ;**************************************************************************** ;存储器空间 ;GCS6 64M 16bit(8MB) DRAM/SDRAM(0xc000000-0xc7fffff) ;APP RAM=0xc000000~0xc7effff ;44BMON RAM=0xc7f0000-0xc7fffff ;STACK =0xc7ffa00 ;**************************************************************************** ;中断控制预定义 INTPND EQU 0x01e00004 INTMOD EQU 0x01e00008 INTMSK EQU 0x01e0000c I_ISPR EQU 0x01e00020 I_CMST EQU 0x01e0001c I_PMST EQU 0x01e00014 ;**************************************************************************** ;看门狗定时器预定义 WTCON EQU 0x01d30000 ;**************************************************************************** ;系统时钟预定义 PLLCON EQU 0x01d80000 CLKCON EQU 0x01d80004 LOCKTIME EQU 0x01d8000c ;**************************************************************************** ;存储器控制预定义 REFRESH EQU 0x01c80024 ;**************************************************************************** ;BDMA目的寄存器 BDIDES0 EQU 0x1f80008 BDIDES1 EQU 0x1f80028 ;**************************************************************************** ;预定义常数(常量) USERMODE EQU 0x10 FIQMODE EQU 0x11 IRQMODE EQU 0x12 SVCMODE EQU 0x13 ABORTMODE EQU 0x17 UNDEFMODE EQU 0x1b MODEMASK EQU 0x1f NOINT EQU 0xc0 ;**************************************************************************** ;检查是否使用tasm.exe进行编译 GBLL THUMBCODE [ {CONFIG} = 16 THUMBCODE SETL {TRUE} CODE32 | THUMBCODE SETL {FALSE} ] [ THUMBCODE CODE32 ;for start-up code for Thumb mode ] ;;;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值