分段故障组件

时间:2014-04-14 14:05:04

标签: assembly x86 nasm intel

我收到以下汇编代码的分段错误,它只是打印出一条消息,虽然打印是由一个单独的函数处理的,所以我很确定我没有在堆栈上为消息分配正确的空间长度。

以下是代码:

section .data
    print_msg:      DB "H", 10, 0
    len:            equ $-print_msg 
    print_msg2:     DB "BYE WORLD", 10, 0
    len2:           equ $-print_msg2


section .text

    global main

main:
    push ebp
    mov ebp, esp

    push DWORD len
    push print_msg
    call _write

    push DWORD len2
    push print_msg2
    call _write

    leave
    ret

_write:
    push ebp
    mov ebp, esp   

    push ebx
    mov eax, 4
    mov ebx, 1
    mov ecx, [ebp+8]
    mov edx, [ebp+12]
    int 80h
    pop ebx

    leave 
    ret

1 个答案:

答案 0 :(得分:0)

  1. 您不需要在堆栈上分配任何空间,因为push会为您做到这一点。
  2. push DWORD [len]错误,因为它试图取消引用len这只是一个数字。
  3. mov ecx, [ebp+2]mov edx, [ebp+6]使用了错误的偏移量,它们应分别为+8+12ebp的堆栈布局为:saved_ebpreturn addressarg1arg2(每个4个字节)
  4. 像这样:

    section .data
        print_msg:      DB "H", 10, 0
        len:            equ $-print_msg
    
    section .text
    
        global main
    main:
        push ebp
        mov ebp, esp
        push DWORD len
        push print_msg
        call _write
        leave
        ret
    
    _write:
        push ebp
        mov ebp, esp
        mov eax, 4
        mov ebx, 1
        mov ecx, [ebp+8]
        mov edx, [ebp+12]
        int 80h
        leave
        ret
    

    PS:C调用约定要求您保留ebx,因此_write函数应该保存并恢复它。