2017-05-01 8 views
0

私は非常に単純なアセンブリプログラムを実行しようとしていますが、私は何でもsegfaultsを取得するようです。NASM:SegFault on MOV ECX

はここに私のコードです

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にセグメンテーションフォルトが発生するが、それが動作するはずですように私には明らかと思われる(「」Linuxマシン上で印刷する必要があります)。

私はほとんど何もそれを減らし、それはまだ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_システムコールを呼び出す必要があります。 –

+0

私はEXITシステムコールを無用に追加しました –

+0

コンパイルして実行するために私のポストにリンクを使っていますが、正確なOSは何かわかりませんが、それは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を行った。

コメントと回答ありがとう!

関連する問題