"A" 문자를 반복해서 출력하는 프로그램을 어셈블리어로 만들어보자.
[그림 1-1] 은 우선 "A" 문자가 출력되어야 하기 때문에 write call 작성한 것이다.
section .data 는 데이터가 존재하는 부분이다. "A" 문자가 메모리에 존재하고 msg 변수가 가리키고 있다.
section .text 는 실제 코드가 존재하는 부분이다. 위에서 아래로 차례대로 실행된다. _start 함수는 프로그램 시작시 가장 먼저 실행되는 함수이다.
nasm -f elf64 -o loop.o loop.s : 목적어 코드로 변환
ld -o loop loop.o : 링킹 과정을 거쳐 프로그램으로 만듬
[그림 1-4] 확인하면 A가 출력되었다. 세그먼테이션 오류는 프로그램이 정상 종료가 안되어서 출력된것이다.
[그림 1-5] 같이 rax 에 60을 넣고 syscall 하면 정상 종료가 된다.
rax에 60 넣는 이유는 시스템콜 60번이 sys_exit 이기 때문이다.
컴파일 후 확인하면 세그먼테이션 오류가 안뜬다.
[그림 2-1] "A" 문자을 100번 출력하는 반복문이다.
자주 사용하지않는 r10 레지스터에 1을 넣고 again 함수에서 100 과 비교하여 같으면 done 함수로 이동하여 프로그램이 종료되고 그렇지 않으면 syscall 하여 rax 에 1 이 있기 때문에 "A"출력후 r10 값을 1 증가 시킨다.
17 줄에서 rax 에 1을 넣는 이유는 syscall 후 함수 반환값이 rax 에 들어가기 때문에 1로 변경시켜야한다.
"A" 문자를 출력하는 반복문이 완성되었다.
'tmp' 카테고리의 다른 글
공유 라이브러리와 링커/로더 (0) | 2022.12.12 |
---|