멈추지 않고 끈질기게
[기타][저장용] 어셈블리 언어 본문
대입
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)
- 해당 명령어를 만난 순간 이 함수를 호출했던 라인으로 복귀, 스택 메모리에서 이 함수 관련 데이터 제거
- 메인 함수일 경우 프로세스 종료
'기타' 카테고리의 다른 글
[기타][메모용] 행렬의 변환 (0) | 2023.10.23 |
---|---|
[기타][메모용] 길찾기 관련 (0) | 2023.08.06 |
[Photon][저장용] IP 변경 시 설정 (0) | 2023.06.03 |
[기타] 모바일 디바이스의 특징 (0) | 2023.02.14 |
[기타] 얕은 복사 vs 깊은 복사 (0) | 2023.01.28 |