call

0.인자있으면 인자들어감

1.  push   eip

2. mov     eip ,  함수 주소


ret

1. pop      eip

'어셈블리' 카테고리의 다른 글

어셈블리 stst  (0) 2014.08.07
어셈블리 push&pop  (0) 2014.08.01
루프  (0) 2014.07.31
20140728 어셈블리 ++연산 --연산  (0) 2014.07.28
20140725 어셈블리  (0) 2014.07.25
by 날라차숑 2014. 8. 8. 14:22
휴가 -2Day



(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


구조체 .c영역

#include <stdio.h>


typedef struct _context

{

unsigned int EFL;

unsigned int EIP;

unsigned int EDI;

unsigned int ESI;

unsigned int EBP;

unsigned int ESP;

unsigned int EBX;

unsigned int EDX;

unsigned int ECX;

unsigned int EAX;

}context;



(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


 .asm영역

.386

.MODEL FLAT

.STACK  4096 


PUBLIC _STST


.CODE 

_STST PROC NEAR32


(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)

push ebp              ; entry code

mov ebp,esp    ; entry code

pushfd                      ;  FLAG레지스터 저장




(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)

mov esp, [ebp + 8] ; 구조체 주소를 esp로옮김

add esp, 40 ; esp가 구조체 가장 아래 데이터에 저장할 준비


pushad ;레지스터 정보 저장




(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


mov eax, ebp           ; 현재ebp를 eax로 옮긴다음


add eax, 8           ; +8을 해주면 eax는 &status를 가리키는 주소를 가지게된다.


mov [esp + 12], eax     ; status주소를 구조체내의 esp에 저장한다.



※현재 ESP는 EDI를 가리키고있다.

(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)



mov eax, [ebp]        ;  레지스터에 있는 ebp의 값은 eax로 옮기고 


mov [esp +  8], eax  ;  [ebp]에 있는 값을 ebp에 넣는다. 



(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


mov eax, [ebp + 4] ;  R.A값을 eax로 넣고


push eax        ;  push해주면 구조체내의 eip로 들어간다.



(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


push [ebp - 4] ; 마지막으로 FLAG레지스터의 값은 EFL로 들어간다.



(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


mov esp,ebp ; exit code

pop ebp ; exit code

ret                 ; exit code


_STST ENDP

END


실행은 각자 해보는거져 >.<


(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


CDECL vs STDCALL

함수를 리턴할 때 쓰는 방식

Left CDECL                                                                                                 RIGHT STDCALL

콜러가 스택을 정리하는 방식                                                            




'어셈블리' 카테고리의 다른 글

call,ret  (0) 2014.08.08
어셈블리 push&pop  (0) 2014.08.01
루프  (0) 2014.07.31
20140728 어셈블리 ++연산 --연산  (0) 2014.07.28
20140725 어셈블리  (0) 2014.07.25
by 날라차숑 2014. 8. 7. 16:19




'어셈블리' 카테고리의 다른 글

call,ret  (0) 2014.08.08
어셈블리 stst  (0) 2014.08.07
루프  (0) 2014.07.31
20140728 어셈블리 ++연산 --연산  (0) 2014.07.28
20140725 어셈블리  (0) 2014.07.25
by 날라차숑 2014. 8. 1. 17:34

1.Jump 명령어(Page 162)

1-1) Example 1

 1번 cmp 명령어에 따라 total -100 으로 total 과 100을 비교

 2번 jge : 크거나 같으면 jump ... 조건 성립 할 경우 addValue라벨로

 jump 한 경우 : addValue를 실행

 jump 안 한 경우 : cmp 명령어에 따라 cx-10 으로 cx와 10을 비교

 3번 jne : 같지않다면 Jump ... cx와 10이 같지 않으면

 endAddCheck 라벨로 Jump

 jump를 안 한 경우에는 addValue라벨을 실행

 cmp를 묶어서 C언어로 설명을 하면

 if( 100 <= total | 10 = cx ) 의 조건식으로 해석

1-2) Example 2

 

 1번 cmp 명령어에 따라 cx - 0 이므로 cx 와 0을 비교

 2번 jng : 크지 않을 경우 Jump ... 조건이 성립 할 경우 endCheckch

 Jump를 안 할 경우 계속 진행

 3번 cmp 명령어로 비교

 al값과 backspace의 아스키 코드값을 비교

 4번 jne : 같지 않다면 Jump  이것 또한 위에꺼와 같이

 조건이 성립 되지 않은 경우 종료 시키지 않고 밑의

  dec count 를 수행

 cmp명령어를 C언어로 바꿔 말하면

 if( 0 < cx & al = backspace ) 의 조건식으로 해석

1-3) Example 3

 1번 처음 수를 입력 하고 여러번 비교 할 수 있게 변수에 값을 저장

 그리고 입력한 값을 숨기기 위해 화면을 clear

 몇번만에 맞추는지를 세는 count를  0으로 초기화

 2번 count 수를 늘리면서 입력한 아스키 코드값을 정수로 변환

 2번 밑의 cmp 명령어로 서로의 비교를 하면서

 target(처음 입력한 수) 와 두번 ,세번 입력한 수 와 비교를 하여

 처음 입력한 수를 맞추는 프로그램

 서로 비교하였을때 같지 않다면 ifLess 라벨로 Jump ( jne )

 여기서 값이 만약 target보다 수가 크다면 jnl(적지않다면)

 5번으로 Jump ...

 6번을 실행하면서 수를 비교하여 untilmatch 라벨로 이동하여

 Match 될 때까지 무한 루프

 만약 Match가 되면 N Or n 을 눌리지 않는 이상 다시 시작

 N Or n 을 눌리면 종료!!

 

 2. Implementing Loop Structures (Page 172)

2-1)Example

 

  number에 들어 있는 수와 eax(1)수를 비교한다.

 jnle ( 적지 않거다 같으면 ) 조건이 성립이 되면 endWhileLE 라벨로

 그렇지 않다면 body 에서 eax의 값을 늘리면서 number와 비교

 cx를 +1 해주면서 몇번만에 나오는지 횟수를 알 수 있음

 

2-2).Example

 

  값을 입력 받아 tally의 변수에 값을 대입

 edx = sum 의미하고 ,bx = count 로 지정 . 각각 초기화를 시킴

 tally 와 bx를 비교한 뒤 숫자를 입력하여 합을 edx에 저장

 그러면서 bx에 +1을 함

 tally의 수만큼 수를 입력하고 그 수들의 합을 구하는 프로그램

 

3.For Loops in Assembly Language (Page 186)

'어셈블리' 카테고리의 다른 글

어셈블리 stst  (0) 2014.08.07
어셈블리 push&pop  (0) 2014.08.01
20140728 어셈블리 ++연산 --연산  (0) 2014.07.28
20140725 어셈블리  (0) 2014.07.25
어셈블리  (0) 2014.07.23
by 날라차숑 2014. 7. 31. 12:43




비주얼 베이직에서 컴파일 해보면 ++연산자와 --연산자를 add,와 sub를 사용하였다.




'어셈블리' 카테고리의 다른 글

어셈블리 stst  (0) 2014.08.07
어셈블리 push&pop  (0) 2014.08.01
루프  (0) 2014.07.31
20140725 어셈블리  (0) 2014.07.25
어셈블리  (0) 2014.07.23
by 날라차숑 2014. 7. 28. 11:02


SF ZF CF OF

0번 Carry Flag (CF) = 부호 없는 수 (unsigned integer)의 오버플로우가 발생했을 때 1로 세팅된다.

EX) 더해서 carry가 발생시와 모자라서 빌려온 경우 borrow발생시 두 가지의 경우가 있다. 

6번 Zero Flag (ZF) = 연산 명령 후에 결과값이 0 이면 1(참), 0이 아니면, 0(거짓)으로 세팅된다.

7번 Sign Flag (SF) = 연산 명령 후 결과값의 최상위 비트가가 1 이면 1, 0 이면 0으로 세팅된다.

11번 Overflow Flag (OF) = 부호 있는 수 (signed integer)의 오버플로우가 발생했을 때, 1로 세팅 된다. MSB(Most Significant Bit) 가 변경되었을 때 1로 세팅됩니다.

=> EX) 두수가 +이거나 -일때, 연산결과가 각각 -, +로 변했을 때, OF가 걸린다.




EFL = 246 -> 283

246h -> 0010 0100 0110b

 0 0

 1

 0

 0

 1

 0

 0

 0

 1

 1

 0

283h -> 0010 1000 0011

 0 0

1

0 

1 

0 

0 

0 

0 

0 

1 






'어셈블리' 카테고리의 다른 글

어셈블리 stst  (0) 2014.08.07
어셈블리 push&pop  (0) 2014.08.01
루프  (0) 2014.07.31
20140728 어셈블리 ++연산 --연산  (0) 2014.07.28
어셈블리  (0) 2014.07.23
by 날라차숑 2014. 7. 25. 11:46















'어셈블리' 카테고리의 다른 글

어셈블리 stst  (0) 2014.08.07
어셈블리 push&pop  (0) 2014.08.01
루프  (0) 2014.07.31
20140728 어셈블리 ++연산 --연산  (0) 2014.07.28
20140725 어셈블리  (0) 2014.07.25
by 날라차숑 2014. 7. 23. 17:32
| 1 |