#####################################
1. 개요
#####################################
10110000 00010000 -> b010
-------- --------
b0 10
mov AL, 10 : AL 에 10 입력
mov BL, 15 : BL 에 15 입력
add AL, BL : AL과 BL을 더한후 AL에 입력
니모닉 : 기계어의 단위 동작을 영어 약어로 표현한것(ex mov, add...)
~er 도구의미
인터프리터 : 스크립트 코드처럼 라인단위로 실행
디지털 회로의 특징 : 2가지 status 존재(0,1) (각기 0V, 5V)
디지털 데이터는 실제로는 0V, 5V 로 구성된다고 하는데 CPU명령어를 이렇게 표현한 언어는?
-> 머신코드
#####################################
2. 우선 따라하기
#####################################
레지스터란(register) :
기억 장소
CPU안에 존재하는 기억 장소
이름을 통해서 엑서스
CPU 동작 제어
15 0 (16bit)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
AX(Accumulator Register)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
AH | AL
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
BX(Base Register)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
BH | BL
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
CX(Count Register)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
CH | CL
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
DX(Data Register)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
DH | DL
<8088내의 범용 레지스터)
- AX, BX, CX, DX 요렇게 되어있다.
- AX에서 X는 잘 보면 H, L 요렇게 나뉜다. ex)AX -> AH + AL
- BH = 56, BL = 34이면 BX는 5635H 이다.
1. MOV AL, 15H : AL 레지스터에 16진수 15를 넣어라
15에 H를 넣는 이유는 Hex Value를 의미한다.
15H -> AL에 넣는 것을 immediate addressing라고 한다. 이때 15H를 immediate value라 한다.
2. MOV AL, BL : AL 레지스터의 값을 BL레지스터에 넣어라 = register addresing
3. MOV AL, AH : AH 레지스터의 값을 AL에 넣어라
*) 이것을 A란 헥사값을 AL에 넣어라라고도 헷갈릴수 있으므로
영문의 경우에는 0AH 라 명칭한다.
4. MOV AL, 100D : AL 레지스터에 십진수100을 넣어라
5. MOV BH, 32 : BH레지스터에 32(십진수)값을 넣어라 따라서 BH는 32의 16진수 값을 갖는다.
(두번째 인자가 아무표시도 없으면 십진수)
6. MOV AL, [100] : 메모리 100번지의 1바이트 값을 AL에 넣어라
7. MOV BX, [100] : 메모리 100번지의 2바이트 값을 BX에 넣어라. 100->BL, 101->BH
이런 데이타 구조를 little endian 구조라 한다.
8. MOV [35], DX : DX의 값을 메모리 35번지에 넣어라. DL->35번지, DH->36번지
9. MOV [1234], CL : CL의 값을 메모리 1234번지에 넣어라
10. MOV AL, VAR : 변수 VAR의 값을 AL에 넣어라
11. MOV DATE, BX : BX의 값을 DATE변수에 넣어라
12. JMP ABC : ABC라고 레이블이 붙은 지점으로 가라
13. ABC; ADD AL, BL : AL과 BL의 값을 더해서 그 값을 AL에...
문자 'A'를 화면에 출력하고 싶을때
MOV DL, 'A" ; = mov DL, 41h, ASCII Value
MOV AH,2 ; function 2 = display character in DL
INT 21H ; DOS Service. 'A' on screen
키보드에서 데이터를 읽어들이고 싶을때
MOV AH,0 ; 함수번호 AH=2, 받은 문자를 출력하지 말고 키입력을 받아라
INT 16H ; BIOS호출. AL = 키입력의 ASCII 코드
키보드에서 입력을 화면에 출력하는 루틴
MOV AH,0 ; 키 입력을 위한 함수 번호, AH=0으로 정해져있다.
INT 16H ; BIOS 호출
MOV DL,AL ; 읽은문자(AL)를 DL에 넣는다.
MOV AH,2 ; 문자 출력을 위한 함수번호, AH=2로 정해져있다.
INT 2H ; DOS 호출, 실제 문자 출력의 복잡한 과정은 여기서 이루어진다.
도스상에서 운영되는 프로그램을 종료할때
MOV AH, 4CH ; 함수호출 번호 4C, 종료하라
INT 21H ; DOS 호출, DOS의 prompt로 회귀한다.
오퍼랜드 - 명령을 이루기 위한 구성요소
MOV AH, 4CH
-------
오퍼랜드 (첫번째 인자는 목적 오퍼랜드, 두번째는 소스 오퍼랜드)
키보드 입력을 받아 그 값을 하나 증가시켜서 이를 화면에 출력하는 루틴을 작성하라.
레지스터 BL의 값을 +1 증가시키는 명령어는 "INC BL"이다
MOV AH,0
INT 16H
INC AL
MOV DL,AL
INT 21H
"MOV AX,12"명령을 수행하면, AH와 AL레지스터에는 16진수로 각각 어떤 값이 들어가는가?
MOV AX, 0C -> MOV AX, 000C
AH -> 0 (높은자리것이 들어감)
AL -> L (낮은자리것이 들어감)
"MOV DL,'A' = MOV DL, 41H"라고 했는데 문자 'A'의 ASCII코드는 누가 기억하고있는가?
->어셈블러가 내부에 ASCII CODE TABLE를 이용해서 변환해준다.
"MOV DL,'A'", 이 명령어는 즉치(immediate value)를 사용하는가?
->사용한다.
"MOV AX, CX"명령을 수행하면 CX레지스터의 원래 값은 지워지는가?
->안지워진다.