首页 > 跪求windlx里面的input.s的源码解析越详细越好尤其是Loop那段

跪求windlx里面的input.s的源码解析越详细越好尤其是Loop那段

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

	*/
【热门文章】
【热门文章】