NASM中的斐波纳契 - seg故障

时间:2012-05-29 22:34:32

标签: assembly segmentation-fault nasm fibonacci

我们必须在大会中编码,你可能很难知道。或者教授没有给我们任何关于如何正确编码或链接的信息。我们必须自己学习。明天我必须交出我的工作。 目的是将第n个斐波那契数字打印到控制台。

section .data
    fmt: db "fib=%d",10,0

section .text
extern _printf
global _main, fib

_main:
    mov eax, 10     ; e.g. n=10
    mov ebx, 1      ; we know f_0 and f_1
    sub eax, ebx    ; thats why n--
    push eax        ; push n
    push 0      ; f_0 = 0 
    push 1      ; f_1 = 1

    call fib

    push eax        ; in eax the result is stored
    push fmt
    call _printf

    mov ebx, 0
    mov eax, 1      ; exit(0)
    int 0x80    


fib:
    mov ecx, eax
    pop esi
    calc:
    pop ebx
    pop edx
    add ebx, edx
    mov eax, ebx
    push edx
    push ebx
    sub ecx, 1
    cmp ecx, 0
    jne calc
    push esi
    ret

在与链接器挣扎之后,我终于设法组装并链接了我的程序。但它不起作用 - 我每次都会遇到分段错误。

修改 更正的代码 - 我在控制台上得到一些文字,但遗憾的是没有正确的数字,它总是显示“fib = 1”并再次出现故障。

2 个答案:

答案 0 :(得分:0)

你有

push 0      ; f_0 = 0 
push 1      ; f_1 = 1

call fib

然后

fib:
    mov ecx, eax
    calc:
    pop ebx
    pop edx

你不能这样做 - 调用指令将推送堆栈上的返回地址,这是你将在fib中弹出的第一件事。

答案 1 :(得分:0)

我没有找到装配很难,而是我发现它很简单直接。如果您的老师没有正确地教您,那么您可以在互联网上搜索信息。多年以前,当我们大多数人开始时,没有太多的信息,所以我们使用反复试验来学习。

我建议你从简单开始学习堆栈。使用此作为工作示例:

 extern printf
    section .data
    msg:    db "Your sum is %d",10 ,0

    section .text
    global _start

    _start:
        push    20
        push    2
        push    6
        call    AddEm

        push    eax
        push    msg
        call    printf
        add     esp, 4 * 2  ; printf is C calling convention, we have to adjust stack

        mov     ebx, 0
        mov     eax, 1      ; exit(0)
        int     0x80    

    AddEm:
        push    ebp     ; set up a stack frame
        mov     ebp, esp    ; we could just use esp but we won't

        mov     eax, [ebp + 8]  ; 1st param - 6
        add     eax, [ebp + 12] ; 2nd param - 2
        add     eax, [ebp + 16] ; 3rd param - 20

        mov     esp, ebp    ; restore the stack
        pop     ebp
        ret     4 * 3       ; passed 3 params, clean up stack

这就是我如何组装,链接和输出。

Screenshot