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

ch.4 - mov 완전정리 ( copy data)

by fromnothing1 2021. 8. 17.

Copying Data

데이타의 복사는 mov 명령어로 이루어진다. 

 

c 같은 경우 

count = num

 

mov ecx num

mov count ecx 

 

와같이 써진다. 이는 80 x 86 구조에서는 모든 operand 가 메모리 주소 일 수 없기 때문이다. ( 1개는 레지스터)

mov 의 경우 두 데이터의 사이즈가 동일해야한다. 

 

 

register 8 이라고 되있는게 존재하는데 (OPCODE 8A) 이는 8개의 1byte 레지스터를 soure 또는 destintion 으로 사용할수 있도록 하는 opcode 이다. 

사용 할때는 ModR/M 1byte opcode 와 함께 사용된다. 

 

이는 ModR/M 로 특수한 기능을 할수있는 byte로 이를 조절해서 위 8 가지 레지스터를 다양하게 활용할수 있다.

 

8 bit 중 처음 2 bit 는 사용 mode 를 의미하고 처음 3 bit 는 ( Reg , register ) 이고 

나머지 3bit 는 ( R/M register/ memory ) 로 모드에 따라서 memoy 또는 레지스터로 사용된다. 

 

Mod = 11 일때는 R/M 부분이 memory 로 동작한다.

3bit 와 각각의 1byte 레지스터 대응 관계 

8A opcode 로 mov 명령어를 사용해보면 

ex) mov ch, bl ; 8A EB 이다      { EB = 11(mode) 101(ch) 011(bl)  }

 

direct memory mode 에서 mov 

8A opcode 를 사용해서 주소값에 해당하는 값을 각각의 8 가지 레지스터에 가져올 수 있다. 

 

ex)

1. mov al ,membyte

-al 은 eax 즉 누산기용 레지스터 임으로 A8 + 4byte(memByte)  만으로 mov al memory 가 동작한다. 

 

2. mov bl ,membyte

- bl 은 누산기용이 아니라서 8A "2+" :  최소 2 byte 이상 필요 

Direct memory addressing 일때 mod = 00 ,r/m =101 

사용 레지스터는 Reg = 011(bl)  , 

즉 modR/M = 00 011 101 

즉 8A + 0001101 해서 2byte 는 무조건 필요하다는 뜻이다. 

 

실질적으로는 memory addrss 4 byte 해서 6 byte 가 필요하다. 

 

register indirect mode  에서 mov

mod = 00

Reg = destination

R/M = pointer

 

즉 A8 modR/M ; 2 byte 명령어로 해결 가능 

 

ex) mov al, [ebx]

Reg=000(AL), and R/M= 011(EBX)

즉 8A 03 

 

immediate-to-memory mov (C6) "+3" 

ex) direct memory addressing

mov smallCounter, 100 ; C6 05 xx xx xx xx 64

05 : modR/M (Mod = 00 ,  Reg = 000(unused) ,R/M =  101(for direct memory addressing))

xx xx xx xx : smallCounter 의 주소 

64h = 100 (십진수)

 

ex) mov BYTE PTR [edx], −1 ; C6 02 FF

02 : mod = 00 , Reg = 000(unused) R/M=010(EDX)

FF : -1 (2 의 보수법)

register-to-memory mov

memory-to-register 와 거의 동일 

memory-to-register 와 마찬가지라 al 레지스터를 사용할때는 별도의 명령어를 사용한다(짧다). 

 

0D : mode  = 00 Reg 001(cl) , R/M = 101

 

 

 

64bit mdoe

위와 동일한데 앞에 먼가 부터있다 ( 41,44,45) 이 byte 를 REX prefix 라고 부른다. 

64-bit 80x86 는 16 개의 범용 레지스터를 가진다. 

modR/M 의 Reg, R/M 는 3bit 로 8 개의 레지스터만 표현 가능하다. 때문에 prefix 를 이용한다. 

 

처음 4 bit 는 무조건 0100(4h)  

때문에 prefix 의 bit 2를 Reg 의 MBS 로 준다. , bit 0 을 R/M bit  의 MBS 로 준다. 

 

 

 

1 개의 mov 로 실행 불가능한 copy 

• a move with both source and destination in memory (소스랑 목적지 둘다 메모리)

• any move where the operands are not the same size (소스랑 목적지 사이즈가 다름 )

• a move of several objects (여러물체의 의 동시이동)

 

1. a move with both source and destination in memory (소스랑 목적지 둘다 메모리)

num

 

count = num

mov eax, num

mov count ,eax

 

2. any move where the operands are not the same size (소스랑 목적지 사이즈가 다름 )

dblSize : doubleword  to byteSize 로 만들고 싶다. ( 상위 byte 는 의미없는 데이터일 때)

 

mov eax, dblSize

mov byteSize , al 

 

: al 은 eax 의 하위 1byte 

 

역으로 byteSIze to dblSize 

 

mov eax , 0

mov al , byteSize

mov dblSize ,eax

 

 

3. a move of several objects 

.data

source DWORD 4 DUP(?)

dest    DWORD 4 DUP(?)

; DWORD 4 개짜리 배열 2개

 

source to dest 하고 싶음 

 

mov eax, source ; 첫 byte 카피 

mov dest, eax

 

mov eax , source+4  ; DWORD 는 4byte 임으로 

mov dest+4 ,eax

 

.........

 

+12 까지 

 

data swaping 

상위 언어에서 구현 방법 

temp = values1

values1 = values2

values2 = values1 

 

어셈블리어

ecx = temp , eax = values1, ebx = values2

 

mov ecx, eax

mov eax,ebx

mov ebx, ecx

 

xchg eax,ebx ; 위의 3줄짜리 코드를 구현하는 1개의 명령어가 존재한다. 

 

xchg 명령어 또한 mov 와 마찬가지의 명령어를 가진다. 

cf) xchg 또한 메모리2개를 직접 swap 할수는 없다. 

 

 

 

 

'공부,일 > 어셈블리' 카테고리의 다른 글

ch4 4.3 Multiplication Instructions  (0) 2021.08.18
ch4. 2 Integer Addition and Subtraction Instructions  (0) 2021.08.17
ch3 data & operand  (0) 2021.08.16
listing 파일 만들기  (0) 2021.08.16
튜토리얼 3 simple window  (0) 2021.08.16

댓글