Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- kotlin
- 티스토리챌린지
- taint
- Value too long for column
- JanusWebRTCServer
- preemption #
- 개성국밥
- table not found
- JanusWebRTCGateway
- mp4fpsmod
- vfr video
- k8s #kubernetes #쿠버네티스
- Spring Batch
- 코루틴 빌더
- 오블완
- pytest
- 달인막창
- python
- 깡돼후
- terminal
- tolerated
- PersistenceContext
- VARCHAR (1)
- JanusWebRTC
- 자원부족
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- PytestPluginManager
- 코루틴 컨텍스트
- 겨울 부산
- JanusGateway
Archives
너와 나의 스토리
어셈블리 - push&pop 명령어 / USES Operator 본문
반응형
● 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
즉, 위 코드와 동일하게 작동된다.
반응형
'Programming Language > Assembly' 카테고리의 다른 글
어셈블리 - FPU 예제 (실습 코드) (0) | 2019.06.07 |
---|---|
어셈블리 - FPU(부동 소수점 유닛) (0) | 2019.06.07 |
어셈블리 - JMP and LOOP Instructions (0) | 2019.06.03 |
어셈블리(ch5) - 라이브러리 프로시저 호출 (Linking to an External Library) (0) | 2019.06.03 |
어셈블리 - 지역 변수/ 프로시저 매개변수 넘기기/ 프로시저 프로토타입 (0) | 2019.06.01 |
Comments