Assembly 汇编语言分段错误

Assembly 汇编语言分段错误,assembly,x86,segmentation-fault,nasm,libc,Assembly,X86,Segmentation Fault,Nasm,Libc,当运行时,我的汇编程序在最后会不断产生分段错误。该程序将打印出1-100之间的数字,并用“Fizz”一词替换所有可被5整除和50整除的数字。我尝试了各种选择,但我仍然不断地犯错误。有人能看一下我的代码并给我一些提示吗 ;program extern printf SECTION .bss storage resd 1 ; reserve 1 dword SECTION .data fmt db "%d", 0dh,0ah,0 ; newline in form

当运行时,我的汇编程序在最后会不断产生分段错误。该程序将打印出1-100之间的数字,并用“Fizz”一词替换所有可被5整除和50整除的数字。我尝试了各种选择,但我仍然不断地犯错误。有人能看一下我的代码并给我一些提示吗

;program

  extern printf

SECTION .bss
    storage resd 1      ; reserve 1 dword

SECTION .data
  fmt   db "%d", 0dh,0ah,0 ; newline in formate now
  fm1   db "%s", 10,0 ; newline in formate now
  hello db "FiZZ", 0  ; the string

  count equ 0              ; output ten times

SECTION .text

global  main

main:
    push ebp
    mov ebp, esp            ; stack related

    mov eax, count
    mov ecx, 0
    mov ebx, 5
    mov dword[storage], eax ; store eax's current value


nLoop:


    mov eax, dword[storage] ; grab current count
    add eax, 1
    mov dword[storage], eax ; store new value for later

   cmp     eax, 5      ; check ecx equal to 5
   je      printFizz       ; jump to printfizz if equal to 5
   cmp     eax, 10       ; 
   je      printFizz       ; 
   cmp     eax, 15       ; 
   je      printFizz       ; 
   cmp     eax, 20       ; 
   je      printFizz       ;  
   cmp     eax, 25       ; 
   je      printFizz       ;
   cmp     eax, 30       ; 
   je      printFizz       ; 
   cmp     eax, 35      ; 
   je      printFizz       ;
   cmp     eax, 40       ; 
   je      printFizz       ; 
   cmp     eax, 45       ; 
   je      printFizz       ; 
   cmp     eax, 50       ; 
   je      printFizz       ; 
   cmp     eax, 51      ; 
   je      printFizz       ; 
   cmp     eax, 52       ; 
   je      printFizz       ; 
   cmp     eax, 53       ; 
   je      printFizz       ;
   cmp     eax, 54       ; 
   je      printFizz       ; 
   cmp     eax, 55       ; 
   je      printFizz       ; 
   cmp     eax, 56       ; 
   je      printFizz       ; 
    cmp     eax, 57      ; 
   je      printFizz       ; 
   cmp     eax, 58       ; 
   je      printFizz       ; 
   cmp     eax, 59       ;  
   je      printFizz       ; 
   cmp     eax, 60       ; 
   je      printFizz       ; 
    cmp     eax, 65      ; 
   je      printFizz       ; 
   cmp     eax, 70       ; 
   je      printFizz       ; 
   cmp     eax, 75       ; 
   je      printFizz       ; 
   cmp     eax, 80       ;
   je      printFizz       ;   
   cmp     eax, 85       ; 
   je      printFizz       ; 
   cmp     eax, 90       ; 
   je      printFizz       ; 
   cmp     eax, 95       ; 
   je      printFizz       ; 
   cmp     eax, 100       ; 
   je      EndFizz       ; 


    push eax        
    push fmt
    call printf
    add esp, 12             ; clean 3 args (4 * 3)
    mov eax, dword[storage] ; grab current count

    cmp eax, 100
    jne nLoop               ; jum to the loop 

    leave ; also stack related
    ret

printFizz:

    push    hello        ; address of ctrl string
    push    fm1         ;
    call    printf      ; Call C function 


    jmp nLoop

EndFizz:

    push    hello        ; address of ctrl string
    push    fm1         ;
    call    printf      ; Call C function 


    leave ; also stack related
    ret

clean 3 args
awesome,哪3个?你只通过了2级。而且,
printFizz
不会清洗任何。不幸的是,这些不会取消;)学习使用调试器。PS:你知道他们可能希望你做得比那一系列比较好,对吧?除了Jester的评论之外,我同意他的观点,你需要关心在按下函数参数进行函数调用后正确恢复堆栈。如果在printf之前推送2个32位值,则应将8添加到ESP(4*2=8),推送的3个DWORD值将需要在之后添加12(4*3=12)。之后未能正确恢复堆栈可能会导致异常问题和故障。巧合的是,我为一个与Fizz相关的问题写了另一个答案,其中提到了堆栈问题以及其他问题:20次
CMPEAX,
je printFizz
?你的手指不是因为按ctrl-V键而受伤吗?编程的一个原则是:“永远不要重复你自己”@Tommylee2k:不总是这样。如果你想打破依赖链,你会想到循环展开。每个规则都有例外,大多数时候你知道为什么不遵循规则是个好主意;在这种情况下,为每个外观复制一个分支简直是胡说八道。。。幸运的是,循环只上升到100,而不是1000左右;-)