代码分析-复习1

.globl _start  
_start:  
     设置GPJ2CON的bit[0:15],配置GPJ2_0/1/2/3引脚为输出功能
    // 设置GPJ0CON的bit[12:23],配置GPJ0_3/4/5引脚为输出功能
    ldr r1, =0xE0200240                     
    ldr r0, =0x00111000
    str r0, [r1]
    mov r2, #0x1000
led_blink:
     设置GPJ2DAT的bit[0:3],使GPJ2_0/1/2/3引脚输出低电平,LED亮
    // 设置GPJ0DAT的bit[3:5],使GPJ0_3/4/5引脚输出低电平,LED亮
    ldr r1, =0xE0200244                     
    mov r0, #0
    str r0, [r1]
    // 延时
        bl delay                    
     设置GPJ2DAT的bit[0:3],使GPJ2_0/1/2/3引脚输出高电平,LED灭
    // 设置GPJ0DAT的bit[3:5],使GPJ0_3/4/5引脚输出高电平,LED灭
    ldr r1, =0xE0200244                     
    mov r0, #0x38
    str r0, [r1]

    // 延时
    bl delay    

    sub r2, r2, #1
    cmp r2,#0
    bne led_blink
halt:
    b halt


delay:
    mov r0, #0x900000
delay_loop:
    cmp r0, #0
    sub r0, r0, #1
    bne delay_loop
    mov pc, lr

1.理解 .globl _start 摘自 http://blog.chinaunix.net/uid-20548989-id-1667484.html
.globl指示告诉汇编器,_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号(在第 5.1 节 “目标文件”详细解释)。_start就像C程序的main函数一样特殊,是整个程序的入口,链接器在链接时会查找目标文件中的_start符号代表的地址,把它设置为整个程序的入口地址,所以每个汇编程序都要提供一个_start符号并且用.globl声明。如果一个符号没有用.globl声明,就表示这个符号不会被链接器用到。符号在汇编语言中代表一个内存地址,所以无论是函数还是变量都会被替换为地址的。即汇编程序经过汇编器的处理之后,所有的符号都被替换成它所代表的地址值
3.熟练掌汇编编写的基本流程
明确要实现的功能-查看硬件数据手册,找出与功能相关的硬件设备
-进行相关操作-完成功能实现。
例如:实现亮灯程序
1>.根据开发板 硬件手册GPJ0_3 GPJ0_4 GPJ0_5 PWMTOUT1 这几个端口连接有LED灯
2>.找出GPJ0_3 …..的地址
3>.找出端口的控制方式 (相关寄存器)
P115 ->Normal registers (For example, GPA0CON, GPA0DAT, GPA0PUD, and GPA0DRV) are the former, and power down registers (For example, GPA0CONPDN, and GPA0PUDPDN) are the latter.
P172->There are six control registers, namely, GPJ0CON, GPJ0DAT, GPJ0PUD, GPJ0DRV, GPJ0CONPDN and GPJ0PUDPDN in the Port Group GPJ0 Control Registers.
实现原理:要实现小灯的控制,需要配置端口为输出模式,由硬件电路图知LED低电平触发 ,因此相应的位应写1.
相关寄存器:
*GPJ0CON寄存器
1. GPJ0CON[5:3] 12-23位 控制GPJ0_3 GPJ0_4 GPJ0_5
配置方式: 0 输入
1输出

2.GPJ0DAT[7:0] When the port is configured as input port, the corresponding bit is the pin state. When the port is configured as output port, the pin state is the same as the corresponding bit. When the port is configured as functional pin, the undefined value will be read.
编程实现过程:
1.配置GPJ0CON[5:3]为输出 GPJ0CON 0xE020_0240
2.配置GPJ0DAT[7:0]为0 GPJ0DAT 0xE020_0244
3.可加上延时闪烁,以表示效果
编写代码(模仿):

.globl _start
_start:
    ldr r1, =0xE0200240
    ldr r0, =0xFFFFFFFF
    str r0, [r1]

led_blink:
    /*亮灯*/
    ldr r1, =0xE0200244
    ldr r0, =0x0
    str r0, [r1]
    bl delay
    /*灭灯*/
        ldr r1, =0xE0200244
    ldr r0, =0x1
    str r0, [r1]
    bl delay
halt:
    b halt

delay:
    mov r0, #0x9000000
delay_loop:
    cmp r0, #0
    sub r0, r0, #1
    bne delay_loop
    mov pc, lr    //寄存器寻址 

delay://不会写 这里面用的寄存器和上面的能够重复么 理论上是可以的
delay:
mov r0, #0x900000
delay_loop:
cmp r0, #0
sub r0, r0, #1
bne delay_loop
mov pc, lr

4.读懂汇编 语言

1>详情可查看 https://blog.csdn.net/dahailantian1/article/details/78584850
算术逻辑运算指令:(ADD、ADC、SUB、SBC、RSB、RSC、AND、ORR、EOR、BIC)完成常 用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中。
当这些指令后面加了S(如ADDS时),指令同时更新CPSR中的相应条件标志位。
比较指令 (CMP、CMN、TST、TEQ)不保存运算结果,只更新CPSR中相应的条件标志位。
它们总是会影响CPSR条件标志位.
因此对代码进行分析`

delay:
mov r0, #0x900000
delay_loop:
cmp r0, #0 //cmp 比较指令直接影响CPSR Z标志位 Z=1表示运算的结果为零,Z=0表示运算的结果非零。
sub r0, r0, #1 //sub不影响标志位
bne delay_loop //bne 对Z标志位进行判断,如果不相等跳转至delay_loop
mov pc, lr`

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值