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


2012-11-13-16-17-36.jpg

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

    */

asm

要你命3000 11 years, 8 months ago

Your Answer