멈추지 않고 끈질기게

[기타][저장용] 어셈블리 언어 본문

기타

[기타][저장용] 어셈블리 언어

sam0308 2023. 2. 28. 09:12

대입

mov

- ex) mov al, 1 (al = 1) / mov al, bl (al = bl)

- 값을 대입하는 명령어

 

사칙연산

add

- ex) add al, 1 (al = al + 1) / add al, bl (al = al + bl)

- 덧셈 연산

- 피연산자 두개가 모두 메모리값이면 안됨

 

sub 

- ex) sub al, 1 (al = al - 1) / sub al, bl (al = al - bl)

- 뺄셈 연산

 

mul

- ex) mul bl (bl * al) / mul bx (bx * ax)

- 곱셈 연산

- 피연산자와 사이즈에 맞는 a레지스터를 곱함(bl * al, bx * ax)

- 1바이트 곱셈의 경우 결과값을 al에 저장

- 2바이트 곱셈의 경우 상위 16비트는 dx에, 하위 16비트는 ax에 저장

 

div

- ex) div bl (al = ax / bl, ah = ax % bl) 

- 나눗셈 연산

- 기본적으로 ax레지스터를 피젯수로 사용하며 몫은 al, 나머지는 ah에 저장

 

쉬프트 연산자

shl

- ex) shl eax, 8

- 대상의 모든 비트를 왼쪽으로 n칸 이동시킴

- 상위 n개 비트가 소실됨

 

shr

- ex) shr eax, 8

- 대상의 모든 비트를 오른쪽으로 n칸 이동시킴

- 하위 n개 비트가 소실됨

 

논리 연산자

not

- ex) not al (al = ~al)

- not 연산 실행(대상의 모든 비트 반전 / 0 -> 1, 1 -> 0)

 

and

- ex) and al, bl (al = al & bl)

- and 연산 실행(비트마다 둘 다 1이면 1, 나머지는 0)

 

or

- ex) or al, bl (al = al | bl)

- or 연산 실행(비트마다 하나라도 1이면 1, 나머지는 0)

 

xor

- ex) xor eax, ebx (eax = eax ^ ebx)

- xor 연산 실행(비트마다 서로 다르면 1, 같으면 0)

- 자기 자신을 xor할 경우 0이 됨(mov로 0을 대입하는 것보다 효율적)

 

비교 연산자

cmp

- ex) cmp eax, ebx 

- 비교 연산 실행(왼쪽 피연산자가 오른쪽 피연산자보다 큰지 작은지 저장)

- 비교 결과는 Flag 레지스터에 별도로 저장됨

- Flag 레지스터에 저장된 결과는 하기 서술할 jmp 계열 명령어의 기준이 됨

 

분기

jmp

- ex) jmp LABEL_JUMP

- 해당 라벨로 무조건 이동

 

je

- ex) je LABEL_EQUAL

- cmp 결과 동일하다면 해당 라벨로 이동

- 조건 불만족 시 하단의 코드로 넘어감

 

jne

- ex) jne LABEL_NOT_EQUAL

- cmp 결과 동일하지 않다면 해당 라벨로 이동

- 조건 불만족 시 하단의 코드로 넘어감

 

jg / jge

- ex) jg LABEL_GREATER / jge LABEL_GREATER_EQUAL

- cmp 결과 더 크다면 해당 라벨로 이동(jg) / 크거나 같다면 이동(jge)

- 조건 불만족 시 하단의 코드로 넘어감

 

jl / jle

- ex) jl LABEL_LESS / jle LABEL_LESS_EQUAL

- cmp 결과 더 작다면 해당 라벨로 이동(jl) / 작거나 같다면 이동(jle)

- 조건 불만족 시 하단의 코드로 넘어감

 

반복문

loop

- ex) loop LABEL_LOOP

- 카운트와 점프를 함께 수행(카운트는 ecx 레지스터를 이용)

- mov ecx 10 과 같이 ecx 레지스터에 반복할 횟수 설정 후 사용

- ecx 값을 1 감소시킨 후 0보다 크면 해당 라벨로 이동 / 0일 경우 하단의 코드로 넘어감

- 루프 중간에 ecx값을 임의로 변화시킬 경우 예기치 못한 상황이 발생할 수 있으니 주의

 

스택 메모리 관련

push

- ex) push rbp / push 1

- 스택 메모리에 해당 레지스터 주소 / 값 추가

- 임의로 스택 메모리에 데이터 추가 시 추가한 만큼 pop해서 rsp 주소를 복원해야 함

  (안할 경우 크래시 유발)

 

pop

- ex) pop rax 

- 스택 메모리에 가장 마지막에 저장된 값을 레지스터에 저장 후 스택에서 삭제

- push를 사용한 적이 없는 상태에서 사용 시 크래시 유발(rsp 주소가 꼬임)

 

기타

inc

- ex) inc al (al = al + 1)

- 해당 레지스터 값을 1 증가시킴(increase)

- add를 사용할 때보다 효율적이므로 1 증가시엔 해당 명령어 사용 권장

 

dec

- ex) dec al (al = al - 1)

- 해당 레지스터 값을 1 감소시킴(decrease)

- sub를 사용할 때보다 효율적이므로 1 감소시엔 해당 명령어 사용 권장

 

ret

- 함수 종료 선언(return)

- 해당 명령어를 만난 순간 이 함수를 호출했던 라인으로 복귀, 스택 메모리에서 이 함수 관련 데이터 제거

- 메인 함수일 경우 프로세스 종료