mov, add, sub 같은 명령어들을 '니모닉' 이라고 읽는다. (영어 실력 부족 으로 편하게 한글로 ㅋㅋ)
데스티네이션, 소스 위치에 있는 아이들은 '오퍼레이션'
기계어 언어는 '오피코드'
실행파일을 어셈블리 파일로 변환(디스어셈블리) 가 가능하지만 (왜냐하면 기계어랑 어셈블리 언어랑 1대 1대응 하기 때문에)
실행파일을 C 파일로는 변환 할수 없다.
따라서 OP코드 기계어를 변환 하면 어셈블리 명령어가 수정 된다.
메모리에 메모리를 넣는것은 불가능 이다 (일레갈)
표를 다 외울 필요는 없다(만약 다 외우면 완전 그사람 자체가 컴파일러 어셈블러,,, 덜덜)
다만 표를 보고 표를 읽어서 프로그램 짤 수 있으면 된다 표를 읽는 방법을 익히자.
1) 왼쪽 오퍼렌드가 레지스터 일 경우
immediate byte 1바이트 짜리 상수
ex) AL에 100을 넣는 방법
mov AL, 100 (C 언어일 경우 AL = 100;)
mov AL, 64H (C 언어일 경우 AL = 0x64;)
mov AL, 1100110B , (C에서는 2진수 안됨.)
요걸 오피 코드로 바꾸면 B064 이렇게 2바이트이다.
mov CH, 10 이걸 기계어로 바꾸면 B5 0A
mov EDX, 64 이걸 기계어로 바꾸면 BA 40 00 00 00 (number of byte 가 5바이트니까 ㅎㅎㅎ)
2)왼쪽 오퍼렌드가 메모리일 경우
direct 메모리에 바로 집어 넣음으로 주소가 필요 하다
immediate (상수 값)은 CPU에 있다.
mov [EDX], 64 register indirect은 포인터 기법 이랑 비슷하다고 생각하면 된다.
AL direct memory byte 4 1 1 5 A0
AX direct word 4 1 1 5 A1
EAX direct doubleword 4 1 1 5 A1
애네들은 특수 취급 한다. 어큐멀레이터 자주 쓰는 아이 니까
별도의 명령어 OP코드가 따로 있다.
direct memory byte AL 2 1 1 5 A2
direct word AX 2 1 1 5 A3
direct doubleword EAX 2 1 1 5 A3
애네도 마찮가지
segment register 요건 안쓴다 표보는 방법을 알아야 한다
표를 보고 프로그램을 짜라
C에서 C = A + B; 명령어가 단순 1줄로 보이지만 어셈블리 실제론 아래와 같이 3줄 명령어 내리고 있음.
3) XCHG 명령어 (두 값을 바꾸는 것. C의 swap 함수라고 생각하면 됨.)
xchg 명령어 카피 데이타 두 값을 교환
이 명령어 있으면 레지스터가(변수가 C 처럼) 3개 필요 없이 두개만 있어도 된다.
용량과 효율 알고 짜야 한다 프로그램 어느게 더 효율 적인지 ex. mov 명령을 3번을 쓸껀지, xchg 한번을 쓸 것인지
ex) 오퍼렌드 레지스터8을 팬티엄에서 쓴다 했을때 mov 3번 쓰면 클락 3, 용량 6. xchg 클락3 용량 2. xchg가 용량에서 이득임
어셈블리에 손을 댄다면 최소 컴파일보다 나은 프로그램을 짤 수 있어야 한다
(컴파일 보다 병신적으로 짤빠에 어셈블리로 안짜는게 낮다.)
내가 어셈블리로 짤껀가 C로 짤껀가. 컴파일 했을때 용량과 시간 비교 해봐서 이득이 되게 짜야 한다.
4) 덧셈 뺄셈 니모닉 add, sub
윈디비지 F10 누르셔서 노란줄 있는 소스코드창 안 뜨는 경우.
(CM님 께서 쳐주셨는데 io.obj 생략한것 말곤 달라진게 없지만 ... 아 성형해야 하나 ㅋㅋ)
ml /Zi /coff /c main.asm
link /debug /subsystem:console /entry:start /out:main.exe main.obj Kernel32.Lib
windbg main.exe
수업 실습 코드
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | .386 .MODEL FLAT ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD .STACK 4096 .DATA number1 DWORD ? .CODE _start: ; mov EAX, 0 mov EBX, 0 mov ECX, 0 mov EDX, 0 mov EAX, 100 mov EBX, 12345678H xchg EAX, EBX ; p96~ example (pdf 109~) mov AX, 75H mov CX, 1A2H add AX, CX mov EAX, 75H mov ECX, 1A2H sub EAX, ECX mov AX, 77ACH mov CX, 4B35H add AX, CX mov EAX, 75H mov ECX, 1A2H add EAX, ECX mov BL, 4BH add BL, 4 INVOKE ExitProcess, 0 PUBLIC _start END ; ml /c /coff /Zi main.asm ; link /debug /subsystem:console /entry:start /out:main.exe main.obj kernel32.lib | cs |
교제 p96~ example (pdf 109~) 코딩하고 윈디비지로 확인 해보기.
word at value: FF 20
doubleword at Dbl:
00 00 01 00
이부분 넣는건 잘 모르겠습니다 가르쳐주시옵소서 ㅠ ㅋㅋ
CM님이 텔레그램에 올려주신 다른 디버거 프로그렘 소계 링크 http://netstat.tistory.com/27
요건 작년 선배님이 작성해주신 업무일지 http://wowcat.tistory.com/1879
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20510924-23번-윤재희 적외선 센서 코딩, 큰 수의 덧셈과 뺄셈, 분기와 순환 (4) | 2015.09.24 |
---|---|
20510923-22번-우대희 온도센서,어셈블리(Division Instructions) (5) | 2015.09.24 |
[잡담] 현재 수업중인 어셈블리 pdf파일에 대해서 (3) | 2015.09.23 |
20510922-21번-여지윤 어셈블리(inc, dec , neg , mul, imul) (3) | 2015.09.22 |
20150917-19번-안향진 - ADC (5) | 2015.09.18 |
20150916-18번-안해운 - ADC (6) | 2015.09.17 |
20150915-14번-박제혁 일일업무일지 - PWM을 이용한 멜로디 연주 (4) | 2015.09.16 |
20150947-13번-박서연 일일업무일지 - PWM, 스피커 (6) | 2015.09.14 |