Assembly 改进装配工艺

Assembly 改进装配工艺,assembly,masm,factorial,irvine32,Assembly,Masm,Factorial,Irvine32,我想写一个通过参数的阶乘过程。请帮忙。请帮助我查看此代码是否需要改进,例如如何使此代码更短、更简单。它太长了,我只想要主功能 INCLUDELIB C:\Irvine\Kernel32.lib INCLUDELIB C:\Irvine\Irvine32.lib INCLUDE C:\Irvine\Irvine32.inc .code main PROC push 5 ; calc 5! call Factorial ; calcul

我想写一个通过参数的阶乘过程。请帮忙。请帮助我查看此代码是否需要改进,例如如何使此代码更短、更简单。它太长了,我只想要主功能

 INCLUDELIB C:\Irvine\Kernel32.lib
 INCLUDELIB C:\Irvine\Irvine32.lib
 INCLUDE C:\Irvine\Irvine32.inc

 .code
 main PROC
     push 5             ; calc 5!
     call Factorial     ; calculate factorial (EAX)
     call WriteDec      ; display it
     call Crlf
     exit
 main ENDP

 ;----------------------------------------------------------
 Factorial PROC
 ; Calculates a factorial.
 ; Receives: [ebp+8] = n, the number to calculate
 ; Returns: eax = the factorial of n
 ;----------------------------------------------------------
 push ebp
 mov ebp,esp
 mov eax,[ebp+8]     ; get n
 cmp eax,0                 ; n > 0?
 ja L1                ; yes: continue
 mov eax,1                 ; no: return 1 as the value of 0!
 jmp L2               ; and return to the caller

 L1: dec  eax             ; Factorial(n-1)
 push eax
 call Factorial

; Instructions from this point on execute when each
; recursive call returns.

 ReturnFact:
 mov ebx,[ebp+8]     ; get n
 mul ebx              ; EDX:EAX = EAX * EBX

 L2: pop ebp         ; return EAX
 ret 4                ; clean up stack
 Factorial ENDP
 END main

这将额外乘以1,但它很短

factorial proc  near
        mov     ecx,[esp+4]
        mov     eax,1
        cmp     ecx,eax
        jb      fct1
fct0:   mul     ecx
        loop    fct0
fct1:   ret
factorial endp

这将额外乘以1,但它很短

factorial proc  near
        mov     ecx,[esp+4]
        mov     eax,1
        cmp     ecx,eax
        jb      fct1
fct0:   mul     ecx
        loop    fct0
fct1:   ret
factorial endp

这将额外乘以1,但它很短

factorial proc  near
        mov     ecx,[esp+4]
        mov     eax,1
        cmp     ecx,eax
        jb      fct1
fct0:   mul     ecx
        loop    fct0
fct1:   ret
factorial endp

这将额外乘以1,但它很短

factorial proc  near
        mov     ecx,[esp+4]
        mov     eax,1
        cmp     ecx,eax
        jb      fct1
fct0:   mul     ecx
        loop    fct0
fct1:   ret
factorial endp

接下来是使用循环指令的非递归阶乘的完整程序,只需复制、粘贴和运行(使用EMU8086制作):


接下来是使用循环指令的非递归阶乘的完整程序,只需复制、粘贴和运行(使用EMU8086制作):


接下来是使用循环指令的非递归阶乘的完整程序,只需复制、粘贴和运行(使用EMU8086制作):


接下来是使用循环指令的非递归阶乘的完整程序,只需复制、粘贴和运行(使用EMU8086制作):


考虑到那12个!是使用32位寄存器可以计算的最大值,您可以只对12个条目的表进行单个索引。你也可以索引到一个12个条目的分支表中,进入一个展开的循环,这个循环可以进行乘法运算,或者你可以循环多达12次“我太迷路了。我保证我会接受这个答案!我只需要知道如何用非草书书写!我认为这是为了家庭作业?我投票将这个问题作为离题题结束,因为它似乎是在家庭作业上寻求帮助,而没有显示所做的尝试和中概述的具体困难。考虑到这一点,12!是使用32位寄存器可以计算的最大值,您可以只对12个条目的表进行单个索引。你也可以索引到一个12个条目的分支表中,进入一个展开的循环,这个循环可以进行乘法运算,或者你可以循环多达12次“我太迷路了。我保证我会接受这个答案!我只需要知道如何用非草书书写!我认为这是为了家庭作业?我投票将这个问题作为离题题结束,因为它似乎是在家庭作业上寻求帮助,而没有显示所做的尝试和中概述的具体困难。考虑到这一点,12!是使用32位寄存器可以计算的最大值,您可以只对12个条目的表进行单个索引。你也可以索引到一个12个条目的分支表中,进入一个展开的循环,这个循环可以进行乘法运算,或者你可以循环多达12次“我太迷路了。我保证我会接受这个答案!我只需要知道如何用非草书书写!我认为这是为了家庭作业?我投票将这个问题作为离题题结束,因为它似乎是在家庭作业上寻求帮助,而没有显示所做的尝试和中概述的具体困难。考虑到这一点,12!是使用32位寄存器可以计算的最大值,您可以只对12个条目的表进行单个索引。你也可以索引到一个12个条目的分支表中,进入一个展开的循环,这个循环可以进行乘法运算,或者你可以循环多达12次“我太迷路了。我保证我会接受这个答案!我只需要知道如何用非草书书写!我认为这是为了家庭作业?我投票将这个问题作为离题题结束,因为它似乎是在家庭作业上寻求帮助,而没有显示所做的尝试和中概述的具体困难。