2016-12-16 1 views
0

최근에 어셈블리에 들어가기 시작했고 튜토리얼을 쉽게 찾을 수 있기 때문에 NASM을 사용하고 있습니다. 그 어려움 때문에 나는 1과 3을 더하고 4를 더하는 프로그램을 만들어서 아주 작게 시작하겠다고 결심했다. 나는 오류나 경고 메시지를받지 못했지만 충분히 배제했다. sh-4.3 $.이 NASM 어셈블리가 더 무엇이 문제입니까?

segment .text 
    global _start 
_start: 
    mov eax, '1' 
    sub eax, '0' 

    mov ecx, '3' 
    sub ecx, '0' 

    add ecx, eax 
    add ecx, '0' 

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

    mov eax, 1 
    int 0x80 
+0

개발자가 어떤 OS를 사용합니까? Windows라면 SASM을 ide 및 디버거로 사용하는 것이 좋습니다. 학습하는 것이 좋습니다. 각 레지스터의 값을 단계별로 살펴볼 수 있습니다. https://dman95.github.io/SASM/english.html – Eric

+0

다양한 문제로 NASM과 함께 모든 것을 실제로 연습해야합니다. http://www.tutorialsp.com/.com/codingground.htm. 내가 이해하는 바에 따르면, 터미널은 Linux OS를 에뮬레이션합니다. –

+0

기회가 있다면 추천 할만합니다. 불행하게도, 튜토리얼 스 코딩 코딩 그라운드에는 디버거가 연결되어 있지 않습니다. – Eric

답변

1
은 다음 변수를 표시 변수로 결과를 이동

:

section .data 
    result : db ' ',10   ◄■■ VARIABLE 
segment .text 
    global _start 
_start: 
    mov eax, '1' 
    sub eax, '0' 

    mov ecx, '3' 
    sub ecx, '0' 

    add ecx, eax 
    add ecx, '0' 
    mov [result], cl   ◄■■ MOVE RESULT INTO THE VARIABLE. 

    mov ecx, result   ◄■■ DISPLAY THIS VARIABLE. 
    mov edx, 1 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 

    mov eax, 1 
    int 0x80  

당신은 ECX에서 변수의 주소 값이 아닌 자체를 저장해야합니다.

+0

오, 이제 나는 바보 같아. sys_write 시스템 콜은 ecx에서 const char * 입력을 받았다. 이제 이해가된다. 즉, 레지스터 중 하나의 "메모리 주소"를 사용할 수있는 가능한 방법은 무엇입니까? –

+0

죄송합니다. 레지스터 주소 지정을 사용할 수 있다는 것을 알았습니다. 고맙습니다. Jose –

+1

@ N.D.H .: strace./a.out으로 프로그램을 실행하면 문제가 발생합니다. 당신은 잘못된 포인터를 전달하기 때문에 시스템 호출에'write (...) = -EFAULT'라고 표시됩니다. –

관련 문제