汇编程序 - 2 (递归调用程序 -- 阶乘)

匿名 (未验证) 提交于 2019-12-02 23:48:02

这个也是学校的课设,处理的是 0--9 的阶乘。

 

设计思路:

总体设计思路和32位无符号数类似,结果存放在内存中;最主要的特点就是递归调用程序,即程序调用自己程序,最后通过比较一个界值来实现跳转。本设计的是0-9内的阶乘算法,有一个设计技巧:已知8!=40320(9D80H),9!=362880(58980H),由于进行乘法的16位运算MUL时,默认使用AX寄存器的值,乘积的结果放在DX:AX中。通过观察9!的16进制值知,在DX:AX中能放下。使用BX作为乘数源,从1往上递增。即当输入数据为9时,BX从1直到9完成递归调用。因为到8!时,AX中为9D80H,能够存放下,此时BX为9,运算后恰好能将值送到DX:AX中。如果从9递减到1的话,当BX为3时,运算结果(9X8X7X6X5X4X3=181440)对应16进制为2C4C0H,此时单用AX进行运算就会造成失真,如果要运算,需要先算DX的,再算AX的,没有必要。

 

输入:输入为0-9的字符。

 

运算(FAC):内部使用16进制进行运算。

 

调整(ADJUST):由于输出为10进制的运算后的数据,所以需要进行调整。内部实现是除10取余数,然后再入栈;除到最后时出栈,送到内存中去(只是为了内存首地址存储的是最高位,且按顺序存储)。

 

输出(OUTPUT):从内存中取出数据,调用21H的02H功能号,进行输出。

 

代码:

//fac.asm DATA        SEGMENT             BUF1      DB 0AH,0DH,'ENTER NUMBER(0-9):$'             BUF2      DB 0AH,0DH,'RESULT IS :$'             RESULT    DB 6 DUP (?) DATA        ENDS  CODE        SEGMENT MAIN        PROC    NEAR             ASSUME     DS:DATA,CS:CODE START:                 MOV       AX,DATA             MOV       DS,AX             LEA       DX,BUF1             MOV       AH,09H        ;输出提示信息             INT       21H ;INPUT(0-9)             MOV       AH,01H        ;输入数字n             INT       21H             SUB       AL,30H      ;ASCIIת10进制             MOV       BL,AL        ;BL->INPUT_NUMBER             MOV       BH,00H             MOV       AX,1             XOR       DX,DX             MOV        DI,BX             MOV        BX,1 ;FACT             CALL      FAC             LEA       SI,RESULT ;ADJUST             CALL    ADJUST             INC        SI             MOV        AL,0FFH             MOV        [SI],AL             LEA       DX,BUF2             MOV       AH,09H             INT       21H ;OUTPUT             MOV        SI,0             CALL    OUTPUT             MOV       AH,4CH             INT       21H MAIN        ENDP  FAC            PROC      NEAR                     CMP       BX,DI             JG        END_FAC             MUL       BX             INC       BX             CALL      FAC END_FAC:                  RET FAC            ENDP              ADJUST        PROC      NEAR             MOV      CX,0             MOV       BX,10 TURN_DEC:             DIV       BX             ADD       DL,30H             PUSH      DX             INC       CX             CMP       AX,9             MOV       DX,0             JA        TURN_DEC             ADD       AL,30H             MOV       [SI],AL IN_MEMORY:                 POP       AX             INC       SI             MOV       [SI],AL             LOOP      IN_MEMORY             RET ADJUST         ENDP  OUTPUT        PROC    NEAR             LEA        DI,RESULT START_OUT:                         MOV        BL,[DI]             CMP        BL,0FFH             JE        END_OUT             CMP        BL,30H             JE        OUT_ADJUST RET_ADJUST:                         MOV        DL,[DI]             MOV        AH,02H             INT        21H             INC        DI             MOV        SI,1             JMP        START_OUT OUT_ADJUST:             CMP        SI,0             JNE        RET_ADJUST             INC        DI             MOV        SI,1             JMP        START_OUT END_OUT:                         RET OUTPUT        ENDP  CODE           ENDS             END       START

推荐使用notepad++或者vscode,拿来写和查看代码,感觉很棒!!!

 

截图:

 

 

嗯,就到这了,没啦!!!

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!