연습장
2일차 본문
4. 변수와 레지스터
*메모리 <-> 레지스터
mov rax, a ; a라는 바구니의 주소값을 rax에 복사
mov rax, [a] ; a라는 바구니 안에 있는 값을 rax에다 복사
*변수의 선언 및 사용
변수: 데이터를 저장하는 바구니
처음에 바구니를 사용한다고 선언(이름과 크기 지정)
*
메모리에는 구분할 수 있도록 주소(번지수)가 있다
고정적X 실행할 때 마다 변화O
**초기화 된 데이터
변수이름, 크기, 초기값
크기 db(1) dw(2) dd(4) dq(8)
section .data
a db 0x11
b dw 0x2222
c dd 0x33333333
d dq 0x4444444444444444
**초기화 되지 않은 데이터
변수이름, 크기, 개수
크기 resb(1) resw(2) resd(4) resq(8)
section .bss
e resb 10
5. 문자와 엔디안
a db 0x11 ;
a db 17 ;
다양한 진수로 데이터 세팅 가능함, 결과물은 똑같음
*
a db 0x11, 0x11, 0x11, 0x11 ;
쉼표로 구분해서 일련의 데이터로도 연결 가능
*
msg db 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x0
PRINT_STRING msg
PRINT_STRING 공식 어셈블리어는 아니고 운영체제에서 제공하는 헬퍼매크로이다.
아스키코드로 분석하여 문자로 출력도 가능
★ 동일한 데이터라도 어떻게 분석하고 받아들이냐에 따라 다른 의미가 될 수 있다
*빅엔디안, 리틀엔디안(역순)
우리가 사용하는 환경에서는 대게 리틀엔디안으로 저장이됨
데이터가 뒤집어지는 경우와 아닌 경우가 있다 정도만
6. 사칙연산
*인풋창에 데이터를 입력 받고 출력하는 프로그램
-> 인풋창에 1,2를 입력하면 1,2가 출력됨
GET_DEC 1, al
GET_DEC 1, num
PRINT_DEC 1, al
NEWLINE
PRINT_DEC 1, num
어셈블리 코드는 소문자 대문자 상관X
더하기 연산 add a, b
a는 레지스터 or 메모리 입력 가능
b는 레지스터 or 메모리 or 상수 입력 가능
단, a,b 모두 메모리 입력은 안됨
빼기 연산 sub a, b
곱셈과 나눗셈은 어셈블리 코드에서 자주 등장하진 않음
예제) 더하기 연산
인풋 1, 2로 줬을 때,
add al,1 ;레지스터+상수
PRINT_DEC 1, al ;1+1=2
add al, [num] ;레지스터+메모리
PRINT_DEC 1, al ;2+2=4
mov bl, 3 ;레지스터+레지스터
add al, bl
PRINT_DEC 1, al ;4+3=7
add [num], byte 1 ;메모리+상수
PRINT_DEC 1, [num] ;2+1=3
상수를 메모리에 담아줄땐 크기지정 해줘야 함 (byte)
add [num], al ;메모리+레지스터
PRINT_DEC 1, [num] ;3+7=10
곱하기 연산
mul reg
mul bl = al * bl
연산결과를 ax에 저장 //1바이트의 곱셈
mul bx = ax * bx
연산 결과는 dx(상위16비트) ax(하위16비트)에 저장
mul ebx => eaz *ebx
예제) 5 * 8 은?
mov ax, 0 / 입력 받아주기 위한 정리
mov al, 5
mov bl, 8
mul bl
PRINT_DEC 2, ax
나누기 연산
div reg
div bl => ax / bl
연산 결과는 al(몫) ah(나머지) 저장됨 // 1바이트의 나눗셈
예제) 100 나누기 3은?
mov ax, 100
mov bl, 3
div bl
PRINT_DEC 1, al ; 100/3 =33*3+1
NEWLINE
mov al, bh
PRINT_DEC 1, al