P.175
loop문에서 ecx를 0으로 넣으면 안된다.
0에서 -1를 하면 FFFFFFFF
여기에서 -1하면 FFFFFFFE식으로 된다. 그러면 엄청나게 많이 반복하게 된다.
이를 위한 해결책으로 jecxz를 for문 전에 넣어 놓는다.
JECXZ : NUMBER가 0이면 점프한다.
for문을 여러가지로 코딩할 수가 있다.
옛날 컴파일러는 for문의 용량이 컸지만 컴파일러가 요즘은 효율적으로 만들 수가 있다.
일반적인 프로그램은 c언어가 편하다. c를 컴파일하면 어셈블리가 만들어진다. 그래서 c언어는 계속 쓰인다.
p.180
5.5 ARRAY
P.182~184예제 해보기
소스 분석.
_START: ;코드시작
;배열에다 입력받은 수를 계속해서 적재하다 음수를 입력받으면 빠져나옴
OUTPUT DIRECTIONS ; PRINTF DIRECTION
MOV NBRELTS,0 ; NBRELTS =0
LEA EBX, NBRARRAY ;EBX = & NBRARRAY
WHILEPOS: OUTPUT PROMPT ; PRINTF PROMPT
INPUT NUMBER,20 ; SCANF(NUMBER) 최대 20글자
ATOD NUMBER ; NUMBER 정수변환
JNG ENDWHILE ;NUMBER가 음수가 되면 ENDWHILE로 점프.
MOV [EBX],EAX ; *EBX = EAX
INC NBRELTS ; NBRELTS++
ADD EBX,4 ; EBX = EBX +4
JMP WHILEPOS ; WHILEPOS로 점프해라
ENDWHILE
;배열의 숫자의 합과 평균을 구함
MOV EAX,0 ;EAX에 0대입. SUM =0
LEA EBX,NBRARRAY ;EBX = 배열주소
MOV ECX,NBRELTS ;ECX =NBRELTS. 배열갯수
JECXZ QUIT ;멤버가 없으면 끝냄
FORCOUNT1: ADD EAX,[EBX] ; EAX = EAX + *EBX
ADD EBX,4 ; EBX = EBX +4
LOOP FORCOUNT1
CDQ ;부호를 저장할 메모리 확장
IDIV NBRELTS ;배열 갯수 만큼 값을 나눔
DTOA OUTVALUE,EAX ;아스키로 변환
OUTPUT AVGLABEL ;출력 평균
OUTPUT ABOVELABEL ;출력 평균이상 숫자
LEA EBX,NBRARRAY ;EBX = &NBRARRAY
MOV ECX,NBRELTS ;ECX = NBRELTS
FORCOUNT2: CMP [EBX],EAX ; IF(*EBX > EAX)
JNG ENDIFBIG ;EAX가 크면 ENDIFBIG점프
DTOA OUTVALUE,[EBX] ; 아스키 변환
OUTPUT OUTVALUE ;출력
ENDIFBIG:
ADD EBX,4
LOOP FORCOUNT2
QUIT: INVOKE EXITPROCESS,0
mov [ebx],eax 는 *ebx = eax과 같다.
즉, []는 주소에 가서 값을 집어 넣어라는 뜻이다.
p.189. 파이프란 개념.
기본명령 사이클
1. fetch an instruction from memory
cpu에 명령을 적재한다.
2. decode the instruction
명령어 해석
3. execute the instruction
명령 실행
1 cycle 에 1,2,3이 일어난다.
나눗셈 하면 10cycle
arm경우에는 f d e 보다 많다. 그러므로 컨디셔널 점프로 인한 손해가 더 크다.
파이프가 많으면 반드시 좋은 것은 아니다.
조건문을 쓰면 효율성이 떨어진다.(중요하다)
명령어가 A,B,C,D,E순으로 code 영역저장되어 있다. cpu로 버스를 통해 들고온다.
fetch(적재), decode(해석), execute(실행)
1주기 : fetch에 a를 들고 온다.
2주기 : decode에 a , 놀고 있는 fetch에 b를 들고 온다.
3주기 : execute에 a, decode에 b, fetch에 c. 이러면 가장 효율이 좋은 상태이다.
4주기 : a는 실행되어 삭제되고 b가 실행된다. 그런데 컨디셔널 조건이라서 다음에 올 명령어가 뭐가 올지 모르기 때문에 명령어가 b만 남기고 제거가 된다.
5주기 : 만약 b명령어로 점프가 되면 z를 들고 온다. 이러면 프로그램이 느려진다.
CHAPTER 6. PROCEDURES
이 챕터가 어셈블리를 하는 주요 이유이다.
c언어에서 함수를 말하는 것과 같다.
(이 챕터는 블로그 비공개로 해놓을 것. 포트폴리오는 사용가능.회사에 pdf파일로 제출.)
이력서에서 마침점, 띄어쓰기 잘쓰자.
* ESP(extended stack pointer) : 스택 프레임의 끝 지점 주소가 저장.
* EBP(extended base pointer) : 스택 프레임의 시작 주소가 저장.
.STACK 4096
시작과 끝을 4096 크기 만큼 만들어라는 명령. ESP가 이동하여 STACK 영역이 커진다.
stack은 최소 2byte 단위로 표시된다. 위 그림에서 메모리가 개입할 때 속도가 느려지는 것을 알 수 있다.
p. 196. push를 2번한 그림.
PUSH OPERATION
1. 주소 - 크기.
우선 push를 할 크기 만큼 주소값을 빼준다.
2. [주소] = 값 대입
값을 넣어준다. little endian이므로 순서 바뀜.
다음과 같은 소스 친다.
위 그림처럼 만든다. ESP 주소를 긁어서 계산기에 -8한다음 계산결과를 MEMORY창으로 띄운다.
EAX에 86B5가 들어감
PUSH AX가 실행 되면 메모리에 적재됨
PUSH 0FFFFFF10H가 실행되면 메모리에 적재
POP OPERATION
1. 값을 빼서 메모리에 값을 넣는다.
2. 주소 + 크기
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151007 - 권오민 - GPIO&AFIO / ASSEMBLY(C와 링크하기) (3) | 2015.10.07 |
---|---|
201501006 - 2번 강동조 (오전: GPIO -LED 오후: ) (5) | 2015.10.06 |
20151005 - 홍준모 (오전 : ARMCortexM3, 오후 : Assambly) (5) | 2015.10.05 |
2015.10.02 천정호 업무일지 - Assembly (7) | 2015.10.05 |
20150930-26번-임현수-일일업무일지-취업특강, 어셈블리 loop 명령 (6) | 2015.10.01 |
20150925-23번-이량경-일일업무일지-ASM {jum, cmp}/ 적외선 온도 감지 센서 (6) | 2015.09.30 |
20510924-23번-윤재희 적외선 센서 코딩, 큰 수의 덧셈과 뺄셈, 분기와 순환 (4) | 2015.09.24 |
20510923-22번-우대희 온도센서,어셈블리(Division Instructions) (5) | 2015.09.24 |