为什么在一个简单的32位linux汇编程序中存在一个segmentaion错误?

时间:2016-05-08 14:59:55

标签: linux assembly nasm x86-emulation

首先,我想首先说我已经阅读thisthisthis question。然而,就这些问题提供的答案都没有足够/足够详细的信息来回答我的问题。而且,他们都是4-6岁,这使他们过时了。话虽如此,我在这里开了一个新问题。

我正在尝试制作一个简单的程序,在Linux 32位汇编中使用NASM语法显示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

我没有收到任何错误/警告,但是当我使用./matrix运行程序时出现segmentation fault (core dumped)错误。 现在我必须注意this question为什么是分段错误及其通常由什么引起的问题提供了一个相当好的定义,但有点不清楚。我寻求的是:

  1. 在内存和装配方面对分段的正确解释/定义。
  2. 在这个特殊情况下导致错误的是什么(根据第一和第二个链接,我怀疑它与跳转或调用程序和堆栈有关。但是我一直坐在这里几个小时试图弄清楚是什么导致它没有成功)
  3. 如何避免这种错误并建议未来的做法。

0 个答案:

没有答案