【嵌入式】 启动代码startup.s 及题目

stack_size EQU 0X200 ;设置栈大小
;define stack 定义堆栈区,可读写
AREA mystack,NOINIT,READWRITE ;DATA不算是错误 AREA不能顶格写
stack_start
SPACE stack_size ; 分配堆栈空间
stack_top
;define vectors ; 定义中断向量表,段名必须是RESET(大写),中断向量表只读,有两项(1、
2)
AREA RESET,DATA,READONLY
vectors
DCD stack_top ;1-stack_top 栈顶指针
DCD code_start ;2-code_start 代码开始地址
vectors_end
;PRESERVE8
;define data
AREA mydata,DATA,READWRITE ;定义数据区域,可读写
data_start
; 在这里定义数据
;define code ;定义代码区域,只读,按照 3 字节对齐
AREA mycode,CODE,READONLY,ALIGN=3
code_start
;这里是代码的起始位置
B .
END
题目 1 :用汇编语言实现一个函数,判断 a 是否为 b 的倍数,如果 a b 的倍数,则返回 1 ;否则返回 0
AREA mystack,NOINIT,READWRITE
stack_start
SPACE 0x200
stack_end
AREA RESET,DATA,READONLY
vectors
DCD stack_end
DCD test_start
vectors_end
AREA mydata,DATA,RENDWRITE
data_start
AREA mycode,CODE,READONLY,ALIGN=3
test_start
test_is_multi PROC
MOV R0,#9 ;a
MOV R1,#3 ;b
BL is_multi
B .
ENDP
is_multi PROC
PUSH {R2-R3,LR}
MOV R2,R0 ;r2--a
MOV R3,R1 ;r3--i
MOV R0,#0
loop
CMP R2,R1 ;a b
;<
BLT loop_end ;END
;>=
;(1)==
MOVEQ R0,#1
BEQ loop_end ;END
;(2)>
ADD R1,R1,R3 ;b=b+i
B loop
loop_end
POP {R2-R3,PC}
ENDP
B .
END
题目 2 :用汇编语言实现一个函数,判断一个数 x 是否为质数,返回 1 时是质数, 0 不是。
stack_size EQU 0X200
;define stack AREA不能顶格写
AREA mystack,NOINIT,READWRITE ;DATA不算是错误 堆栈是可读写
stack_start
SPACE stack_size
stack_top
;define vectors ;段名必须是RESET(大写),中断向量表只读,有两项(1、2)
AREA RESET,DATA,READONLY
vectors
DCD stack_top ;1-stack_top 栈顶指针
DCD code_start ;2-code_start 代码开始地址
vectors_end
;PRESERVE8
;define data
AREA mydata,DATA,READWRITE
data_start
SPACE 4
;define code
AREA mycode,CODE,READONLY,ALIGN=3
code_start PROC
MOV R0,#4 ;m-R0
BL Is_prime
LDR R1,=data_start
STR R0,[R1] ;R0---data_start
B .
ENDP
Is_prime PROC
PUSH {R1-R3,R5,LR}
MOV R2,R0 ;R2-m-R0
MOV R5,#1 ;1是质数-R5
MOV R3,#2 ;i-2-R3
_loop_m
CMP R3,R2 ;i--m
BGE _loop_m_end ;i>=m GE-end
MOV R0,R2 ;(R0)a-m(R2)
MOV R1,R3 ;(R1)b-i(R3)
BL is_multi
CMP R0,#1 ;if(1 是 multi)
MOVEQ R5,#0 ;R0==1--return 0 不是质数
BEQ _loop_m_end
ADD R3,R3,#1 ;i++
B _loop_m
_loop_m_end
MOV R0,R5
POP {R1-R3,R5,PC}
ENDP
is_multi PROC
PUSH {R2-R3,LR}
MOV R2,R0 ;r2--a 释放r0
MOV R3,R1 ;r3--i
MOV R0,#0
loop
CMP R2,R1 ;a b
;a<b
BLT loop_end ;END
;a>=b
;(1)==
MOVEQ R0,#1
BEQ loop_end ;END
;(2)>
ADD R1,R1,R3 ;b=b+i
B loop
loop_end
POP {R2-R3,PC}
ENDP
B .
END

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值