No img


Assembly -2. 기본 문법, 명령

Posted by 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만 실행 중에 계산된 주소를 얻을 수 있다!

(자세한 내용은 아래 주소 참고)

-> https://enes.tistory.com/entry/MOVE%EC%99%80-LEA-%EB%AA%85%EB%A0%B9%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

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

https://kali-km.tistory.com/entry/C%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC-%EB%B3%80%ED%99%98

'CS > Assembly' 카테고리의 다른 글

Assembly -4. for문 구현  (0) 2020.05.26
Assembly -3. 간단한 에코 프로그램  (1) 2020.05.25
Assembly -1. HelloWorld!  (0) 2019.07.06