.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