NASM:MOV上的SegFault ECX

问题描述:

我正在尝试做一个非常简单的汇编程序运行,但是我似乎无论我做什么都会出现段错误。NASM:MOV上的SegFault ECX

这里是我的代码(应打印“A”在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段错误,但它似乎明显,我认为它应该工作。

我把它减少到几乎没有,它仍然segfault。

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的组件和我使用的标签和\ n作为新行(和空格\ t所以它看起来并不太坏

我使用NASM,我在这里运行它。 https://www.tutorialspoint.com/compile_assembly_online.php

谢谢

+1

在您的简单示例中,您必须调用_EXIT_ syscall来离开程序。 –

+0

我确实添加了一个EXIT系统调用,无效 –

+0

我使用我的帖子中的链接进行编译和运行,我不确定什么确切的操作系统,但它是一个Linux机器。 –

如果你只是想打印出一套“一个的

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\[email protected]:~/asm$ ./yvon_001 
+0

我正在写一个brainf ** k编译器,我正在做一些测试 –

+0

@SamuelYvon - 你之前在Reddit上发布过什么吗? – InfinitelyManic

+0

不!我实际上最终使它的工作我稍后会发布更详细的答案,我有其他问题,但这将是另一个职位,如果我不知道它 –

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

感谢您的意见和解答!