tmp

어셈블리어로 반복문 구현

oogu ㅣ 2022. 9. 26. 15:21

 

"A" 문자를 반복해서 출력하는 프로그램을 어셈블리어로 만들어보자.

[그림 1-1]

[그림 1-1] 은 우선 "A" 문자가 출력되어야 하기 때문에 write call 작성한 것이다.

section .data 는 데이터가 존재하는 부분이다. "A" 문자가 메모리에 존재하고 msg 변수가 가리키고 있다.

section .text 는 실제 코드가 존재하는 부분이다. 위에서 아래로 차례대로 실행된다. _start 함수는 프로그램 시작시 가장 먼저 실행되는 함수이다.

[그림 1-2]
[그림 1-3]

nasm -f elf64 -o loop.o loop.s   :  목적어 코드로 변환

ld -o loop loop.o  : 링킹 과정을 거쳐 프로그램으로 만듬

[그림 1-4]

[그림 1-4] 확인하면 A가 출력되었다. 세그먼테이션 오류는 프로그램이 정상 종료가 안되어서 출력된것이다.

[그림 1-5]

[그림 1-5] 같이 rax 에 60을 넣고 syscall 하면 정상 종료가 된다.

rax에 60 넣는 이유는 시스템콜 60번이 sys_exit 이기 때문이다.

[그림 1-6]

컴파일 후 확인하면 세그먼테이션 오류가 안뜬다.

[그림 2-1]

[그림 2-1] "A" 문자을 100번 출력하는 반복문이다.

자주 사용하지않는 r10 레지스터에 1을 넣고 again 함수에서 100 과 비교하여 같으면 done 함수로 이동하여 프로그램이 종료되고 그렇지 않으면 syscall 하여 rax 에 1 이 있기 때문에 "A"출력후 r10 값을 1 증가 시킨다.

17 줄에서 rax 에 1을 넣는 이유는 syscall 후 함수 반환값이 rax 에 들어가기 때문에 1로 변경시켜야한다.

 

[그림 2-2]

"A" 문자를 출력하는 반복문이 완성되었다.

'tmp' 카테고리의 다른 글

공유 라이브러리와 링커/로더  (0) 2022.12.12