아래 블로그를 참고해서 intel환경의 homebrew를 설치
참고
apple silicon에서 인텔 빌드 앱을 실행하기 위해 로제타 설치
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
쉘에서 프로그램을 설치할 때 로제타를 이용해서 설치하게 함
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew로 새로운 툴을 설치할 때마다 로제타를 이용하게 하기위해 alias 설정
echo "alias brew='arch -x86_64 /usr/local/bin/brew'" >> .zshrc
정상적으로 homebrew가 설치되었는지 확인하기 위해 asm파일 작성후 컴파일
hello word를 출력하기 위한 asm파일section .data;data섹션
msg db "hello world",0x0A;개행문자
section .text;text섹션
global _main;전역에서 접근가능
_main :;메인함수
mov rax, 0x2000004;맥OS의 syscall write()함수 번호. 아래는 매개변수
mov rdi, 1
mov rsi, msg
mov rdx, 12
syscall;호출
mov rax, 0x2000001;맥OS의 syscall exit()함수. 아래는 매개변수
mov rdi, 0
syscall;호출
nasm -f macho64 hello.s
gcc -o hello hello.o
./hello
출력
hello world
정상적으로 어셈블리어 코드로 작성한 파일이 컴파일 되고 실행되는 것을 확인하였으니 본격적으로 어셈블리 명령어를 익히고 과제를 수행해보자
어셈블리 명령어 구조
라벨 : <명령어> <피연산자1> <피연산자2> ;주석
여기서 라벨(label) 부분은 기계어로 직접 번역되지는 않으며, 점프(jmp) 명령어를 사용하는 등 메모리 주소의 참조가 필요할 때 사용된다
label : 명령어의 집합, 명령어 또는 데이터의 주소를 나타냄
명령어 : mov, jmp등의 동작을 지시
피연산자 : 명령어의 피연산자로 레지스터, 숫자, 문자, 메모리 주소 등이 올수있다
retreturn, 함수의 동작을 마치고 (함수의) 호출 지점으로 복귀한다
함수 호출 지점의 바로 다음 위치로 이동하므로 그 다음 명령을 수행할 수 있게된다
jmp<피연산자(label)>jump, 분기(label) 실행
피연산자1을 피연산자 2로 이동
push <피연산자(레지스터)>레지스터의 값을 스택에 저장
pop <피연산자(레지스터)>스택의 값을 레지스터로 가져온다
inc <피연산자>피연산자의 값을 1 증가
dec <피연산자>피연산자의 값을 1 감소
add <피연산자1> <피연산자2>피연산자1에 피연산자2의 값을 더한다
sub <피연산자1> <피연산자2>피연산자1에 피연산자2의 값을 뺀다
cmp <피연산자1> <피연산자2>compare, 피연산자1, 2의 값을 비교한다. cmp의 결과에 따라, 아래 분기를 실행할 수 있다
a==b : JE <분기>
a!=b : JNE <분기>
a>b : JG <분기> // jump above (>=, greater)
a<b : jB <분기> // jump bellow (<=, less)
rep <명령어>repeat, 문자열 조작 명령어를 CX(rcx, ecx, cx)가 0이 될때까지 반복한다
rep mobsbSI(rsi, esi, si)의 메모리 데이터를 DI(rdi, edi, di)의 메모리로 전송한다
movsb: byte단위 (1byte)
movsw: word단위 (4byte)
movsd: double단위 (8byte)

31 ~~ 16 | 15 ~ 8 | 7 ~ 0 | 16bit | 32bit |

일반 레지스터 4개
일반 주소 레지스터 4개
RIP, 비 일반 주소 레지스터 1개
시스템 호출 번호 : rax
반환 주소 : rcs
레지스터 플래그 : r11
매개변수 : (순서대로) rdi, rsi, rdx, r10, r8, r9
반환값은 일반적으로 rax레지스터로 넘겨진다
정수 : rax(하위 64bit), rdx(상위 64bit)
실수 : xmm0 (하위 128bit), xmm1 (상위 128bit)