검색결과 리스트
분류 전체보기에 해당되는 글 105건
- 2014.09.16 API 용어
- 2014.08.08 call,ret
- 2014.08.07 어셈블리 stst
- 2014.08.01 어셈블리 push&pop
- 2014.07.31 루프
- 2014.07.28 20140728 어셈블리 ++연산 --연산
- 2014.07.25 20140725 어셈블리
- 2014.07.23 어셈블리
- 2014.07.22 1
- 2014.07.11 인터럽트 ARM
HWND 파일 핸들 = 윈도우 고유 번호
히스토그램 (0) | 2014.10.01 |
---|---|
EDIT (0) | 2014.09.18 |
DrawBitmap (0) | 2014.09.18 |
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 |
(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)
구조체 .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 |
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 |
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 |
비주얼 베이직에서 컴파일 해보면 ++연산자와 --연산자를 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 |
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 |
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 |
어셈블리 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 |
(ARM)
ADC_MR
TRGEN : 트리거 활성화(사용안함)
TRGSEL : 트리거 선택(사용안함)
LOWRES : 분해능 (10bit = 1024 설정)
SLEEP : 슬립모드(사용안함)
PRESCAL : 분주비 (4Mh로 설정, 48Mb/ ( (5+1) * 2 ) = 4Mh)
(어셈블리)
3.1 Assembly Language Statements(어셈블리 명령어)
instruction(명령어)
(;)은 주석의 시작을 의미한다.
어셉블리는 끝나는 문자가 안정해 져있다.
directive(지시어)
예) .NOLIST
macro
어셈블리 프로그램을 짤때 내가 쓰고 싶은 기능을 쓰기 위해선 (.386), (.486), (.586) 을 써줘야한다.
어셈블리 코드 젤 앞에 작성 해야 한다.
(.NODEL FLAF) 플랫
(엑시트 함수 선언)
호출하면 원래 상태로 종료된다.
C와의 차이점은 include 앞에 #이 없다.
word 크기(2Byte) ,dword 크기(4Byte)
어셈블러는 빈칸을 얼로 인식하지 않는다. 끝에 0을 넣어 줘야 문자열의 끝이 인지된다.
(포인터)
인터럽트 ARM (0) | 2014.07.11 |
---|---|
ARM (0) | 2014.07.01 |
20140610 TWI (0) | 2014.06.10 |
20140522 LCD제어 (0) | 2014.05.22 |
20140516 초음파 (0) | 2014.05.16 |
#include "대부분의 설명은 주석에 적었습니다."
Step 1. 인터럽트 목적
(1) LED에 인터럽트를 건다.
(2) 인터럽트를 걸 때 마다 LED가 ON/OFF 된다.
Step 2. LED 연결
29번 라인 LED를 동작하려면 PIOA의 PA0~31중에 하나를 선택해야한다. 그중 PA0를 선택하기로 하겠다.
최초의 인터럽트발생은 LED가 꺼진상태에서 켜지는 것이다. 두번째 발생은 켜진상태에서 꺼지는 것이다.
Step 3. 인터럽트 설정
26번 라인은 확실하지 않음.
자세히 설명은 생략한다.>.<
1 (0) | 2014.07.22 |
---|---|
ARM (0) | 2014.07.01 |
20140610 TWI (0) | 2014.06.10 |
20140522 LCD제어 (0) | 2014.05.22 |
20140516 초음파 (0) | 2014.05.16 |
RECENT COMMENT