2017-05-01 1 views
0

아주 간단한 어셈블리 프로그램을 실행하려고합니다.하지만 내가하는 일이 무엇이든간에 segfaults를 얻는 것처럼 보입니다.NASM : MOV ECX의 SegFault

여기 내 코드입니다

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에 세그먼트 폴트가 발생하지만, 작동해야 나에게 분명한 것 같다 ('A'는 리눅스 시스템에서 인쇄해야합니다).

나는 그것을 거의 없애 버렸고, 여전히 세그 폴트합니다.

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 

그것이 내가 줄 바꿈이나 탭에 사용하는 기호를 함께 할 수있다 가능한가 :

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

나는이 성공적으로 실행 한? 내가 자바에서 어셈블리를 생성하고 탭을 위해 \ t를 사용하고 새로운 라인을 위해 \ n을 사용한다. (그래서 공백이 너무 나쁘지 않다.)

나는 NASM을 사용 중이며 여기에서 실행 중이다 : https://www.tutorialspoint.com/compile_assembly_online.php

감사합니다

+1

간단한 예제에서 프로그램을 종료하려면 _EXIT_ syscall을 호출해야합니다. –

+0

쓸데없이 시스템 종료를 추가했습니다. –

+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

브리프 ** k 컴파일러를 작성 중입니다. –

+0

@SamuelYvon 전에 몇 가지 테스트를하고 있습니다. 이전에 Reddit에 게시 했습니까? – InfinitelyManic

+0

아니요! 나는 실제로 그것을 만든다. 나는 나중에 더 상세한 대답을 게시 할 것이다. 나는 다른 이슈들을 가지고있다. 그러나 그것을 이해하지 못한다면 다른 포스트가 될 것이다. –

0

결국 @MichealPetch가 맞았으므로 코드 끝 부분에 EXIT 시스템 콜을 추가해야했습니다. 내가 레지스트리에서 [포인터] 대신 포인터를 이동했기 때문에 나는 시도한 샘플을 SEGFAULT했습니다.

의견과 답변에 감사드립니다!