“Hello World!” 프린트
우선 “Hello world!” 메시지를 저장하고 텍스트 영역에 코드를 저장합니다. 그리고 코드를 작성
rax를 먼저 이동합니다. 1은 Write가 시스템 호출로 호출되도록 합니다. 다음으로 mov rdi를 사용하여 파일 설명자를 1, 1로 설정하여 출력 모드로 전환하고 mov rsi, msg를 사용하여 메시지를 배치합니다. mov rdx, 13을 사용하여 Hello World! 메시지의 길이가 13자임을 나타내고 syscall을 입력하여 호출합니다. 다음으로 mov rax, 60 mov rdi, 0으로 끝납니다.
|
하나
2
삼
4
5
6
7
8일
9
10
11
12
13
14
15
16
|
섹션.데이터
msg db “안녕하세요!”
섹션.텍스트
global_start
_시작하다:
재배치, 1
이동 rdi, 1
mov rsi, msg
movrdx, 13
시스템 호출
이동, 60
모브르디, 0
시스템 호출
|
CS |
에코 프로그램 생성
먼저 Linux syscall 테이블에서 숫자 0을 읽습니다. 따라서 rax는 0을 할당해야 합니다. 다음으로 rbx, rcx 및 rdx에 0으로 초기화된 rax 값을 할당하고 0으로 초기화합니다. 다음으로 sub rsp, 64는 내가 입력한 문자를 저장할 공간을 만들기 위해 rsp에서 64를 뺍니다. 다음으로 mov rdi, 0을 설정하여 fd(파일 설명자)를 0으로 설정합니다. 이것은 표준 입력을 얻기 위한 것입니다. 다음으로 rsp 값을 rsi에 할당하여 문자열의 포인터 위치를 설정합니다. 그리고 mov rdx, 63으로 문자 길이를 63으로 설정합니다.
이제 메모리에 저장된 문자열을 반환하는 함수를 만들고 먼저 mov rax, 1을 설정하여 syscall을 작성합니다. 그리고 fd가 1(기본 출력)이 되도록 mov rdi, 1을 설정합니다. 그리고 mov rsi, rsp를 설정하여 저장된 위치 rsi를 할당하고 mov rdx, 63 of 63을 로드하도록 구성합니다.
마지막으로 위와 같이 mov rax, 60을 시스템 호출로 사용하여 exit를 호출하면 완료됩니다.
|
하나
2
삼
4
5
6
7
8일
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
섹션.텍스트
글로벌_스타트
_시작하다:
xor 랙스, 랙스
mov rbx, 랙스
mov rcx, 랙스
mov rdx, 랙스
rsp에서, 64
모브르디, 0
mov rsi, resp
movrdx, 63
시스템 호출
재배치, 1
이동 rdi, 1
mov rsi, resp
movrdx, 63
시스템 호출
이동, 60
시스템 호출
|
CS |
루프 사용
반복 출력할 문자를 데이터에 저장한 후 r10 레지스터를 카운터로 하여 해당 문자를 100번 출력한다. 안녕하세요 세계! 출력은 의 예제 출력과 유사하지만 루프문 부분에서 차이가 있습니다.
다시 들어가서 cmp r10 후에 100 je done을 입력하고 조건을 끊습니다. 즉, 카운터가 100에 도달하면 완료됩니다. 다음으로 syscall로 출력한 후 rax를 다시 1로 할당하는 mov rax, 1을 삽입하고 inc r10으로 카운터를 1씩 증가시킵니다. 처음으로 돌아가려면 jmp를 다시 설정하십시오.
완료의 경우 위의 예와 같이 종료 시스템 호출을 발행하십시오.
|
하나
2
삼
4
5
6
7
8일
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
섹션.데이터
msg DB “A”
섹션.텍스트
글로벌_스타트
_시작하다:
재배치, 1
이동 rdi, 1
mov rsi, msg
movrdx, 1
운동 r10, 1
다시 한번:
cmp r10, 100
끝났어
시스템 호출
재배치, 1
r10 포함
다시 점프
완전한:
이동, 60
모브르디, 0
시스템 호출
|
CS |
