342 lines
8.9 KiB
NASM
342 lines
8.9 KiB
NASM
#############################################################
|
||
#测试j,jal,jr指令,如需要可分开测试,执行正常应该是15个周期 revise date 2015/12/17 tiger
|
||
#############################################################
|
||
.text
|
||
addi $s1,$zero, 1 #测试j,jal,jr指令,如需要可分开测试,执行正常应该是15个周期
|
||
j jmp_next1
|
||
addi $s1,$zero, 1
|
||
addi $s2,$zero, 2
|
||
addi $s3,$zero, 3
|
||
jmp_next1:
|
||
j jmp_next2
|
||
addi $s1,$zero, 1
|
||
addi $s2,$zero, 2
|
||
addi $s3,$zero, 3
|
||
jmp_next2:
|
||
j jmp_next3
|
||
addi $s1,$zero, 1
|
||
addi $s2,$zero, 2
|
||
addi $s3,$zero, 3
|
||
jmp_next3:
|
||
j jmp_next4
|
||
addi $s1,$zero, 1
|
||
addi $s2,$zero, 2
|
||
addi $s3,$zero, 3
|
||
jmp_next4:jal jmp_count
|
||
|
||
######################################
|
||
|
||
|
||
#移位测试 需要支持超addi,sll,add,syscall,srl,sll,sra,beq,j,syscall revise date:2015/12/16 tiger
|
||
|
||
.text
|
||
addi $s0,$zero,1 #简单移位,循环测试,0号区域显示的是初始值1左移1位重复15次的值,1号区域是累加值
|
||
addi $s1,$zero,1
|
||
sll $s1, $s1, 31 #逻辑左移31位 $s1=0x80000000
|
||
|
||
|
||
###################################################################
|
||
# 逻辑右移测试
|
||
# 显示区域依次显示0x80000000 0x20000000 0x08000000 0x02000000 0x00800000 0x00200000 0x00080000 0x00020000 0x00008000 0x00002000 0x00000800 0x00000200 0x00000080 0x00000020 0x00000008 0x00000002 0x00000000
|
||
###################################################################
|
||
LogicalRightShift: #逻辑右移测试,将最高位1逐位向右右移直至结果为零
|
||
|
||
add $a0,$0,$s1 #display $s1 #逻辑右移测试,将最高位1逐位向右右移直至结果为零
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
srl $s1, $s1, 2
|
||
beq $s1, $zero, shift_next1
|
||
j LogicalRightShift
|
||
|
||
shift_next1:
|
||
|
||
add $a0,$0,$s1 #display $s1
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
|
||
###################################################################
|
||
# 逻辑左移测试
|
||
# 显示区域依次显示0x00000004 0x00000010 0x00000040 0x00000100 0x00000400 0x00001000 0x00004000 0x00010000 0x00040000 0x00100000 0x00400000 0x01000000 0x04000000 0x10000000 0x40000000 0x00000000
|
||
###################################################################
|
||
|
||
addi $s1,$zero, 1 # 逻辑左移测试
|
||
LogicalLeftShift: #逻辑左移测试,将最低位1逐位向左移直至结果为零
|
||
sll $s1, $s1, 2
|
||
|
||
add $a0,$0,$s1 #display $s1
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
beq $s1, $zero, ArithRightShift
|
||
j LogicalLeftShift
|
||
|
||
|
||
###################################################################
|
||
# 算术右移测试
|
||
# 显示区域依次显示0x80000000 0xf0000000 0xff000000 0xfff00000 0xffff0000 0xfffff000 0xffffff00 0xfffffff0 0xffffffff
|
||
###################################################################
|
||
ArithRightShift: #算术右移测试,#算术移位测试,80000000算术右移,依次显示为F0000000,FF000000,FFF00000,FFFF0000直至FFFFFFFF
|
||
|
||
addi $s1,$zero,1 # 算术右移测试
|
||
sll $s1, $s1, 31 #逻辑左移31位 $s1=0x80000000
|
||
|
||
add $a0,$0,$s1 #display $s1
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
sra $s1, $s1, 3 #$s1=0X80000000-->0XF0000000
|
||
|
||
add $a0,$0,$s1 #display $s1
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
|
||
sra $s1, $s1, 4 #0XF0000000-->0XFF000000
|
||
|
||
add $a0,$0,$s1 #display $s1
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
|
||
sra $s1, $s1, 4 #0XFF000000-->0XFFF00000
|
||
|
||
add $a0,$0,$s1 #display $s1
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
sra $s1, $s1, 4
|
||
|
||
add $a0,$0,$s1 #display $s1
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
sra $s1, $s1, 4
|
||
|
||
add $a0,$0,$s1 #display $s1
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
|
||
sra $s1, $s1, 4
|
||
|
||
add $a0,$0,$s1 #display $s1
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
|
||
sra $s1, $s1, 4
|
||
|
||
add $a0,$0,$s1 #display $s1
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
|
||
sra $s1, $s1, 4
|
||
|
||
|
||
add $a0,$0,$s1 #display $s1
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
#############################################################
|
||
#走马灯测试,测试addi,andi,sll,srl,sra,or,ori,nor,syscall LED按走马灯方式来回显示数据
|
||
#############################################################
|
||
|
||
.text
|
||
addi $s0,$zero,1
|
||
sll $s3, $s0, 31 # $s3=0x80000000
|
||
sra $s3, $s3, 31 # $s3=0xFFFFFFFF
|
||
addu $s0,$zero,$zero # $s0=0
|
||
addi $s2,$zero,12
|
||
|
||
addiu $s6,$0,3 #走马灯计数
|
||
zmd_loop:
|
||
|
||
addiu $s0, $s0, 1 #计算下一个走马灯的数据
|
||
andi $s0, $s0, 15
|
||
|
||
#######################################
|
||
addi $t0,$0,8
|
||
addi $t1,$0,1
|
||
left:
|
||
|
||
sll $s3, $s3, 4 #走马灯左移
|
||
or $s3, $s3, $s0
|
||
|
||
add $a0,$0,$s3 # display $s3
|
||
addi $v0,$0,34 # system call for LED display
|
||
syscall # display
|
||
|
||
sub $t0,$t0,$t1
|
||
bne $t0,$0,left
|
||
#######################################
|
||
|
||
addi $s0, $s0, 1 #计算下一个走马灯的数据
|
||
addi $t8,$0,15
|
||
and $s0, $s0, $t8
|
||
sll $s0, $s0, 28
|
||
|
||
addi $t0,$0,8
|
||
addi $t1,$0,1
|
||
|
||
zmd_right:
|
||
|
||
srl $s3, $s3, 4 #走马灯右移
|
||
or $s3, $s3, $s0
|
||
|
||
addu $a0,$0,$s3 # display $s3
|
||
addi $v0,$0,34 # system call for LED display
|
||
syscall # display
|
||
|
||
sub $t0,$t0,$t1
|
||
bne $t0,$0,zmd_right
|
||
srl $s0, $s0, 28
|
||
#######################################
|
||
|
||
sub $s6,$s6,$t1
|
||
beq $s6,$0, exit
|
||
j zmd_loop
|
||
|
||
exit:
|
||
|
||
add $t0,$0,$0
|
||
nor $t0,$t0,$t0 #test nor ori
|
||
sll $t0,$t0,16
|
||
ori $t0,$t0,0xffff
|
||
|
||
addu $a0,$0,$t0 # display $t0
|
||
addi $v0,$0,34 # system call for LED display
|
||
syscall # display
|
||
#################################################################################
|
||
#本程序实现0-15号字单元的降序排序,此程序可在mars mips仿真器中运行
|
||
#运行时请将Mars Setting中的Memory Configuration设置为Compact,data at address 0
|
||
#
|
||
#################################################################################
|
||
.text
|
||
sort_init:
|
||
addi $s0,$0,-1
|
||
addi $s1,$0,0
|
||
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
sw $s0,0($s1)
|
||
addi $s0,$s0,1
|
||
addi $s1,$s1,4
|
||
|
||
addi $s0,$s0,1
|
||
|
||
add $s0,$zero,$zero
|
||
addi $s1,$zero,60 #排序区间
|
||
sort_loop:
|
||
lw $s3,0($s0)
|
||
lw $s4,0($s1)
|
||
slt $t0,$s3,$s4
|
||
beq $t0,$0,sort_next #降序排序
|
||
sw $s3, 0($s1)
|
||
sw $s4, 0($s0)
|
||
sort_next:
|
||
addi $s1, $s1, -4
|
||
bne $s0, $s1, sort_loop
|
||
|
||
add $a0,$0,$s0 #display $s0
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here. DISP: disp $r0, 0
|
||
|
||
addi $s0,$s0,4
|
||
addi $s1,$zero,60
|
||
bne $s0, $s1, sort_loop
|
||
|
||
addi $v0,$zero,50 # system call for exit
|
||
syscall # we are out of here.
|
||
#MIPS处理器实现中请用停机指令实现syscall
|
||
|
||
jmp_count: addi $s0,$zero, 0
|
||
addi $s0,$s0, 1
|
||
add $a0,$0,$s0
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
addi $s0,$s0, 2
|
||
add $a0,$0,$s0
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
addi $s0,$s0, 3
|
||
add $a0,$0,$s0
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
addi $s0,$s0, 4
|
||
add $a0,$0,$s0
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
addi $s0,$s0, 5
|
||
add $a0,$0,$s0
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
addi $s0,$s0, 6
|
||
add $a0,$0,$s0
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
addi $s0,$s0, 7
|
||
add $a0,$0,$s0
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
addi $s0,$s0, 8
|
||
add $a0,$0,$s0
|
||
addi $v0,$0,34 # display hex
|
||
addi $v0,$0,34 # display hex
|
||
syscall # we are out of here.
|
||
|
||
|
||
jr $31
|