2017-05-01 30 views
0

我正在嘗試做一個非常簡單的彙編程序運行,但是我似乎無論我做什麼都會出現段錯誤。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機器。 –

回答

0

如果你只是想打印出一套「一個的

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

不!我實際上最終使它的工作我稍後會發布更詳細的答案,我有其他問題,但這將是另一個職位,如果我不知道它 –

0

最後@MichealPetch是對的,我需要在代碼的最後添加一個EXIT系統調用。我試過的示例仍然執行SEGFAULT,因爲我在註冊表中移動指針而不是[指針]。

感謝您的意見和解答!