;*********** WINDLX Ex.1: Read a positive integer number *************
;*********** (c) 1991 G黱ther 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 //阅读缓冲区,定义了80个字的存储区
ReadPar: .word 0,ReadBuffer,80 //将0,ReadBuffer,80以此列到内存里
;*** Data for Printf-Trap
PrintfPar: .space 4 //定义了4个字的存储区
SaveR2: .space 4 //定义了4个字的存储区
SaveR3: .space 4 //定义了4个字的存储区
SaveR4: .space 4 //定义了4个字的存储区
SaveR5: .space 4 //定义了4个字的存储区
.text
.global InputUnsigned
InputUnsigned:
;*** save register contents
sw SaveR2,r2 //将SaveR2存到r2里
sw SaveR3,r3 //将SaveR3存到r3里
sw SaveR4,r4 //将SaveR4存到r4里
sw SaveR5,r5 //将SaveR5存到r5里
;*** Prompt
sw PrintfPar,r1 //将PrintfPar存到r1里
addi r14,r0,PrintfPar //将PrintfPar的值放入r14
trap 5 //格式化输出
;*** call Trap-3 to read line
addi r14,r0,ReadPar //将ReadPar的值放入r14
trap 3 //读取文件
;*** determine value
addi r2,r0,ReadBuffer //将ReadBuffer的值放入r2
addi r1,r0,0 //将0存入r1
addi r4,r0,10 ;Decimal system //将10存到r4(英文注释是十进制系统)
Loop: ;*** reads digits to end of line //详解在下面
lbu r3,0(r2) //感觉r3像一个数组,指针向下移,或者就是把r2的值赋给r3,每次r2 + 1
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 //指针+1
j Loop
/*
这个Loop写成代码就是下面这个:
//之前得到的值-----begin
r2 = 0;
r1 = 0;
r4 = 10;
//之前得到的值-----end
while(r3 != 10) {
r3 = r3 + r2; //这个不确定,不知道对不对
r3 = r3 - 48; //为什么要减去48????
r1 = r1 * r4; //英文注释说是要转换为十进制,什么意思????
r1 = r1 + r3; //r1为何要加r3????
r2 = r2 + 1; //指针+1????
}
Finish;
*/
Finish: ;*** restore old register contents
lw r2,SaveR2 //加载字,把SaveR2放到r2
lw r3,SaveR3 //加载字,把SaveR3放到r3
lw r4,SaveR4 //加载字,把SaveR4放到r4
lw r5,SaveR5 //加载字,把SaveR5放到r5
jr r31 ; Return
/*
关于为何return r31:
20 main: ;*** Read value from stdin into R1
21 addi r1,r0,Prompt
22 jal InputUnsigned
23 ;*** init values
24 movi2fp f10,r1 ;R1 -> D0 D0..Count register
第22行是JAL调用,即JAL指令的执行是先将第24行指令的地址暂时保存在R31中,然后将InputUnsigned的地址送往PC从而完成跳转,
显然在InputUnsigned子程序的最后返回指令就只能是JR R31了
*/
正文完