*MASM 설치와 세팅 침고 링크 :
MS Macro Assembler 설치하기 | Irvine32 라이브러리 | 어셈블리어 (tistory.com)
movzx 는 move with zero-extended 로 피연산자에 값을 복사하고 16비트 또는 32비트로 제로 확장한다.
*예제
INCLUDE Irvine32.inc
.data
myByte BYTE 10101010b
.code
main PROC
mov ecx, 0
mov edx, 0
movzx ax, myByte
movzx ebx, myByte
mov cx, 0A69h
movzx edx, cl
call DumpRegs
exit
main ENDP
end main
형식은 세 가지가 있다.
- movzx reg32, reg/mem8
- movzx reg32, reg/mem16
- movzx reg16, reg/mem8
16비트나 8비트 값을 32비트에 입력하면 나머지 16비트에는 초기화되지 않은 값이 들어있다. movzx 명령어는 상위 비트들을 0으로 확장(0으로 입력)시켜 버린다.
10011001 소스 (16비트/8비트 레지스터/메모리)
0000 0000 10011001 목적지 32비트 레지스터
-> 0으로 확장하기 전에는 무작위값이 들어있다. (쓰레기값)
movsx 는 move with sign-extend 의 약자로 movzx 가 0으로 확장했다면 movsx는 1 부호확장 한다.
형식은 다음과 같다.
- movsx reg32, reg/mem8
- movsx reg32, reg/mem16
- movsx reg16, reg/mem8
INCLUDE Irvine32.inc
.data
myByte BYTE 10101010b
myByte2 BYTE 11111111b
.code
main PROC
movsx ax, myByte
movsx ebx, myByte
movsx cx, myByte2
movsx edx, myByte2
call DumpRegs
exit
main ENDP
end main
EFLAGS 레지스터의 하위 바이트를 AH 레지스터에 복사한다. sign, zero, carry 등 플래그가 복사된다. 변수에 상태를 보관하는데 LAHF 를 사용하고 다시 꺼내오는데 SAHF를 사용한다.
INCLUDE Irvine32.inc
.data
flagSaved BYTE ?
.code
main PROC
lahf
mov flagSaved, ah
mov eax, 0
mov ah, flagSaved
sahf
call DumpRegs
exit
main ENDP
end main
AH (A -High) 에 저장한 플래그
0100 0110 0000 0000
4 6 0 0
XCHG (exchange data)
데이터를 교환하는 명령어다.
- XCHG reg, reg
- XCHG reg, mem
- XCHG mem, reg
(mem은 메모리의 변수, reg는 레지스터를 의미)
INCLUDE Irvine32.inc
.data
myVar DWORD ?
.code
main PROC
mov eax, 15000h
mov ebx, 27000h
xchg eax, ebx
mov ecx, 9999h
mov myVar, 777h
xchg ecx, myVar
xchg myVar, edx
call DumpRegs
exit
main ENDP
end main