본 게시물은 책 게임처럼 쉽고 재미있게 배우는 어셈블리 언어 튜토리얼 - 북스 홀릭 - 책을 참고하였습니다.
LINE 1
: OS에 무관한 입출력 매크로 함수를 지원하기 위한 SASM 제공 메타 함수.
LINE 3
: text section으로 실행되는 코드가 기술되어 잇음 . [ text section 영역 LINE 3~ LINE 8 ].
LINE 4
: 프로그램이 시작되는 주소를 정의. 프로그램 시작시 LINE5 부터 시작된다 .
LINE 9 10
: 프로그램 종료 OS로 제어를 돌려줌.
---
Section 은 공통 블록[특정 데이터 혹은 명령어를 모아놓는곳 ]으로 생각해라.
에셈블리 언어에서 메모리를 사용하기
메모리를 사용하기 위해 결정해야 하는 두가지
1. 메모리의 크기 결정
2. 메모리의 위치를 결정
-> 메모리의 크기를 결정할수 있지만 메모리에서 사용할 주소는 알 수 없으므로 심벌로 결정후 바이너리로 변경할 때 결정하도록 하는 방법을 취한다.
상위 레벨에서 변수라는 개념으로 사용함 . 즉 변수 : 메모리의 시작 주소 와 메모리 크기를 의미한다.
변수의 특성 1. 시작 주소, 2. 저장값, 3. 데이터 크기.
Section .bss 블록
초기화 되지 않은 변수는 section .bss블록에 선언.
사용하고자 하는 크기와 변수 개수를 지정하면된다.
section .bss
변수 이름 크기 지시자 개수
*[크기 지시자]
resb : 1byte, resw : 2byte, resd : 4byte , resq : 8byte
section .data 블록
초기값이 결정된 변수 선언 예시
section .data
변수 이름 크기지시자 초기값
[크기 지시자]
db : 1byte , dw: 2byte , dd: 4byte, dq: 8byte
*초기값을 가지고 선언된 변수도 section .data 블록의 변수는 코드에서 변경이 가능 .
mov : 메모리에 데이터를 보내는 명령어
메모리 변수이름 : 주소 값
[변수이름 ] : 주소가 가리키는 곳의 값
ex] mov ax ,[a] : 변수 a에 저장되어 있는 값을 AX 레지스터에 복사해 오는것.
PRINT_HEX 바이트수 , 레지스터 변수이름 : 레지스터 , 변수 값을 16진수로 출력
PRINT_DEC 바이트수 , 레지스터 변수이름 : 값을 10진수로 출력
NEWLINE : 화면에 줄 변경을 출력
(SASM 에서 출력하는 메크로 함수 )
문자열 선언하고 출력하기
PRINT_STRING para
-para : 출력할 곳의 주소
- 문자열 종료 0x00으로 표시.
- 출력할 문자열은 section .data 블록에 바이트의 연속으로 선언
- CR: 0xOD , LF:0X0A를 포함시 output창의 줄을 변경하여 문자열을 출력해준다. [win- 0X0D, 0X0A , unix - 0X0A ] 허용
문자열 입력
GET_DEC para1, para2
GET_HEX para1, para2
-para1 : 바이트수
-para2 : 입력받을 레지스터 혹은 메모리 주소
사칙연산
1. 더하기
ADD para1, para2(para1 = para1 + para2 )
2. 빼기
SUB para1, parw2( para1 = para1 - para2 )
-para1 : reg 또는 memory에 있는 값
-prara2 : 레지스터 ,메모리 , 값.
* para1, 2 모두 메모리인 경우 허용 불가
3. 1byte 곱하기 나누기
곱하기
MUL para(1byte)
- para 1byte 일때 : AX =AL *para
- para 는 레지스터만 허용
- 곱해지는 값은 $al에만 넣어야함
- 연산결과는 $ax로 리턴
나누기
DIV para(1byte)
- para 1byte 일떄 : AX / para : AL (몫) AH( 나머지 )
- PARA 는 레지스터만 허용
- 나누어지는 값(피제수)는 반드시 AX 레지스터에만 넣어야함
- 연산결과는 무조건 AL, AH의 고정된 레지스터만 리턴.
4. 2byte 곱하기 나누기
MUL para(2byte)
2byte일때 : DX : AX = AX * para ( Para 는 reg )
연산결과는 무조건 지정된 reg만 들어온다 (DX : AX)
reg $AX 곱할 숫자 설정
DX: 상위숫자 , AX 하위숫자 를 받음.
MUL para(4byte)
EDX : EAX = EAX *para
DIV para(2byte)
DX : AX / para (2byte) , AX 몫, DX 나머지
para 는 레지스터만 가능
나누어지는 값은 무조건 DX: AX 레지스터에만
결과는 AX ,DX의 레지스터에만 얻을수 있음 .
논리연산
1. Shift
SHR para1, para2 (오른쪽으로 비트 이동)
SHL para1, para2 (왼쪽으로 비트 이동)
-para1 : 작업할 장소(레지스터나 메모리)
-para2 : 오른쪽(왼쪽)으로 이동할 비트 수(주로 4의 배수로 사용)
* 대부분 4bit의 배수로 이동
2. AND, OR , XOR, NOT
AND,OR,XOR para1 , para2 (para1 = para1 연산 para2 )
- para1, para2 : 연산대상으로 reg, mem, const 모두 가능
- 연산결과는 para1에 저장
- para1, 2모두 메모리인경우 연산불가
NOT para (para= not para, 0->1 1->0 )
- 연산대상으로 reg, mem, const 모두 가능
- 연산결과 - para에 저장.
FLAG 레지스터
$ZF - 연산결과가 Zero 라면설정
$CF - 연산에서 캐리가 발생하면 설정됨
TEST para1 , para2
-para1 과 para2의 and 연산을 행하고 결과를 플래그 레지스터에 반영. 단 para1에는 연산결과를 반영하지 않는다.
* 연산의 결과를 레지스터에 반영하지 않고 플래그 레지스터에만 반영한다.
Section .text - 라벨
라벨 : 실행 명령어가 시작되는 곳의 주소를 의미.
데이터 흐름을 순차적으리 아니고 앞이나 뒤쪽으로 이동해야 하는 경우 JMP 계열의 명령어에서 사용하기 위해 필요.
라벨이름쓴후 : 마무리
- NOTE
/한 프로그램 내에서 동일한 이름의 라벨을 2개 이상 정의하지 않는다.
/ 필요에 따라서 동일한 주소에 여러 개의 라벨을 붙여 사용하는것이 가능하다.
'programming > assembly' 카테고리의 다른 글
어셈블리언어 기초 파해처 보기 - 5 (0) | 2020.10.25 |
---|---|
어셈블리언어 기초 파해처 보기 - 4 (0) | 2020.10.24 |
어셈블리언어 기초 파해처 보기 - 2 (0) | 2020.10.23 |
-어셈블리언어 기초 파해처 보기 - 1 (0) | 2020.10.23 |