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 로 동작한다.

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 |
댓글