NASM:MOV ECX上的SegFault

时间:2017-05-01 01:21:12

标签: linux assembly x86 segmentation-fault nasm

我试图制作一个非常简单的汇编程序,但无论我做什么,我似乎都会遇到段错误。

这是我的代码(应该在Linux机器上打印'

section .data
    buffer times 50 db 97
    pointer db 0
section .text
    global _start
    _start:
    mov ECX , pointer
    mov EDX , [buffer + ECX]
    mov EAX , 4
    mov EBX , 1
    mov ECX , EDX
    mov EDX , 1
    int 0x80

它会导致第一个MOV出现段错误,但我觉得它应该可行。

我把它减少到几乎没有,它仍然是段错误。

section .data
    msg db "hello"
section .text
    global _start
    _start:
    mov EAX,1

我成功地运行了这个:

section .text
    global _start
_start:

    mov ax, 0b
    dec ax
    sub ax, 11111111b

    mov bx, 97

    add ax, bx

    mov [INVENTORY], ax ; put a in first inventory pos


    mov eax, 4        
    mov ebx, 1
    mov ecx, INVENTORY      
    mov edx, 1        
    int 0x80

    mov ax, [INVENTORY]
    add ax, 1
    mov [INVENTORY + 1], ax ; put b in second inventory pos
    mov [VAR], ax

    mov eax, 4        
    mov ebx, 1
    mov ecx, VAR    
    mov edx, 1        
    int 0x80

    mov eax, 4        
    mov ebx, 1
    mov ecx, '\n'         
    mov edx, 1        
    int 0x80

    mov eax,1
    int 0x80

_newline:


section .data

VAR DW 0
INVENTORY TIMES 8 DW 0

是否可能与我用于换行符或标签的符号有关?我从java生成程序集,我使用\ t作为标签,\ n \ n表示新行(和空格,所以它看起来不太糟糕。

我正在使用NASM并且我在这里运行它: https://www.tutorialspoint.com/compile_assembly_online.php

谢谢!

2 个答案:

答案 0 :(得分:0)

如果你只是想打印一套'a'。

section .data
        buffer times 50 db 97
        len.buffer equ $-buffer
        pointer db 0
section .text
    global _start

_start:
        ; ssize_t write(int fd, const void *buf, size_t count);
        ; i386             ebx              ecx            edx   esi   edi   ebp
        mov EAX , 4             ; write syscall
        mov EBX , 1             ; std out
        lea ecx, [buffer]       ; buffer
        mov edx, len.buffer     ; size
        int 0x80

_exit:
        mov eax, 1              ; exit syscall
        int 0x80

输出:

./yvon_001
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ndavid@ubuntuserver00A:~/asm$ ./yvon_001

答案 1 :(得分:0)

最后@MichealPetch是对的,我需要在代码末尾添加一个EXIT系统调用。我试过的样本仍然做了一个SEGFAULT,因为我在注册表中移动指针而不是[指针]。

感谢您的评论和解答!