2017-12-31 43 views
1

방금 ​​x86 어셈블리를 배우기 시작했고 모든 아스키 문자와 줄 바꿈을 표준 출력으로 인쇄하는 간단한 프로그램을 작성하려고했습니다. 줄 바꿈을 제외하고 예상대로 모든 것을 인쇄하기 때문에 그 이유를 알 수 없습니다. 64 비트 우분투 운영 체제에서 nasm으로 컴파일했습니다.어셈블리가 빈 줄을 인쇄하지 않습니다.

section .data 
curr db ' ' 

section .text 

global _start 

_start: 

    next: 

     ;print current character 
     mov eax,4 
     mov ebx,1 
     mov ecx,curr 
     mov edx,1 
     int 0x80 

     ;check condition and increment curr 
     inc byte [curr] 
     cmp byte [curr],126 
     jle next 

    ;new line and exit <--- doesn't work ??? 
    mov eax,4 
    mov ebx,1 
    mov ecx,10 
    mov edx,1 
    int 0x80 

    mov eax,1 
    mov ebx,1 
    int 0x80 
+2

'mov ecx, 10'이 잘못되었습니다. _ECX_는 개행 문자의 ASCII 값이 아닌 개행 문자가 들어있는 버퍼에 대한 포인터 여야합니다. 'curr'에있는 공백 문자에 대해 올바르게 처리합니다. 줄 바꿈에 대해서도 똑같이하십시오. –

+1

32 비트 코드를 실행할 수있는 Linux 배포판에 32 비트 응용 프로그램을 만드는 경우이 코드가 작동합니다. 64 비트 응용 프로그램을 만들고 싶다면'int 0x80'을 덤프하고 SYSCALL로 이동하는 것이 좋습니다.이 [정보] (http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/)를 참조하십시오. –

+1

관련 : [64 비트 코드에서 32 비트 int 0x80 Linux ABI를 사용하면 어떻게됩니까?] (https://stackoverflow.com/questions/46087730/what-happens-if-you-use-the-32 -bit-int-0x80-linux-abi-in-64-bit-code). 정적 저장소 위치 대신에 스택 공간을 사용했다면 당신의 코드는'int 0x80'으로 실패 할 것입니다. 32 비트 실행 파일로 빌드하지 않는 한 : https://stackoverflow.com/questions/36861903/assembling-32-bit-binaries-on-a-64bit-system-gnu-toolchain/36901649 –

답변

1

문제는 그 시스템 호출, ECX 포인터가 아닌 인쇄 할 문자이다 : 다음은 코드입니다. 아마도 그렇게 수정하는 것일까 요?

MOV byte [curr], 10 
MOV ECX, curr 
MOV EAX, 4 
MOV EDX, 1 
INT 0x80 
관련 문제