본문 바로가기
공부,일/어셈블리

ch3 data & operand

by fromnothing1 2021. 8. 16.

ch3.2  과제

.586
.model flat, stdcall
 
.STACK 4096

.DATA
number DWORD  -105
sum    DWORD  ?

.CODE
main PROC

	 mov	eax, number
	 sub	eax, 1000
	 mov	sum, eax

	 mov	eax , 0
	 ret

main ENDP
end main

 

ch3.3 ( . data)

BYTE , WORD , DWORD , QWORD 등 데이터를 저장하는 directive 존재 

 

위처럼 1개의 byte 뿐만아니라 여러 바이트를 연속해서 저장할 수도 있다. 

 

 DUP (  배열 선언 할때 사용 )

DblArray DWORD 100 DUP(999) 

- DWORD 100 개를 reserves 한다. 각 DWORD 는 999 로 초기화 한다. 

 

 DUP(?)  아무걸로나 초기화 해라 라는 뜻이다. 

 

ch 3.4 Instruction Operands 

3가지 종류가 존재함 

 

(1) constants

(2)CPU register designations

(3) references to memory locations.

 

add eax(register), 158(immediate)

 

Two 80x86 memory addressing modes

direct Memory Mode 예제 

0000000A A3 00000004 R mov sum, eax ; 

- eax register mode

0000000A  eax 를 어떤주소에 복사해라 

00000004  - sum 주소 

R : 주소가 바뀔수 있음을 알림 

 

register indirect Memory Mode 예제 

add eax, [edx] ; 03 02

- edx 레지스터에 담겨져 있는 주소의 값을 eax에 저장되어 있는 값과 더해서 eax 에 넣어라 

: register indirect Memory Mode 는 레지스터안에 메모리의 주소가 있을때 사용한다. 

 

EAX, EBX, ECX,  EDX  뿐만 아니라 ESI EDI  와 같은 레지스터들이  indirect mode 의 레지스터로 이용 가능하다. 

하지만 범용레지스터 외에는 특정한 목적이 있음으로 왠만하면 범용 레지스터를 이용하자 .

 

 

- 주의 

register indirect  마치 포인터 처럼 사용 가능 하지만  밑에서 처럼은 사용불가능하다. 

mov [ebx], 0 ; 주소의 몇 바이트를 사용해야 하는지 모름

 

때문에 

 

mov BYTE PTR [ebx], 0

 

와 같이 1byte 를 사용한다는 명령어를 따로 추가 해야 된다. ( WORD PTR,DWORD PTR, or QWORD PTR)

 

참고로 mov [ebx],ecx 처럼 레지스터값을 줄때는 자동으로  DWORD 만큼 할당한다.

 

 

 

댓글