主题:S3C2440裸机简单汇编代码扫盲

系统       :ubuntu 16.04
硬件平台:S3C2440 
编译器    :arm-linux-gcc 4.5.1

一、几条重要汇编代码

指令

解释

mov Rn,Rm

把寄存器Rm存入寄存器Rn

ldr Rn,Rm

把寄存器Rm存入寄存器Rn

str Rn,Rm

把寄存器Rn存入寄存器Rm

 stm{条件} Rn{!}  {Rm1,Rm2...Rm3...Rmn}^

 条件:IA(先存后加)

           IB(先加后存)

           DA(先存后减)

           DB(先减后存)

! :决定最后寄存器Rn操作之后的值是否回写寄存器Rn

^ :当列表{Rm1,Rm2...Rm3}中有R15(PC)时,有^符号表示把寄存器SPSR存入寄存器CPSR

按照寄存器序号大小(不用考虑排列顺序而是看下标m1 m2 m3的大小)依次把寄存器Rm1 ....Rmn中的值存入寄存器Rn中。其中高序列寄存器放在Rn高地址,低序列寄存器存放在寄存器Rn低地址。

ldm{条件} Rn{!} {}^ 

解释 同上

按照寄存器序号大小(不用考虑排列顺序而是看下标m1 m2 m3的大小)依次把寄存器Rn中值存入寄存器Rm1 ....Rmn。其中Rn高地址中的值存放在高序列寄存器,寄存器Rn低地址中的值存放在低序列寄存器。

bl address

跳转到地址address处执行,同时链接寄存器lr存放下一条指令。

b address

跳转到地址address处执行。

下面举例说明上述代码:

    1.  mov r0,r1             把r1中的值存入寄存器r0

         mov r0,#4            把立即数4存入寄存器r0

    2. ldr r0,r1                把r1中的值存入寄存器r0

        ldr r0,#4               把立即数4存入寄存器r0

        ldr r0,=#4             把立即数4存入寄存器r0,这是一条伪代码,会被编译器翻译成多条汇编代码,如果立即数大于某个数,上一条代码就不能使用。应该用本条代码。

   3. str r0,r1                把r0中的值存入寄存器r1

   4. stmdb sp! {r11,r15,r14}^  

      假设sp = 4096 ,有如下详细步骤

   

第一步:  sp = sp-4 = 4092 把r15中的值存入sp所指向的内存单元内,也就是4092内存单元

第二步:sp = sp - 4 =4088,把r14中的值存入sp所指向的内存单元内,也就是4088内存单元

第二步:sp = sp - 4 =4084,把r11中的值存入sp所指向的内存单元内,也就是4084内存单元

最后:sp = 4084,且把寄存器spsr存入cpsr中

ldmia sp {r11,r15,r14}  

假设sp = 4084 ,有如下详细步骤

第一步:   把sp所指向的内存单元内的值也就是4084内存单元的值,存入r15中,然后sp = sp+4 = 4088

第二步:把sp所指向的内存单元内的值也就是4088内存单元的值,存入r14中,然后sp = sp+4 = 4092

第二步:把sp所指向的内存单元内的值也就是4092内存单元的值,存入r11中,然后sp = sp+4 = 4096

最后:sp = 4084,没有把寄存器spsr存入cpsr中

二、写裸机代码

     写裸机代码有如下顺序

     1.看原理图,找对应引脚

     2.看芯片手册,看引脚对应寄存器配置

     3.写代码测试

原理图如下:

芯片手册



 

代码测试:

/*
*点亮led:GPF4
*
* 配置GPF4为输出引脚
* 设置GPF4输出为高电平 
* 0x100 -> 0x5600 0050
**/
.text
.global _start
_start:

LDR R0,=0X56000050
MOV R1,#0X100
STR R1,[R0]

LDR R0,=0X56000054
MOV R1,#0
STR R1,[R0]

WAIT:
 B WAIT

下面来观测一下反汇编语句:

Disassembly of section .text:

00000000 <_start>:                                                                            代码解释:
   0:   e59f0014        ldr     r0, [pc, #20]   ; 1c <WAIT+0x4>          把地址1c处的数据(56000050)存入r0中
   4:   e3a01c01        mov     r1, #256        ; 0x100                       把立即数256存入r1中
   8:   e5801000        str     r1, [r0]                                                把r1中的数据存入地址56000050指向的内存中
   c:   e59f000c        ldr     r0, [pc, #12]   ; 20 <WAIT+0x8>          把地址20处的数据(56000054)存入r0中
  10:   e3a01000        mov     r1, #0                                             把立即数0存入r1中
  14:   e5801000        str     r1, [r0]                                               把r1中的sh存入地址56000050指向的内存中

00000018 <WAIT>:
  18:   eafffffe        b       18 <WAIT>
  1c:   56000050        undefined instruction 0x56000050
  20:   56000054        undefined instruction 0x56000054

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值