1. 实验目的:
实验一 熟悉 WinDLX 的使用
通过本实验,熟悉 WinDLX 模拟器的操作和使用,了解 DLX 指令集结构
及其特点。
2. 实验内容:
(1) 用 WinDLX 模拟器执行求阶乘程序 facts。
这个程序说明浮点指令的使用。该程序从标准输入读入一个整数,求其
阶乘,然后将结果输出。该程序中调用了 input.s 中的输入子程序,这个
子程序用于读入正整数。
(2) 输入数据“3”采用单步执行方法,完成程序并通过上述使用 WinDLX,
总结 WinDLX 的特点。
(3) 注意观察变量说明语句所建立的数据区,理解 WinDLX 指令系统。
3. 实验程序:
求阶程序 fact.s
;*********** WINDLX Ex.2: Factorial *************
;--------------------------------------------------------------------------
; Program begin at symbol main
; requires module INPUT
; read a number from stdin and calculate the factorial (type: double)
; the result is written to stdout
;--------------------------------------------------------------------------
.data
Prompt: .asciiz “An integer value >1 : “
PrintfFormat: .asciiz “Factorial = %g\n\n“
.align 2
PrintfPar: .word PrintfFormat
PrintfValue: .space 8
.text
.global main
main:
;*** Read value from stdin into R1 addi
r1,r0,Prompt
jal InputUnsigned
;*** init values
movi2fp f10,r1 ;R1 -> D0 D0..Count register cvti2d
f0,f10
addi r2,r0,1 ;1 -> D2 D2..result
movi2fp f11,r2
cvti2d f2,f11
movd f4,f2 ;1-> D4 D4..Constant 1
;*** Break loop if D0 = 1
Loop: led f0,f4 ;D0<=1 ?
bfpt Finish
;*** Multiplication and next
multd f2,f2,f0
subd f0,f0,f4 j
Loop
loop
r14,r0,PrintfPar
Finish: ;*** write result to stdout sd
PrintfValue,f2
addi
trap 5
;*** end
Trap 0
该程序中调用了 input.s 中输入的子程序
;*********** WINDLX Ex.1: Read a positive integer number *************
;-----------------------------------------------------------------------------
;Subprogram call by symbol “InputUnsigned“
;expect the address of a zero-terminated prompt string in R1
;returns the read value in R1
;changes the contents of registers R1,R13,R14
;-----------------------------------------------------------------------------
.data
;*** Data for Read-Trap
ReadBuffer: .space 80
ReadPar: .word 0,ReadBuffer,80
;*** Data for Printf-Trap
PrintfPar: .space 4
SaveR2: .space 4
SaveR3: .space 4
SaveR4: .space 4
SaveR5: .space 4
.text
.global InputUnsigned
InputUnsigned:
;*** save register contents sw
SaveR2,r2
sw SaveR3,r3
sw SaveR4,r4
sw SaveR5,r5
;*** Prompt
sw PrintfPar,r1
addi
trap 5
r14,r0,PrintfPar
;*** call Trap-3 to read line
addi r14,r0,ReadPar
trap 3
determine
value
r2,r0,ReadBuffer
;***
addi
addi r1,r0,0
addi r4,r0,10 ;Decimal system
Loop: ;*** reads digits to end of line
lbu r3,0(r2)
seqi r5,r3,10 ;LF -> Exit
bnez r5,Finish
subi r3,r3,48 ;??
multu r1,r1,r4 ;Shift decimal
add r1,r1,r3
addi r2,r2,1 ;increment pointer j
Loop
Finish: ;*** restore old register contents lw
r2,SaveR2
lw
r3,SaveR3
lw
r4,SaveR4
lw
r31
r5,SaveR5
jr
Retur
4.实验结果:
;