[STUDY] 어셈블리어 - 2

2023. 2. 23. 01:17코딩/공부 [STUDY]

반응형

1. 과제 

목표 > 파일을 생성하여 Hello world!을 작성하고 저장하기

 

section .data
    filename db "example.txt", 0
    text db "Hello, world!", 10, 0

section .text
    global _start

_start:
    mov rax, 2
    mov rdi, filename
    mov rsi, 0101o   
    mov rdx, 0644o
    syscall 
    mov rbx, rax   

    mov rax, 1
    mov rdi, rbx
    mov rsi, text
    mov rdx, 14
    syscall

    mov rax, 3
    mov rdi, 0
    syscall

    mov rax, 60 
    mov rdi, 0
    syscall

결과 > 정상적으로 example.txt 가 생성이 되고, Hello world!가 출력된다.


2. code review

.data 세그먼트

filename이라는 변수에 example.txt 라는 값을 넣는다.

text라는 변수에 "Hello world!"를 넣는다.

 

.text 세그먼트

별거 없으니 생략함

 

_start 

크게 4개의 부분으로 나뉘어 있는 것을 볼 수 있는데,

위에서 부터 

open,write,close,exit 이다.

 

open(filename,flags,mode)

rdi에 filename을 넣어준다.

flags에는 0101o 가 들어가고 

그 아래 rdx에는 0644o가 적혀있다.

 

https://coding-today.tistory.com/21

 

[Linux] 리눅스 권한(Permission) 설정(8진수 표기)

멀티유저 운영체제인 리눅스는 보안을 위해 파일, 디렉토리에 대한 권한, 소유자, 그룹을 설정 ▷ 권한 - 읽기(r) : 조회 - 쓰기(w) : 등록, 수정, 삭제 - 실행(x) : 실행 ▷ 권한 정보 rwxr-xr-x - rwx : 소

coding-today.tistory.com

해당 블로그를 참고하면 좋을 것 같다.

참고로 뒤에 붙은 o는 8진수를 의미한다고 한다.

그리고 syscall 바로 아래에 rbx에 rdi 값을 넘겨주는데, 이는 아래에서 수행 할

write에서 1번째 인자에 들어가는 fd(파일 디스크럽터) 부분에 넘겨준다.

 

write(fd,*buf,count)

fd에는 2가 들어갔고 buf에는 text가, count에는 Hello world!의 길이인 14가 들어간 것을 확인 할 수있다.

 

close(fd)

close는 별게 없는데, 그냥 close를 호출하고 이후에 fd에 0을 넣어주며 정상적으로 파일을 닫는다.

 

exit(error_code)

에러가 없음을 확인하는 0을 넣어주며 정상적으로 코드를 종료한다.

반응형