관리 메뉴

너와 나의 스토리

어셈블리 - push&pop 명령어 / USES Operator 본문

Programming Language/Assembly

어셈블리 - push&pop 명령어 / USES Operator

노는게제일좋아! 2019. 6. 3. 16:37
반응형

● push / pop

include irvine32.inc

.data
val1 byte 1h
val2 byte 2h
val3 byte 3h

.code
main proc
	mov eax,0
	mov ah,val1
	mov al,val2
	push eax
	call tmp1
	pop eax
	call dumpregs

	exit
main endp
tmp1 proc
	mov ah,5h
	mov al,10h
	ret
tmp1 endp
end main

main에서 ah=1,al=2 값을 넣고 이 eax 값을 stack에 push해놓은 후

tmp1을 호출해서 여기서 eax 값을 바꾼다고 해도

나중에 main에 돌아와서 원래 stack에 저장해 둔 것을 pop하면 tmp1 호출 전 값으로 되돌아옴

 

● pushad / popad

32bit 범용 레지스터들을 전부 스택에 넣고 빼는 연산자

 

● pushha / popha

16bit 범용 레지스터들을 전부 스택에 넣고 빼는 연산자

 

● pushfd / popfd

EFLAGS 레지스터를 스택에 넣고 빼는 연산자

 

 

* stack을 이용한 연산이기 때문에  최근에 push한 순서대로 pop 해줘야 한다.

 

● USES Operator

프로시저가 수행하는 동안 값이 수정되는 register 이름을 열거

ArraySum PROC USES esi ecx
  mov eax,0 		; set the sum to zero
L1: 
  add eax,[esi]
  add esi,4
  loop L1
  ret
ArraySum ENDP

이렇게 하면 어셈블러가 자동으로 프로시저 시작할 때 "uses" 뒤에 열거된 register들을 push하고 

프로시저가 리턴되기 전에 열거된 register을 pop한다.

ArraySum PROC
  push esi
  push ecx
  mov eax,0
L1: add eax,[esi]
  add esi,4
  loop L1
  pop ecx
  pop esi
  ret
ArraySum ENDP

즉, 위 코드와 동일하게 작동된다.

반응형
Comments