*MASM 설치와 세팅 침고 링크 :

MS Macro Assembler 설치하기 | Irvine32 라이브러리 | 어셈블리어 (tistory.com)

MOVZX (move with zero-extended)

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)

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

 

LAHF (Load status flags into AH) / SAHF(store AH into status flags)

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

 

공유하기

facebook twitter kakaoTalk kakaostory naver band