Assembly NASM中的seg故障如何导致代码在出现问题的行之前执行失败?

Assembly NASM中的seg故障如何导致代码在出现问题的行之前执行失败?,assembly,x86,segmentation-fault,printf,nasm,Assembly,X86,Segmentation Fault,Printf,Nasm,我正在编写一个在NASM中调用的子例程,没有为此发布我的所有代码,让我告诉您,我确信它存在一些问题,比如堆栈不平衡 在调用此子例程之前,将要求用户输入存储在变量“factInt”中的数字。然后在例行调用之前,将该值输出到屏幕 如果程序如下所示: ;print value push dword [factInt] push formati call printf add esp, 8 ;debug ret ;call factorial push dword [factInt] call fa

我正在编写一个在NASM中调用的子例程,没有为此发布我的所有代码,让我告诉您,我确信它存在一些问题,比如堆栈不平衡

在调用此子例程之前,将要求用户输入存储在变量“factInt”中的数字。然后在例行调用之前,将该值输出到屏幕

如果程序如下所示:

;print value
push dword [factInt]
push formati
call printf
add esp, 8

;debug
ret

;call factorial
push dword [factInt]
call fact
然后输出为输入整数,例如:

6
但是,如果我们删除调试行(ret),程序会在打印前请求整数和seg错误。既然程序需要在子例程中出现堆栈不平衡的问题之前打印出来,这怎么可能呢


这与我多年来用java等其他语言编程所学到的相反

您必须记住,通过
printf
的输出是缓冲的。如果程序在刷新缓冲区之前崩溃,则缓冲区中的输出将丢失


通过向输出格式字符串添加换行符可以很容易地解决这个问题,因为输出是行缓冲的(即在换行符上刷新缓冲)。

这似乎是正确的。。。。我的格式是(formati:db“%i”,0)。。。。如果我把它改成(formati:db“%i”,10,0)。。。。实际上,我在抛出segfault之前从sub之前的打印和sub内部获取输出!因此,如果我不断调用printf并不断向其传递新内容,它在任何情况下都不会将此信息放到屏幕上,直到它到达一个包含“10”字符的printf语句?@driver64。当缓冲区满时,它当然会刷新缓冲区(写入终端)。但添加换行符是最简单的解决方案。