0

まず最初に、これ、これ、およびこの質問を読んだということから始めたい思います。それでも、これらの質問に対して提供された回答はどれも、私の質問に答えるのに十分ではなく、十分な詳細情報を持っていませんでした. さらに、それらはすべて 4 ~ 6 年前のものであり、時代遅れになっています。そうは言っても、ここで新しい質問を開きました。

NASM 構文を使用して Linux 32 ビット アセンブリで 1 ~ 4 行列を表示する簡単なプログラムを作成しようとしています。単純な 1x1 行列を出力する手順を作成しました。

section .data
    msg1:       db 'output:', 10
    msg1len:    equ $-msg1

    endmsg:     db 10

    m1r1:       db '5'

    m2r1:       db '1', '4'
    m2r2:       db '2', '6'

    m3r1:       db '8', '3', '4'
    m3r2:       db '9', '2', '1'
    m3r3:       db '1', '5', '6'

    m4r1:       db '6', '3', '1', '7'
    m4r2:       db '1', '9', '8', '4'
    m4r3:       db '5', '0', '1', '2'
    m4r4:       db '2', '7', '1', '0'

section .bss
    output1:    resb 5
    output2:    resb 7*2
    output3:    resb 9*3
    output4:    resb 11*4


section .text
    global  _start

_start:
    mov eax, 1
    call printMatrix


_exit:
    mov eax, 0
    mov ebx, 1
    int 80h

;description:
;   displays a visual representation of
;   a matrix from size 1 through 4
;parameters:
;   eax - matrix size
printMatrix:
    push eax
    push ebx
    push ecx
    push edx
    push esi

    cmp eax, 1
    je .printMatrix1

    cmp eax, 2
    je .printMatrix2

    cmp eax, 3
    je .printMatrix3

    cmp eax, 4
    je .printMatrix4

.printMatrix1:
    mov eax, '[ '
    mov [output1], eax
    mov eax, m1r1
    mov [output1 + 2], eax
    mov eax, ' '
    mov [output1 + 3], eax
    mov eax, ']'
    mov [output1 + 4], eax

    mov eax, 4
    mov ebx, 1
    mov ecx, [output1]
    mov edx, 5
    jmp .exit

.printMatrix2:

    jmp .exit

.printMatrix3:

    jmp .exit

.printMatrix4:

    jmp .exit

.exit:
    pop esi
    pop edx
    pop ecx
    pop ebx
    pop eax
    ret

printEndl:
    push eax
    push ebx
    push ecx
    push edx
    mov eax, 4
    mov ebx, 1
    mov ecx, endmsg
    mov edx, 1
    int 80h
    pop edx
    pop ecx
    pop ebx
    pop eax
    ret

しかし、次の方法でコンパイルすると:

nasm -f elf32 matrix.asm

そして、次を使用してリンクします。

ld -m elf_i386 -s -o matrix matrix.o

エラーや警告はまったく表示されませんが、プログラムを実行する./matrixsegmentation fault (core dumped)エラーが発生します。ここで、この質問は、セグメンテーション違反とは何か、およびそれが通常何によって引き起こされるのかについて、かなり適切な定義を提供したことに注意する必要がありますが、少し不明確でした. 私が求めるものは:

  1. メモリとアセンブリに関するセグメンテーションの適切な説明/定義。
  2. この特定のケースでの障害の原因(最初と 2 番目のリンクによると、ジャンプまたは呼び出しプロシージャとスタックに関係があると思われます。しかし、原因を突き止めようと何時間もここに座っていましたそれは成功しませんでした)
  3. このような障害を回避する方法と、推奨される今後のプラクティス。
4

0 に答える 0