没有合适的资源?快使用搜索试试~ 我知道了~
嵌入式系统编程题汇编.docx
2 下载量 93 浏览量
2022-12-03
11:17:18
上传
评论
收藏 76KB DOCX 举报
温馨提示
试读
12页
嵌入式系统编程题汇编.docx
资源推荐
资源详情
资源评论
嵌入式系统 编程题汇编(带答案)
.一。从一数到十
COUNT EQU 0x30003100 ;定义变量 COUNT 的基地址
AREA Example1,CODE,READONLY;声明代码段 Example1 为只读
ENTRY ;标识程序入口
CODE32 ;声明 32 位 ARM 指令
START LDR R1,=COUNT ;将 0X30003100 赋给 R1
MOV R0,#0 ;执行 R0=0
STR R0,[R1] ;存储 R0 寄存器的数据到 R1 指向的存
储单元
LOOP LDR R1,=COUNT ;将 0X30003100 赋给 R1
LDR R0,[R1] ;将 R1 中的数值作为地址,取出此地址中的数据保存
到 R0 中
ADD R0,R0,#1 ;执行 R0=R0+1
CMP R0,#10 ;将 R0 与 10 进行比较
MOVHS R0,#0 ;若 R0 大于等于 10,则 R0=0
STR R0,[R1] ;存储 R0 寄存器的数据到 R1 指向的地
址单元
B LOOP ;跳转到 LOOP
END ;汇编文件结束
二,9 的 8 次幂
X EQU 9 ;初始化 X 为 9
n EQU 8 ;初始化 N 为 8
AREA Example3,CODE,READONLY ;生明代码段 Example3 为只读
ENTRY ;标识程序入口路
CODE32 ;声明 32 位 ARM 指令
START LDR S P,=0x30003F00 ;把 0x30003F00 赋给 SP
(R13)
LDR R0,=X ;把 9 赋给 R0
LDR R1,=n ;把 8 赋给 R1
BL POW ;跳转到 POW,并把下一条指令地址存入到 R14
中
HALT B HALT ;等待跳转
POW STMFD SP!,{R1-R12,LR} ;将 R1-R12 入栈,满递减堆栈
MOVS R2,R1 ;将 R1 赋给 R2,并影响标志位
MOVEQ R0,#1 ;若 Z=1,则 R0=1
BEQ POW_END ;若 Z=1,跳转到 POW_END
MOV R1,R0 ;将 R0 中值赋给 R1
SUB R2,R2,#1 ;将 R2-1 的只赋给 R2
POW_L1 BL DO_MUL ;跳转到 DO-MUL,并把下一条指令地址存入 R14 中
SUBS R2,R2,#1 ;将 R2-1 的值赋给 R2,并影响标志
位
BNE POW_L1 ;若 Z=0,跳转到 POW_L1
POW_END LDMFD SP!,{R1-R12,PC} ;数据出栈,存入到 R1-R12,PC 中
DO_MUL MUL R0,R1,R0 ;把 R1*R0 的值赋给 R0
MOV PC,LR ;LR 中的值赋给 PC
END ;汇编结束
三:从一一直加到一百
程序清单(一) C 语言实验参考程序
#define uint8 unsigned char ;定义一个无符号字符常量uint8
#define uint32 unsigned int ;定义一个无符号整形常量unint32
#define N 100 ;定义一个常量N=100(宏定义,100用N代替)
uint32 sum; ;定义sum为无符号整型常量(声明一个unsigned int型的变量sum)
void Main(void) ;主函数
{uint32 i; ;定义无符号整型常量i(声明一个unsigned int型的变量i)
sum=0; ;sum初始值为0
for(i=0;i<=N;i++) ;i在N自增加1(i从0开始,i<=N时循环成立)
{sum+=i;} ;把sum+i赋给sum
while(1); ;为真循环
}
程序清单(二) 简单的启动代码
IMPORT |Image$$RO$$Limit | ;R0输出段存储区域界限
IMPORT |Image$$RW$$Base | ;RW输出段运行时起始地址
IMPORT |Image$$ZI$$Base | ;ZI输出段运行时起始地址
IMPORT |Image$$ZI$$Limit | ;ZI输出段存储区域界限
IMPORT Main ;主函数
AREA Start,CODE,READONLY ;声明代码段start,为只读
ENTRY ;程序入口
CODE32 ;声明32位ARM指令
Reset LDR SP,=0x40003f00 ;将0x40003f00赋给SP
LDR R0,=|Image$$RO$$Limit| ;将R0输出段存储区域界限赋给R0
LDR R1,=|Image$$RW$$Base | ;将RW输出段运行时起始地址赋给R1
LDR R3,=|Image$$ZI$$Base | ;将ZI输出段运行时起始地址赋给R3
CMP R0,R1 ;比较R0和R1,相等Z=1,反之Z=0
BEQ LOOP1 ;若Z=1,则跳到LOOP1
LOOP0 CMP R1,R3 ;比较R1和R3,若R1<R3,C=0
LDRCC R2,[R0],#4 ;若C=0,读取R0地址单元容并且存入R2,且
R0=R0+4
STRCC R2,[R1],#4 ;若C=0,读取R2中的数据存入R1,且
R1=R1+4
BCC LOOP0 ;若C=0,跳转到LOOP0
LOOP1 LDR R1,=|Image$$ZI$$Limit| ;将ZI输出段存储区域赋给R1
MOV R2,#0 ;把0赋给R2
LOOP2 CMP R3,R1 ;比较R1和R3,若R1<R3,C=0
STRCC R2,[R3],#4 ;若C=0,将R2中数据保存到存单元R3中,且
R3=R3+4
BCC LOOP2 ;若C=0,跳转到LOOP2
B Main ;跳转到主程序
END ;汇编结束
实验四
程序清单(一) C 语言调用汇编的参考程序
#define uint8 unsigned char ;定义一个无符号字符常量 uint8
#define uint32 unsigned int ;定义一个无符号整型常量.uint32
extern uint32 Add(uint32 x,uint32 y); //声明子程序 Add 为一个无符号整型常
量,它为 2 个无符号整型常量 x,y 的和
uint32 sum; ;定义 sum 为无符号整型常量
void Main(void) ;无返回主程序
{sum=Add(555,168); ;sum 等于 555+168
while(1); ;为真循环
}
剩余11页未读,继续阅读
资源评论
yyyyyyhhh222
- 粉丝: 415
- 资源: 6万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功