nask는 NASM를 최적화한 어셈블러입니다.
명령어는 대소문자를 구분하지 않습니다.

DB(data byte) :파일의 내용을 1바이트만 직접 쓰는 명령어
RESB(reserve byte) : 예약의 의미(nask에서는 예약뿐아니라 띄어놓은 부분을 0x00으로 채우준다.)
; : 주석

DW(data word) : 어셈블러에서 워드는 16bit(2byte)의 의미
DD(data double-word): 더블워드는 32bit(4byte)의 의미
'명령어 $' : 이때 $는 이 행이 선두로부터 몇 바이트째인가를 알려주는 변수

<c언어의 #define 역할>
EQU
ex) CYLS EQU  10    


ORG(origin) : 메모리 어디에 로딩되는지  nask에 알려주기 위한 명령어.(시작점 위치 알려주기)
                    ORG명령어 사용시 달러마크($)의 의미는 출력파일에서 몇 번째바이트인지를 나타내지 않고, 
                     ORG에 지정된 주소로부터 몇 번째 주소인지를 나타낸다.
"entry:" : entry라는 레이블 선언. ':'사용하면 레이블을 선언한다.

<제어문>
MOV : 대입문
ex) MOV AX,0  ; AX=0
JMP : c언어의 goto문역할
CMP : 비교문
JE(jump if equal): 조건 점프 명령어
ex) CMP AL,0
      JE    fin
//AL == 0이 같으면 fin으로 이동해라.
JAE(jump if above or equal) : 크거나 같으면 점프
ex) CMP SI, 5    ; SI>=5이면 에러로..
      JAE error
JA : 크거나

JBE(jump if below or equal) : 작거나 같으면 점프
JB : 작거나

JC(jump if carry) : 캐리플래그가 1이면 점프
JNC(jump if not carry) : 캐리플래그가 0이면 점프

INT(interrupt) : 인터럽트 명령어
HLT(halt) : CPU를 대기상태 만드는 명령어. 키보드, 마우스에 변화가 생기면 CPU는 계속 해서 프로그램 실행
//전기를 절약할수있다.


<메모리를 지정할때>
"데이터의 크기[번지]" 
ex) MOV BYTE [678], 123
메모리 678주소에 123을 기억시킨다. 데이터 크기로는 BYTE, WORD, DWORD

<대표적인 16bit(2byte) 레지스터>
AX : 어큐뮬레이터(accumulator: 누적 연산기)
CX : 카운터(counter:수를 세는 기계)
DX : data
BX :base
SP :stack pointer
BP :base pointer
SI : source index(읽기 인덱스)
DI : destination index(쓰기 인덱스)
<8bit(1byte) 레지스터>
AL : accumulator low(AX 레지스터의 16비트 중 아래쪽 비트 0~7부분)
CL : counter low
DL : data low
BL : base low
AH : accumulator high(AX 레지스터의 16비트 중 위쪽 비트 8~15부분)
CH : counter high
DH : data high
BH : base hight
//BP, SP, SI, DI는 L과 H로 나눌수 없다.
//여기서 32bit 레지스터는 단지 E(Extend)만 16비트 레지스터명 앞에 붙인다.

< 16bit 세그먼트 레지스터> 
ES : extra segment( 덤 세그먼트)
CS : code segment
SS : stack segment
DS : data segment
FS : 명칭없음(덤 세그먼트 2번째)
GS : 명칭없음(덤 세그먼트 3번째)

◆ 어떤 메모리라도 세그먼트 레지스터와 함께 번지를 지정하지 않으면 안된다.
그래서 MOV CX,[1234]는 MOV CX,[DS:123]와 같다. 어셈블에서는 생략해도 자동으로 해준다.
MOV AL,[SI] 는 MOV AL,[DS:SI]라는 의미 .기본적으로 DS:가 붙기때문에 항상 DS는 0으로 안하면 메모리 번지는 DS*16 + SI가 된다.

'Embedded Lab > linux, x86' 카테고리의 다른 글

[vim에서 여러 줄에 주석 달고 해제하기]  (0) 2012.08.30
[bashrc에 shell 칼라 설정]  (0) 2012.08.30
[NASM과 MASM]  (0) 2012.06.02
[CPU스케쥴러]  (0) 2012.05.26
[캐리지리턴(\r)]  (0) 2012.05.04
Posted by cyj4369
,