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
'mov ecx, 10'이 잘못되었습니다. _ECX_는 개행 문자의 ASCII 값이 아닌 개행 문자가 들어있는 버퍼에 대한 포인터 여야합니다. 'curr'에있는 공백 문자에 대해 올바르게 처리합니다. 줄 바꿈에 대해서도 똑같이하십시오. –
32 비트 코드를 실행할 수있는 Linux 배포판에 32 비트 응용 프로그램을 만드는 경우이 코드가 작동합니다. 64 비트 응용 프로그램을 만들고 싶다면'int 0x80'을 덤프하고 SYSCALL로 이동하는 것이 좋습니다.이 [정보] (http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/)를 참조하십시오. –
관련 : [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 –