提交 e91c47ad 编写于 作者: John Kieron's avatar John Kieron

Initial commit

上级
;*********** WINDLX Ex.1: Read a positive integer number *************
;*********** (c) 1991 Gnther Raidl *************
;*********** Modified 1992 Maziar Khosravipour *************
;-----------------------------------------------------------------------------
;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 r14,r0,PrintfPar
trap 5
;*** call Trap-3 to read line
addi r14,r0,ReadPar
trap 3
;*** determine value
addi r2,r0,ReadBuffer
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 r5,SaveR5
jr r31 ; Return
\ No newline at end of file
.data
Prompt: .asciiz "input An integer which is array's size value >1 : "
PromptLast: .asciiz "input an integer :"
PrintfFormat: .asciiz "Number : %g "
.align 2
PrintfPar: .word PrintfFormat
Printf: .space 8
PrintfValue: .space 1024
.text
.global main
main:
;*** Read value from stdin into R1
addi r1,r0,Prompt
jal InputUnsigned
add r2,r0,r1
add r8,r0,r1
add r6,r0,r1
add r7,r0,r1
addi r3,r0,0
;循环输入数组的各个值(此处循环展开为3次)
InputArray: beqz r2, ProcessPart
addi r1,r0,PromptLast
jal InputUnsigned
sw PrintfValue(r3),r1
addi r3,r3,4
subi r2,r2,1
j InputArray
;开始排序 ,从内存中取数字,放在R4和R5中,比较之后,换的方法就是对调写回, 循环的限制数外层R6,内层R7, 取内存的偏移量仍然用R3来存
ProcessPart: addi r10,r0,0
OutLoop:
beqz r6,End
addi r9,r10,0
addi r3,r9,4
subi r7,r6,1
add r6,r0,r7
lf f10,PrintfValue(r9)
InnerLop:
beqz r7, location
lf f11,PrintfValue(r3)
lef f10,f11
bfpt Swap
back:
sf PrintfValue(r3),f11
addi r3,r3,4
sf PrintfValue(r9),f10
subi r7,r7,1
j InnerLop
Swap:
movi2fp f1,r0
addf f2,f10,f1
addf f10,f1,f11
addf f11,f1,f2
j back
End: addi r3,r0,0
output: subi r8,r8,1
lf f2, PrintfValue(r3)
cvti2d f0,f2
sd Printf,f0
addi r14,r0,PrintfPar
trap 5
addi r3,r3,4
beqz r8,over
j output
over: trap 0
location: addi r10,r10,4
j OutLoop
\ No newline at end of file
.data
Prompt: .asciiz "input An integer which is array's size value >1 : "
PromptLast: .asciiz "input an integer :"
PrintfFormat: .asciiz "Number : %g "
.align 2
PrintfPar: .word PrintfFormat
Printf: .space 8
PrintfValue: .space 1024
.text
.global main
main:
;*** Read value from stdin into R1
addi r1,r0,Prompt
jal InputUnsigned
add r2,r0,r1
add r8,r0,r1
add r6,r0,r1
add r7,r0,r1
addi r3,r0,0
;循环输入数组的各个值(此处循环展开为3次)
InputArray: beqz r2, ProcessPart
addi r1,r0,PromptLast
jal InputUnsigned
sw PrintfValue(r3),r1
addi r3,r3,4
subi r2,r2,1
beqz r2, ProcessPart
addi r1,r0,PromptLast
jal InputUnsigned
sw PrintfValue(r3),r1
addi r3,r3,4
subi r2,r2,1
beqz r2, ProcessPart
addi r1,r0,PromptLast
jal InputUnsigned
sw PrintfValue(r3),r1
addi r3,r3,4
subi r2,r2,1
j InputArray
;开始排序 ,从内存中取数字,放在R4和R5中,比较之后,换的方法就是对调写回, 循环的限制数外层R6,内层R7, 取内存的偏移量仍然用R3来存
ProcessPart: addi r10,r0,0
OutLoop:
beqz r6,End
addi r9,r10,0
addi r3,r9,4
subi r7,r6,1
add r6,r0,r7
lf f10,PrintfValue(r9)
InnerLop:
beqz r7, location
lf f11,PrintfValue(r3)
lef f10,f11
bfpt HuHuan
back:
sf PrintfValue(r3),f11
addi r3,r3,4
sf PrintfValue(r9),f10
subi r7,r7,1
j InnerLop
HuHuan:
movi2fp f1,r0
addf f2,f10,f1
addf f10,f1,f11
addf f11,f1,f2
j back
End: addi r3,r0,0
output: subi r8,r8,1
lf f2, PrintfValue(r3)
cvti2d f0,f2
sd Printf,f0
addi r14,r0,PrintfPar
trap 5
addi r3,r3,4
beqz r8,over
subi r8,r8,1
lf f2, PrintfValue(r3)
cvti2d f0,f2
sd Printf,f0
addi r14,r0,PrintfPar
trap 5
addi r3,r3,4
beqz r8,over
subi r8,r8,1
lf f2, PrintfValue(r3)
cvti2d f0,f2
sd Printf,f0
addi r14,r0,PrintfPar
trap 5
addi r3,r3,4
beqz r8,over
j output
over: trap 0
location: addi r10,r10,4
j OutLoop
\ No newline at end of file
初始化模拟器:
点击File 菜单中的 Reset all 菜单项,弹出一个“Reset DLX”对话框,点击窗口中的“确认”按钮即可。
装入程序:
点击File 菜单中的 Load Code or Data 菜单项,先双击select.s再双击input.s。点击load,将两个程序装入。
运行程序:
点击Excute 菜单中的Run或按F5运行程序。
输入数据:
先输入数组大小n后按下“回车”,再依次输入n个数据,每输入一个数据按下一个“回车”。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册