assembly 如何在NASM x86中使用递归性编码输入的阶乘

nukf8bse  于 2023-01-17  发布在  其他
关注(0)|答案(2)|浏览(98)
%include "asm_io.inc"


segment .data

segment .bss


segment .text

    global asm_main

asm_main:

    enter 0,0
    pusha


    call    read_int

    push eax
    call fak_rekursiv
    add esp, 4


    call print_int
    call print_nl

    

    popa
    mov eax, 0
    leave
    ret

fak_rekursiv:

    enter 4, 0
    pusha

    

    mov eax, [ebp + 8]

    

    cmp eax, 0
    je ergebnis_1

    cmp eax, 1
    je ergebnis_1

    

    

    mov ebx, eax
    dec ebx
    mul ebx
    push ebx
    call fak_rekursiv
    pop ebx

            

    ergebnis:
        mov [ebp - 4], eax
        

    ergebnis_1:

        mov [ebp - 4], dword 1 

    popa
    mov eax, [ebp - 4]
    leave
    ret

我正在学习在NASM上编码,我试图通过使用编码阶乘来理解递归,但我很快就被弄糊涂了。
我如何使用NASM中的递归来编写阶乘算法?

ep6jt1vc

ep6jt1vc1#

实际上,我之前编写factorial只是为了好玩,现在我已经在我的文件中找到了代码:)在这里,但它更像是一个伪代码,我只是通过调试器单步调试。

factorial:
    push    eax
    test    eax, 07FFFFFFEh
    jz      .exit
    dec     eax
    call    factorial
    mul     dword [esp]
.exit:
    pop     edx
    ret

eax中放置不同的值,并在调试器中逐步通过它。

yfwxisqw

yfwxisqw2#

不太熟悉NASM,但这里有一个MASM解决方案,它递归地调用阶乘函数。

阶乘.asm

.386
.model flat, stdcall
option casemap :none

includelib \masm32\lib\msvcrt.lib
printf PROTO C, :VARARG

.data
fmt db "%u! = %u", 13, 10, 0  

.code

factorial proc
    cmp     eax, 0   ; Special-case to account for 0! = 1
    je      retone
    cmp     eax, 1
    je      retnow
    push    eax
    dec     eax
    call    factorial
    pop     edx
    imul    eax, edx ; eax = eax * edx 
    
retnow:
    ret
    
retone:
    mov     eax, 1
    ret    
factorial endp

main:   

    ; Loop from 0 to 12 (max) factorial for 32-bit code.
    mov     ebx, 0  
num:
    mov     eax, ebx
    call    factorial
    invoke  printf, OFFSET fmt, ebx, eax
    inc     ebx
    cmp     ebx,13   
    jne     num
    
    ret
end main

显示从0到12的所有阶乘

相关问题