422 lines
8.3 KiB
NASM
422 lines
8.3 KiB
NASM
.text
|
|
addi sp, zero, 2000 #内存堆栈初始化
|
|
|
|
#############################################################
|
|
#走马灯测?,测试addi,andi,slli,srli,srai,or,ori,nor,ecall LED按走马灯方式来回显示数据
|
|
#############################################################
|
|
|
|
.text
|
|
START:
|
|
|
|
addi s0,zero,1
|
|
slli s3, s0, 31 # s3=0x80000000
|
|
srai s3, s3, 31 # s3=0xFFFFFFFF
|
|
add s0,zero,zero # s0=0
|
|
addi s2,zero,12
|
|
|
|
addi s6,zero,8 #走马灯计数
|
|
zmd_loop:
|
|
|
|
addi s0, s0, 1 #计算下一个走马灯的数
|
|
andi s0, s0, 15
|
|
|
|
#######################################
|
|
addi t0,zero,8
|
|
addi t1,zero,1
|
|
left:
|
|
|
|
slli s3, s3, 4 #走马灯左移
|
|
or s3, s3, s0
|
|
|
|
add a0,zero,s3 # display s3
|
|
addi a7,zero,34 # system call for LED display
|
|
ecall # display
|
|
|
|
sub t0,t0,t1
|
|
bne t0,zero,left
|
|
#######################################
|
|
|
|
addi s0, s0, 1 #计算下一个走马灯的数
|
|
addi t6,zero,15
|
|
and s0, s0, t6
|
|
slli s0, s0, 28
|
|
|
|
addi t0,zero,8
|
|
addi t1,zero,1
|
|
|
|
zmd_right:
|
|
|
|
srli s3, s3, 4 #走马灯右移
|
|
or s3, s3, s0
|
|
|
|
add a0,zero,s3 # display s3
|
|
addi a7,zero,34 # system call for LED display
|
|
ecall # display
|
|
|
|
sub t0,t0,t1
|
|
bne t0,zero,zmd_right
|
|
srli s0, s0, 28
|
|
#######################################
|
|
|
|
sub s6,s6,t1
|
|
beq s6,zero, exit
|
|
j zmd_loop
|
|
|
|
exit:
|
|
|
|
add t0,zero,zero
|
|
xori t0,t0,-1 #test nor ori
|
|
slli t0,t0,16
|
|
ori t0,t0,-1
|
|
|
|
add a0,zero,t0 # display t0
|
|
addi a7,zero,34 # system call for LED display
|
|
ecall # display
|
|
|
|
j START # loop forever
|
|
|
|
|
|
#InteruptProgram1:
|
|
#############################################################################################
|
|
# exceptoin 1
|
|
# 使用?s6? s5?s4?s3?s0?a0?a7
|
|
#############################################################################################
|
|
|
|
################# 保护现场
|
|
InteruptProgram1:
|
|
sw t0, 0(sp) #保护t0现场
|
|
addi sp, sp, 4
|
|
sw t3, 0(sp) #保护t3现场
|
|
addi sp, sp, 4
|
|
sw s1, 0(sp) #保护s1现场
|
|
addi sp, sp, 4
|
|
sw a7, 0(sp)
|
|
addi sp, sp, 4
|
|
sw a0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s3, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s4, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s5, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s6, 0(sp)
|
|
addi sp, sp, 4
|
|
|
|
csrrsi s6,0x41,0 #s6=uepc
|
|
sw s6, 0(sp) #uepc压栈保护
|
|
addi sp, sp, 4
|
|
|
|
|
|
################# 开中断
|
|
csrrsi zero,0x4,1 #ustatus.MIE=1
|
|
|
|
################# DIVU测试
|
|
addi t0,zero,2 # /2
|
|
addi s1,zero, 0x11
|
|
slli s1,s1,8
|
|
addi s1,s1,0x11
|
|
slli s1,s1,16
|
|
|
|
add a0,zero,s1
|
|
addi a7,zero,34
|
|
ecall
|
|
addi t3,zero,28 #ѭ������
|
|
|
|
divu_branch:
|
|
divu s1,s1,t0 #����ָ��
|
|
add a0,zero,s1
|
|
addi a7,zero,34
|
|
ecall #�����ǰֵ
|
|
addi t3,t3, -1
|
|
bne t3,zero,divu_branch #ѭ��
|
|
|
|
|
|
addi a7,zero,10
|
|
|
|
################# 中断服务
|
|
addi s6,zero,1 #中断?1,2,3 不同中断号显示值不一样
|
|
addi s4,zero,3 #循环次数初始值
|
|
addi s5,zero,1 #计数器累加值
|
|
|
|
IntLoop1:
|
|
add s0,zero,s6
|
|
|
|
IntLeftShift1:
|
|
|
|
slli s0, s0, 4
|
|
or s3,s0,s4
|
|
add a0,zero,s3 #display s0
|
|
addi a7,zero,34 # display hex
|
|
ecall
|
|
|
|
bne s0, zero, IntLeftShift1
|
|
sub s4,s4,s5 #循环次数递减
|
|
bne s4, zero, IntLoop1
|
|
|
|
################# 关中断
|
|
csrrci zero,0x4,1 #ustatus.MIE=0
|
|
|
|
################# 恢复现场
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
|
|
csrrw zero,0x41,s6 #uepc=s6
|
|
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s5, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s4, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s3, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s0, 0(sp)
|
|
addi sp, sp, -4
|
|
lw a0, 0(sp)
|
|
addi sp, sp, -4
|
|
lw a7, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s1, 0(sp) #恢复s1现场
|
|
addi sp, sp, -4
|
|
lw t3, 0(sp) #恢复t3现场
|
|
addi sp, sp, -4
|
|
lw t0, 0(sp) #恢复t0现场
|
|
|
|
################ 中断返回
|
|
uret #同步开中断,uepc-->pc
|
|
|
|
|
|
#InteruptProgram2:
|
|
#############################################################################################
|
|
# exceptoin 2
|
|
# 使用?s6? s5?s4?s3?s0?a0?a7
|
|
#############################################################################################
|
|
|
|
################# 保护现场
|
|
InteruptProgram2:
|
|
sw t1, 0(sp) #保护t1现场
|
|
addi sp, sp, 4
|
|
sw t3, 0(sp) #保护t3现场
|
|
addi sp, sp, 4
|
|
sw s1, 0(sp) #保护s1现场
|
|
addi sp, sp, 4
|
|
sw s2, 0(sp) #保护s2现场
|
|
addi sp, sp, 4
|
|
sw a7, 0(sp)
|
|
addi sp, sp, 4
|
|
sw a0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s3, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s4, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s5, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s6, 0(sp)
|
|
addi sp, sp, 4
|
|
|
|
csrrsi s6,0x41,0 #s6=uepc
|
|
sw s6, 0(sp) #uepc压栈保护
|
|
addi sp, sp, 4
|
|
|
|
|
|
################# 开中断
|
|
csrrsi zero,0x4,1 #ustatus.MIE=1
|
|
|
|
################# BLT测试
|
|
addi s1,zero,-15 #初始值
|
|
blt_branch:
|
|
add a0,zero,s1
|
|
addi a7,zero,34
|
|
ecall #输出当前值
|
|
addi s1,s1,1
|
|
blt s1,zero,blt_branch #当前指令
|
|
|
|
|
|
addi a7,zero,10
|
|
|
|
################# 中断服务
|
|
|
|
addi s6,zero,2 #中断?1,2,3 不同中断号显示值不一样
|
|
|
|
addi s4,zero,3 #循环次数初始值
|
|
addi s5,zero,1 #计数器累加值
|
|
|
|
IntLoop2:
|
|
add s0,zero,s6
|
|
|
|
IntLeftShift2:
|
|
|
|
|
|
slli s0, s0, 4
|
|
or s3,s0,s4
|
|
add a0,zero,s3 #display s0
|
|
addi a7,zero,34 # display hex
|
|
ecall
|
|
|
|
bne s0, zero, IntLeftShift2
|
|
sub s4,s4,s5 #循环次数递减
|
|
bne s4, zero, IntLoop2
|
|
|
|
################# 关中断
|
|
csrrci zero,0x4,1 #ustatus.MIE=0
|
|
|
|
################# 恢复现场
|
|
|
|
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
csrrw zero,0x41,s6 #uepc=s6
|
|
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s5, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s4, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s3, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s0, 0(sp) #恢复s0现场
|
|
addi sp, sp, -4
|
|
lw a0, 0(sp)
|
|
addi sp, sp, -4
|
|
lw a7, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s2, 0(sp) #恢复s2现场
|
|
addi sp, sp, -4
|
|
lw s1, 0(sp) #恢复s1现场
|
|
addi sp, sp, -4
|
|
lw t3, 0(sp) #恢复t3现场
|
|
addi sp, sp, -4
|
|
lw t1, 0(sp) #恢复t1现场
|
|
|
|
################ 中断返回
|
|
uret #同步开中断,uepc-->pc
|
|
|
|
|
|
#InteruptProgram3:
|
|
#############################################################################################
|
|
# exceptoin 3
|
|
# 使用?s6? s5?s4?s3?s0?a0?a7
|
|
#############################################################################################
|
|
|
|
|
|
################# 保护现场
|
|
InteruptProgram3:
|
|
sw s1, 0(sp) #保护s1现场
|
|
addi sp, sp, 4
|
|
sw a7, 0(sp)
|
|
addi sp, sp, 4
|
|
sw a0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s3, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s4, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s5, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s6, 0(sp)
|
|
addi sp, sp, 4
|
|
|
|
csrrsi s6,0x41,0 #s6=uepc
|
|
sw s6, 0(sp) #uepc压栈保护
|
|
addi sp, sp, 4
|
|
|
|
|
|
################# 开中断
|
|
csrrsi zero,0x4,1 #ustatus.MIE=1
|
|
|
|
################# SB测试
|
|
addi t1,zero,0 #init_addr
|
|
addi t3,zero,32 #counter
|
|
|
|
#sb写入 01,02,03,04
|
|
addi s1,zero, 0x00 #
|
|
addi s2,zero, 0x01 #
|
|
|
|
sb_store:
|
|
sb s1,(t1)
|
|
add a0,zero,s1
|
|
addi a7,zero,34 # system call for print
|
|
ecall # print
|
|
|
|
add s1,s1,s2 #data +1
|
|
addi t1,t1,1 # addr ++
|
|
addi t3,t3,-1 #counter
|
|
bne t3,zero,sb_store
|
|
|
|
addi t3,zero,8
|
|
addi t1,zero,0 # addr
|
|
sb_branch:
|
|
lw s1,(t1) #读出数据
|
|
add a0,zero,s1
|
|
addi a7,zero,34 # system call for print
|
|
ecall # print
|
|
addi t1,t1,4
|
|
addi t3,t3, -1
|
|
bne t3,zero,sb_branch
|
|
|
|
addi a7,zero,10 # system call for exit
|
|
|
|
|
|
################# 中断服务
|
|
addi s6,zero,3 #中断?1,2,3 不同中断号显示值不一样
|
|
addi s4,zero,3 #循环次数初始值
|
|
addi s5,zero,1 #计数器累加值
|
|
|
|
IntLoop3:
|
|
add s0,zero,s6
|
|
|
|
IntLeftShift3:
|
|
|
|
slli s0, s0, 4
|
|
or s3,s0,s4
|
|
add a0,zero,s3 #display s0
|
|
addi a7,zero,34 # display hex
|
|
ecall
|
|
|
|
bne s0, zero, IntLeftShift3
|
|
sub s4,s4,s5 #循环次数递减
|
|
bne s4, zero, IntLoop3
|
|
|
|
################# 关中断
|
|
csrrci zero,0x4,1 #ustatus.MIE=0
|
|
|
|
|
|
|
|
################# 恢复现场
|
|
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
csrrw zero,0x41,s6 #uepc=s6
|
|
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s5, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s4, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s3, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s0, 0(sp)
|
|
addi sp, sp, -4
|
|
lw a0, 0(sp)
|
|
addi sp, sp, -4
|
|
lw a7, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s1, 0(sp) #恢复s1现场
|
|
|
|
################ 中断返回
|
|
uret #同步开中断,uepc-->pc
|
|
|