不想多说了……前面的铺垫足够了,剩下的自己做做应该也会了,如果遇到问题,就搜一下自己查阅就好。
这篇水过,没有太多技术点。
唯一注意的是,引入的RAM和ROM的clk触发问题,可能引起时序问题,等实际测试遇到问题再解决,问题出现之前也不知道会遇到啥。
测试
.data
a: .word 0x64.text
nop
add $1,$2,$3 # $1 = 2 + 3 = 5
addu $2,$4,$1 # $2 = 4 + 5 = 9
sub $4,$2,$1 # $4 = 9 - 5 = 4
subu $5,$4,$3 # $5 = 4 - 3 = 1and $6,$7,$8 # $6 = 0111 and 1000 = 0
or $7,$6,$8 # $7 = 0 or 1000 = 8
xor $7,$6,$8 # $7 = 0000 xor 1000 = 1000 = 8
nor $8,$7,$6 # $8 = not (1000 or 0) = 11111111111110111slt $10,$11,$12 # $10 = 11 < 12 = 1 # 应该用负数验证,以后再说
sltu $10,$12,$11 # $10 = 12 > 11 = 0# sllv $12,$5,$13 # $12 = 1101 << 1 = 1101_0 = 1A 【注意此处的倒置问题! sllv rd,rt,rs】
# srlv $12,$5,$13 # $12 = 1101 >> 1 = 110 = 6
# srav $14,$5,$15 # $14 = 1111 >>> 1 = 111 = 7 应该用负数验证,以后再说# 上面3条是错误的!我们应该改的不是使用,而是内部运算逻辑
# 对于使用者来说,逻辑就是 $13 << $5
# 而实际的编码是 rt = $13,rs = $5,这与一般的指令不一样
# 因此,我们在ALU运算中 rt--B,rs--A,应该是 【B << A】,而不是 A >> B。
sllv $12,$13,$5 # $12 = 1101 << 1 = 1101_0 = 1A
srlv $12,$13,$5 # $12 = 1101 >> 1 = 110 = 6
srav $14,$15,$5 # $14 = 1111 >>> 1 = 111 = 7 应该用负数验证,以后再说sll $16,$17,2 # $16 = 1_0001 << 2 = 100_0100 = 44
srl $16,$18,2 # $16 = 1_0010 >> 2 = 0100 = 4
sra $16,$19,2 # 应该用负数验证,以后再说 $16 = 4################ I type test #################
addi $17,$7,-1 # $17 = 8 - 1 = 7 测试符号扩展
addiu $17,$7,-2 # $17 = 8 - 2 = 6
andi $17,$8,1 # $17 = 1 测试zero extension
ori $17,$8,0 # $17 = ffff_fff7 = ffff_fff7
xori $17,$8,15 # $17 = ffff_fff7 xor 0000_000f = ffff_fff8 lui $17,100 # $17 = 前16位是64_后16位是0beq $0,$10,s1 # 0 = 0,jump!
nop
nop
nops1:
addi $10,$10,1 # $10 = 1
beq $0,$10,s1 # 0 != 1,don't jump
bne $0,$0,s3 # not jump
bne $0,$10,s2 # 0 != 1,jump
nop
nop
nops2:
lw $30,0($0) # $30 = mem[0] = 0x64
sw $10,4($0) # mem[4] = 0x1
jr $16 # PC = 4s3: