피연산자 유형
즉시값, 레지스터, 메모리
MOV 명령어
소스 피연산자로부터 목적지 피연산자로 데이터를 복사한다.
MOV destination, source
규칙
두 피연산자는 같은 크기이어야 한다.
두 피연산자가 모두 멩모리 피연산자일 수는 없다.
CS, EIP, IP는 목적지 피연산자일 수 없다.
즉시값은 세그먼트 레지스터로 이동될 수 없다.
메모리에서 메모리로
직접 이동은 불가능 대신 아래와 같은 방법 사용
.data
var1 WORD ?
var2 WORD ?
.code
mov ax, var1
mov var2, ax
정수의 제로/부호 확장
작은 값을 큰 값으로 복사
부호없는 정수
.data
count WORD 1
.code
mov ecx, 0
mov cx, count ecx = 00000001h
부호있는 정수
.data
signedVal SWORD -16 ; FFF0h(-16)
.code
mov ecx, 0
mov cx, signedVal ; ECX = 0000FFF0h(+65520) 문제 발생
mov ecx, 0FFFFFFFFh
mov cx, signedVal ; ECX = FFFFFFF0h(-16)
MOVZX 명령어
소스 피연산자를 목적지 피연산자로 복사하고 값을 16비트 또는 32비트로 제로확장한다.
.data
byte1 BYTE 9Bh
word1 WORD 0A69Bh
.code
movzx eax, word1 ; EAX = 0000A69Bh
movzx edx, byte1 ; EDX = 0000009Bh
movzx cx, byte1 ; CX = 009Bh
MOVSX 명령어
소스 피연산자의 내용을 목적지 피연산자로 복사하고 값을 16비트 또는 32비트로 부호확장한다.
mov 0A69Bh
movsx eax, bx ; EAX = FFFFA69Bh
movsx edx, bl ; EDX = FFFFFF9Bh
movsx cx, bl ; CX = FF9Bh
LAHF(load status flags into AH) 명령어
EFLAGS 레지스터의 하위 바이트를 AH로 복사한다.
Sign, Zero, Carry 보조 Carry, Parity 플래그가 복사된다.
.data
saveflags BYTE ?
.code
lahf ; load flags into AH
mov saveflags, ah ; save them in a variable
SAHF(store AH into status flags)
AH를 EFLAGS 레지스터의 하위 바이트로 복사한다.
mov ah, saveflags ; load saved flags into AH
sahf ; copy into Flags register
XCHG(exchange data) 명령어
두 피연산자의 내용을 서로 교환한다.
직접 오프셋 피연산자
변수의 이름에 변위를 더하여 직접 오프셋 피연산자를 만들 수 있다.
.data
arrayB BYTE 10h, 20h, 30h, 40h, 50h
.code
mov al, arrayB ; AL = 10h
mov al, [arrayB+1] ; AL = 20h
mov al, [arrayB+2] ; AL = 30h
워드와 더블워드 배열인 경우 2와 4를 더한다.
'컴퓨터 > 어셈블리어' 카테고리의 다른 글
데이터 관련 연산자와 디렉티브 (0) | 2013.01.25 |
---|---|
덧셈과 뺄셈 (0) | 2013.01.25 |
기호상수 (0) | 2013.01.14 |
데이터 정의 (0) | 2013.01.09 |
어셈블리 언어의 기초 (0) | 2013.01.08 |