0

コードを実行しようとするたびに、セグメンテーション違反が発生します。これを引き起こしている原因について、誰かが私を正しい方向に向けることができますか?

コンパイラは、PuTTY 経由でコードを実行している Linux 上にあります。

私はそれが関係していると思いますが、それを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 .... とそれに対する私の文字列は次のとおりです。

display db "面積: %d | ポイント: %d | 確率: %d/%d",10,0

ランダムに配置されているように見えます

を追加する必要があり mov dword [esp + 4], display ますか?

4

2 に答える 2

0

まず、mov dword [esp + #], ...行は行の機能を上書きしているpush ...ので、それらを取り除く必要があります。次に、出力している数値はアドレスのように見えます。実際、 ieを実行すると、変数push pi4のアドレスがプッシュされます。pi4代わりに、変数の内容をプッシュする必要がありますpush dword [pi4]

于 2013-10-26T05:34:46.037 に答える