본문 바로가기
코스웨어/13년 스마트컨트롤러

시리얼통신, 무한반복 함수 어셈

by 알 수 없는 사용자 2013. 9. 24.
728x90
반응형










<하이퍼터미널에서의 결과>


빛센서는 97번핀과 연결하고 한쪽은 VCC에 연결

LED는 포트A아무데나 연결해 놓음





----------------------어셈블리--------------------






.386

.MODEL FLAT


PUBLIC _STST

PUBLIC _LDST ;load status


.CODE


_STST PROC NEAR32

PUSH  EBP

MOV EBP,ESP

PUSHFD

PUSHAD ;전체 레지스터 넣음


MOV EAX, [EBP-4]

AND EAX,  0FFFFFEFFh

MOV DWORD PTR[EBP-4], EAX ;efl 값넣어둠



MOV ECX, ESP ; 맨위의 ESP 주소


MOV ESP, [EBP+8] ;구조체 주소를 넘김

ADD ESP, 40 ;esp를 밑으로 내려보냄


;초기값을 가리키는 것이 필요

MOV EAX, EBP ;EAX의 초기 값 

ADD EAX, -8

PUSH [EAX]


ADD EAX, -4

PUSH [EAX] ;ECX


ADD EAX, -4

PUSH [EAX] ;EDX


ADD EAX, -4

PUSH [EAX] ;EBX


MOV EBX, EBP

ADD EBX, 8 ;esp


PUSH EBX


PUSH [EBP] ;ebp의 값 



ADD EAX, -12

PUSH [EAX] ;EDI


ADD EAX, -4

PUSH [EAX] ;ESI


PUSH [EBP+4] ;리턴어드레스 값

PUSH [EBP-4] ;EFL 값


MOV ESP, ECX


POPAD ;꺼내기


POPFD ; 플래그도


MOV ESP,EBP

POP  ebp

RET


_STST ENDP




_LDST PROC NEAR32



;메모리 안에 있는 정보를 CPU올리기

MOV ESP, [ESP+4] ;esp =&context

POPFD ;플래그 efl = context.efl

POP EAX ;eax = old eip

 

MOV EBX, ESP ;esp 임시저장, ebx= current esp

MOV ESP, [ESP+12] ;스택으로 점프 esp = old esp 


PUSH EAX ;y값을 return address 에 넣어줌 save old eip


MOV ESP, EBX ;다시 돌아온 esp ,esp = current esp

POPAD ;한 번에 넣기 


MOV ESP,[ESP-20]


SUB ESP, 4 ;r.a까지 esp 올리기 


RET


_LDST ENDP



END




728x90