实验报告要求:实验目的、内容、程序、流程图、中间结果、最终结果、步骤
Single Cycle F7 单步执行
IF ID EX MEM WB READ WRITE
sw SaveR2,r2 R2送M(SaveR2)
sw PrintfPar,r1 R1送PrintfPar 没有WB?不需要写内存
PrintfPar: .space 4 变量PrintfPar 保留4个字节
laddEX 加 lmulEX 乘 ldivEX 除
trap 0x5 清空流水线,输出结果。
?intEX 与 laddEX ...的关系 ,这鸟实验做的,鸟实验指导书写的,唉!
trap 0x3 从键盘接受输入,也要清空流水线
lbu r3,0x0[r2] 装入无符号字节 REG[r3]<-MEM[0+REG[r2]]
seqi r5,r3,0xa IF(R3=立即数10) 1送R5 ELSE 0送R5
bnez r5,input.Finish IF(R3=立即数10) 1送R5 ELSE 0送R5 输出结果
trap 0x0 无论何时遇到一条trap指令时,流水线将被清空。结束程序。
PC 程序计数器 IR 指令寄存器
文件分析:
input.s , 将存储的数放在r1中。
jr r31 ; R31送PC 从子程序返回
0xa 10 NL line feed, new line
终于把代码看懂了!
跳转指令中会出现流水线气泡;
当定向硬件检测到前一个 ALU 运算结果的写入寄存器就是当前 ALU 操作的源寄存器时,那么控制逻辑将前一个 ALU 运算结果定向到 ALU 的输入端,后一个 ALU 操作就不必从源寄存器中读取操作数。
trap 0x3 接受的输入存到了哪里?
数字i对应的ascii码是i+30
0xa对应回车键
实验二 用WinDLX模拟器执行程序求最大公约数
trap 0x5; 和r14相关。
实验报告的内容应包括:实验目的、实验内容、实验程序、程序流程图、实验步骤、实验中间结果、实验最终结果。
-----------------------------------------input.s---------------------------------------------------------------------------------
;*** determine value
addi r2,r0,ReadBuffer ;r2=ReadBuffer+0
addi r1,r0,0 ;r1=0,r1清零
addi r4,r0,10 ;Decimal system; r4=10;
Loop: ;*** reads digits to end of line
lbu r3,0(r2) ;载入无符号字节 r3 <- mem[0+[r2]] 即:r3 = ReadBuffer(输入数的十六进制) seqi r5,r3,10 ;LF(r3==10) r5=1(exit);else r5=0 bnez r5,Finish ;if(r5==1) j Finish; subi r3,r3,48 ;r3 = r3-48 multu r1,r1,r4 ;r1=r1*r4 add r1,r1,r3 ;r1=r1+r3,r1==0,相当于r1=r3 addi r2,r2,1 ;increment pointer;r2=r2+1;而mem[[r2]]=0xa j Loop
----------------------------------fact.s---------------------------------------------------------------
;*** init values
movi2fp f10,r1 ;f10=[r1];R1 -> D0 D0..Count register;将32位整型寄存器中的内容移入浮点寄存器;
cvti2d f0,f10 ;f0=[f10]=[r1];转换指令,CVTx2y表示从类型x转换到类型y,其中x和y可以是I(整型)、D(双精度浮点)、F(单精度浮点)
addi r2,r0,1 ;r2=1; D2..result;r2=r0+1
movi2fp f11,r2 ;f11 = [r2]
cvti2d f2,f11 ;f2=[f11]=[r2]
movd f4,f2 ;1-> D4 D4..Constant 1;f4=[f2];
;*** Break loop if D0 = 1
Loop: led f0,f4 ;if(f0<=f4) fps=1;else fps=0; bfpt Finish ;视fps而定 ;*** Multiplication and next loop multd f2,f2,f0 ;f2=[f2]*[f0] subd f0,f0,f4 ;f0=[f0]-1 j Loop ; Finish: ;*** write result to stdout sd PrintfValue,f2 ; addi r14,r0,PrintfPar ;r14 = r0 + &PrintfPar trap 5 ;stdout, trap 5 输出r14中的内容 ------------------------------------prim.s-------------------------------------------------------------------------
;*********** (c) 1991 G黱ther Raidl *************
;*********** Modified 1992 Maziar Khosravipour *************
;-------------------------------------------------------------------
; Program begins at symbol main
; generates a table with the first 'Count' prime numbers from 'Table'
;-------------------------------------------------------------------
.data
;*** size of table
.global Count
Count: -----------------0x1000
.word 10
.global Table
Table: -----------------0x1004
.space Count*4
.text
.global main
main:
;*** Initialization
addi r1,r0,0 ;Index in Table; [r1]=[r0]+0;
addi r2,r0,2 ;Current value; [r2]=[r0]+2;
;*** Determine, if R2 can be divided by a value in table
NextValue:
addi r3,r0,0 ;Helpindex in Table; [r3]=[r0]+0
Loop:
seq r4,r1,r3 ;End of Table? if(r1==r3) r4=1;else r4=0;
bnez r4,IsPrim ;R2 is a prime number;如果r1==r3;if(r4==1) j IsPrim;
lw r5,Table(R3); 从主存里读数(以前存放的素数),存到r5
divu r6,r2,r5; r6=r2/r5
multu r7,r6,r5 r7=r6*r5
subu r8,r2,r7 r8=r2-r7
beqz r8,IsNoPrim if(r8==0) j IsNoPrim
addi r3,r3,4 r3+=4; 读取下一个素数
j Loop
IsPrim: ;*** Write value into Table and increment index
sw Table(r1),r2 存数
addi r1,r1,4; r1=r1+4;
;*** 'Count' reached?
lw r9,Count; 从主存中取数放到r9, 0x0a,10
srli r10,r1,2; 移位,右移高位填0,r10 = r1>>2 = r1/4
sge r11,r10,r9; if(r10>r9) r11=1; else r11=0;
bnez r11,Finish if(r11==1) j Finish
IsNoPrim: ;*** Check next value
addi r2,r2,1 ;increment R2
j NextValue ;
Finish: ;*** end
trap 0
// 0x1000 Count里面存10 0x1004 Table里面存放找到的素数
// 本程序用于寻找素数,从2开始找,初始值放到r2,
// 除法用了19个节拍,导致后续依赖其数值的后续指令等待,流水线断流:
multu r7,r6,r5 r7=r6*r5 R-stall
subu r8,r2,r7 r8=r2-r7 stall