;*********** 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了 */