CS/Assembly
Assembly -2. 기본 문법, 명령
bonggang
2019. 7. 7. 01:05
1. 어셈블리 문법 종류
어셈블리언어는 Intel과 AT&T 두가진 문법을 가지고 있다.
Intel 문법 | AT&T 문법 | |
레지스트리 표현 | eax | %eax |
상수 표현 | h(16진수), b(2진수), o(6진수) ex) 80h |
$숫자 ex) $0x80 |
operands 위치 | destination, source | source, destination |
메모리 주소 참조 | [eax] | (%eax) |
레지스터+offset 위치 | [eax+숫자] | 숫자(%eax) |
+) 어셈블리 데이터 타입
- db: 바이트(Byte), 1byte 데이터 항목
- dw: 워드(Word): 2bytes 데이터 항목
- dd: 더블워드(Double Word): 4bytes 데이터 항목
- dq: 쿼드워드(Quad Word): 8bytes 데이터 항목
2. 어셈블리 기본 문법 및 명령
명령어 | 내용 |
mov | 데이터 복사 ex) mov eax, 1 -> eax에 1을 넣어라. (int eax = 1;) *레지스터에서는 같은 사이즈의 데이터끼리만 복사 가능 |
movzx | mov 명령의 확장 명령 |
lea | 지정한 주소 값을 가져오는 명령어, 연산을 포함하여 복사 ex) lea eax, [eax+1000] -> eax에 1000을 넣은 값을 다시 eax에 삽입 |
cmp | 비교 명령어, 본 명령어로 설정한 플래그에 따라 조건 분기 명령 변경 |
jmp | 특정 위치로 건너 뛰어 코드 실행 |
call | 프로시저(함수) 호출 명령 |
ret | 복귀 명령 |
nop | 작업 x , 1byte 빈 공간 차지 |
push | 스택에 값 삽입 |
pop | 스택 값을 빼낸다 |
* call과 jmp의 차이: call은 호출되고 난 후 이전에 실행 중이던 프로시져로 복귀를 해야한다. jmp는 복귀를 하지않는다(즉, ret 명령이 필요 없음)
*mov와 lea의 차이: mov는 데이터 값을 옮겨주는 것. lea는 메모리 주소 값을 레지스터에 옮기는 것. lea만 실행 중에 계산된 주소를 얻을 수 있다!
(자세한 내용은 아래 주소 참고)
3. C 기본 문법 어셈블리 변환
리턴 호출
c언어
#include <stdio.h>
int main(){
return 0;
}
어셈블리
int 선언
c언어
#include <stdio.h>
int main(){
int a = 1;
return 0;
}
어셈블리
print 함수
c언어
#include <stdio.h>
int main(){
printf("Hello");
}
어셈블리
scanf 함수
c언어
#include <stdio.h>
int main(){
int a;
scanf("%d", &a);
return 0;
}
어셈블리
참고 자료
https://security-nanglam.tistory.com/83
https://huammmm1.tistory.com/492
https://whiteroan.tistory.com/entry/002Assembly
https://m.blog.naver.com/s2kiess/30181287608
http://blog.naver.com/PostView.nhn?blogId=ndb796&logNo=221054682271