Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 英特尔基本汇编语言分段错误_Linux_Assembly_X86_Segmentation Fault - Fatal编程技术网

Linux 英特尔基本汇编语言分段错误

Linux 英特尔基本汇编语言分段错误,linux,assembly,x86,segmentation-fault,Linux,Assembly,X86,Segmentation Fault,每次我尝试运行代码时,都会出现分段错误。有人能告诉我是什么导致了这一切吗 编译器在Linux上,我通过PuTTY运行代码 我认为这与mov dword[esp+#]有关,但不知道如何修复它 %include "asm_io.inc" segment .data display db "Area: %d | Points: %d | Probability: %d/%d",10,0 display2 db "Expected Outsome: %d", 0 radiusone db "Enter

每次我尝试运行代码时,都会出现分段错误。有人能告诉我是什么导致了这一切吗

编译器在Linux上,我通过PuTTY运行代码

我认为这与
mov dword[esp+#]
有关,但不知道如何修复它

%include "asm_io.inc"
segment .data
display db "Area: %d | Points: %d | Probability: %d/%d",10,0
display2 db "Expected Outsome: %d", 0
radiusone db "Enter number ", 0
radiustwo db "Enter number ", 0
radiusthree db "Enter number ", 0
radiusfour db "Enter number ", 0
pointsone db "Enter number ", 0
pointstwo db "Enter number ", 0
pointsthree db "Enter number ", 0
pointsfour db "Enter number ", 0

segment .bss

r1 resd 1 ;Radius
r2 resd 1
r3 resd 1
r4 resd 1
p1 resd 1 ;Points
p2 resd 1
p3 resd 1
p4 resd 1
ca1 resd 1 ;Computed Area
ca2 resd 1
ca3 resd 1
ca4 resd 1
pi1 resd 1 ;radius*radius
pi2 resd 1
pi3 resd 1
pi4 resd 1
pb1 resd 1 ;Probability
pb2 resd 1
pb3 resd 1
pb4 resd 1
eo resd 1 ; Expected Outcome

segment .text
        global  asm_main
        extern printf
asm_main:
        enter   0,0            
        pusha

    mov eax, radiusone
    call print_string
    call read_int
    mov [r1], eax

    mov eax, radiustwo
    call print_string
    call read_int
    mov [r2], eax

    mov eax, radiusthree
    call print_string
    call read_int
    mov [r3], eax

    mov eax, radiusfour
    call print_string
    call read_int
    mov [r4], eax
    ;************************

    mov eax, pointsone
    call print_string
    call read_int
    mov [p1], eax

    mov eax, pointstwo
    call print_string
    call read_int
    mov [p2], eax

    mov eax, pointsthree
    call print_string
    call read_int
    mov [p3], eax

    mov eax, pointsfour
    call print_string
    call read_int
    mov [p4], eax
    ;************************

    mov eax, [r1]
    imul eax, [r1]
    mov [pi1], eax 

    mov eax, [r2]
    imul eax, [r2]
    mov [pi2], eax 

    mov eax, [r3]
    imul eax, [r3]
    mov [pi3], eax 

    mov eax, [r4]
    imul eax, [r4]
    mov [pi4], eax 
    ;**********************

    mov eax, [r1]
    mov [ca1], eax

    mov eax, [ca2]
    sub eax, [pi1]
    mov [ca2], eax 

    mov eax, [ca3]
    sub eax, [pi2]
    mov [ca3], eax 

    mov eax, [ca4]
    sub eax, [pi3]
    mov [ca4], eax 
    ;********************

    mov eax, [r1]
    imul eax, [p1]
    mov [pb1], eax

    mov eax, [r2]
    imul eax, [p2]
    mov [pb2], eax

    mov eax, [r3]
    imul eax, [p3]
    mov [pb3], eax

    mov eax, [r4]
    imul eax, [p4]
    mov [pb4], eax
    ;***********************

    mov eax, [pb1]
    add eax, [pb2]
    add eax, [pb3]
    add eax, [pb4]
    mov [eo], eax
    ;************************

    sub easp 10h

    push dword [pi4]
    push dword [ca1]
    push dword [p1]
    push dword [r1]


    mov dword [esp], display
    call printf
    add esp, 10h    


    popa
    mov     eax, 0           
    leave                     
    ret
更新:我使用pop函数在调用所在位置对代码进行了更改,现在它确实消除了分段错误,我现在得到的是输出,但不是我想要的值。

输出:

面积:134520364 |点数:134520380 |概率:134520396/134520424

面积:134520260 |点数:134520276 |概率:134520292/134520320

面积:134520260 |点数:134520276 |概率:134520292/134520320

应该是什么时候

面积:1 |点数:17 |概率:1/64

我没有循环设置,所以我不确定为什么打印了3行

更新2:

对我知道的“推送”建议进行了更改,使输出看起来更好…

面积:17 |点数:1 |概率:64/134519817

即使应该是:

面积:1 |点数:17 |概率:1/64

我是如何把它放在堆栈中的

1,17,1,64。。。。我的字符串是:

显示db“区域:%d |点数:%d |概率:%d/%d”,10,0

所以看起来它们是随机放置的


我是否需要添加mov dword[esp+4]显示器?seg故障源于不正确退出程序
ret
不是在Linux或Windows中退出程序的正确方法。Windows是
ExitProcess
,Linux是系统调用,或者从C库调用
exit
。在您的情况下,您正在链接到C库以使用
printf
,gcc将添加在代码之前运行的启动代码,因此您必须调用
exit
,以正确终止程序


还有其他问题,但这将修复seg故障。另外,按照mbratch提到的方法进行操作,并在调用printf后按下并调整esp来传递参数。首先,
mov dword[esp+#],…
行覆盖了
push…
行的功能,因此您应该去掉这些行。第二,您输出的数字看起来像地址——实际上,当您这样做时,即
推送pi4
,您推送的是
pi4
变量的地址。相反,您应该使用
push dword[pi4]

来推送变量的内容,看起来您只是在将参数移动到堆栈上以进行
printf
调用。您不能这样做,因为您正在覆盖堆栈上的其他项。您必须
参数推送到堆栈上,进行调用,然后将堆栈指针恢复到推之前的位置。我按照您所说的做了,它消除了分段错误,并通过不正确的输出为我提供了输出。我查看了我的代码,不知道为什么它会给我这些数字。我只能推测这些数字是记忆位置?谢谢。我现在在正确的轨道上。正在更新。仍有少量混合,但仍在进行中