已知time buff=$1100,display_buff=$1104且从$1100开始的SRAM内存单元中存放的数据为:$14,$30,$45,$27,分析程序。 1 put: ldi xl,low(time_buff) 2 ldi xh,high(time_buff) 3 ldi yl,low(display_buff) 4 ldi yhhigh(display_buff) 5 ldi r18,4 6 loop: ld r23,x+ 7 mov r24,r23 8 swap r24 9 andi r24,0x0f 10 andi r23,0x0f 11 st y+,r23 12 st y+,r24 13 dec r18 14 brne loop 15 ret如何把这个汇编程序写出来
时间: 2023-12-04 19:05:50 浏览: 41
下面是这个汇编程序的代码:
```
put:
ldi xl,low(time_buff) ;将time_buff的低8位加载到寄存器xl中
ldi xh,high(time_buff) ;将time_buff的高8位加载到寄存器xh中
ldi yl,low(display_buff) ;将display_buff的低8位加载到寄存器yl中
ldi yh,high(display_buff) ;将display_buff的高8位加载到寄存器yh中
ldi r18,4 ;将寄存器r18设置为4,用于循环计数
loop:
ld r23,x+ ;将SRAM内存单元中的数据加载到寄存器r23中,并使指针x自增1
mov r24,r23 ;将寄存器r23的值复制到寄存器r24中
swap r24 ;交换寄存器r24低4位和高4位的值
andi r24,0x0f ;将寄存器r24与0x0f进行与运算,使其只保留低4位的值
andi r23,0x0f ;将寄存器r23与0x0f进行与运算,使其只保留低4位的值
st y+,r23 ;将寄存器r23的值存储到SRAM内存单元中,并将指针y自增1
st y+,r24 ;将寄存器r24的值存储到SRAM内存单元中,并将指针y自增1
dec r18 ;将寄存器r18的值减1
brne loop ;如果寄存器r18不为0,则跳转到loop标签处
ret ;函数返回
```
相关问题
已知time buff=$1100,display_buff=$1104且从$1100开始的SRAM内存单元中存放的数据为:$14,$30,$45,$27,分析程序。1 看: LDI XL,低(time_buff) 2 LDI XH,高(time_buff) 3 LDI Y+,低(display_buff) 4 LDI YHHIGH(display_buff) 5 LDI R18,4 6 循环: LD R23,X+ 7 MOV R24,R23 8 掉期 R24 9 安迪 R24,0x0f 10 安迪 R23,0x0f 11 ST Y+,R23 12 ST Y+,R24 13 18月 R14 15 BRNE 循环 <> ret如何把这个汇编程序写出来,这里面的低八位是什么
这个汇编程序是用来将SRAM内存中从$1100开始的数据显示在display_buff对应的位置上的。以下是汇编代码:
```
LDI XL, 0x00 ; 将time_buff的低8位设置为0x00
LDI XH, 0x11 ; 将time_buff的高8位设置为0x11
LDI YL, 0x04 ; 将display_buff的低8位设置为0x04
LDI YH, 0x11 ; 将display_buff的高8位设置为0x11
LDI R18, 0x04 ; 将R18寄存器设置为0x04,用于计数
loop:
LD R23, X+ ; 将SRAM中的数据读入R23寄存器
MOV R24, R23 ; 将R23寄存器的值复制到R24寄存器
ROL R24 ; 将R24寄存器的值向左移动一位
ANDI R24, 0x0f ; 将R24寄存器的值与0x0f进行按位与操作
ANDI R23, 0x0f ; 将R23寄存器的值与0x0f进行按位与操作
ST Y+, R23 ; 将R23寄存器的值存储到display_buff对应的位置上
ST Y+, R24 ; 将R24寄存器的值存储到display_buff对应的位置上
DEC R18 ; 将R18寄存器的值减1
BRNE loop ; 如果R18寄存器的值不为0,则跳转到loop标签处
ret ; 返回
```
在这段汇编程序中,低八位指的是地址的低八位。例如,LDI XL, 0x00 表示将time_buff的低八位设置为0x00。因此,程序中访问的地址是0x1100和0x1104。
编程给 SRAM 内存中$0150 开始的连续 100 个字节单元分别赋如下 初值:$01、$02、$03、$04.......$63、$64。
以下是实现上述功能的C语言代码:
```c
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#define SRAM_ADDR 0x20001500
#define BYTE_NUM 100
int main(void)
{
uint8_t *sramAddr = (uint8_t *)SRAM_ADDR;
uint8_t i, data = 0x01;
// 初始化系统时钟为80MHz
SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
SYSCTL_OSC_MAIN);
// 给SRAM内存中的数据赋初值
for (i = 0; i < BYTE_NUM; i++) {
*sramAddr++ = data++;
}
while (1) {
// 循环等待
}
}
```
在main函数中,我们首先初始化系统时钟为80MHz。然后,声明一个指向SRAM内存的指针变量,并使用for循环给SRAM内存中的数据赋初值,从$01一直递增到$64。最后,我们可以加上一个循环等待的语句,使程序保持运行状态。
需要注意的是,在实际应用中,SRAM内存的起始地址和大小可能会有所不同。因此,需要根据实际情况进行相应的修改。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)