- https://www.youtube.com/watch?v=qGN4LBomxFQ&list=PL1IheunyylbaYAzQv8bdu3hxq8YX5cKlY&index=7
- https://duddnr0615k.tistory.com/263
- https://gusals1620.tistory.com/7
반도체학과에서 배우는 것 : 논리회로를 배우는 이유, 시스템 반도체와의 연관성 및 반도체 설계
※ 해당 포스팅 내용에 관심있으신 대학생 분들, 고등학생 분들의 메일은 언제든 환영입니다! 저도 사실 본 전공은 반도체 설계가 아닌 이동통신이라 지식이 많이 부족하지만, yhm1620@khu.ac.kr로
gusals1620.tistory.com
- 기본 개념
- 기계어에 좀 더 가까운 low-level 언어
- 구성
- 하드웨어
ALU : 산술논리연산장치 / 레지스터 : 연산을 위한 임시저장장치 / 메모리(RAM) : 휘발성 가상메모리
- 하드웨어
OllyDbg
- 레지스터 메모리 주소 명명규칙
- EAX
- EA~EH / X / L
extension 고정 넘버링 사용할 자릿수 16bit → 32bit로 확장되며 추가된 접두 레지스터 고유 Id ( char ) 4bit 4bit
- Ram → Ram 은 불가
- Ram → Reg / Reg → Ram만 가능
- word = 2byte / dword ( double word ) = 4byte / qword = 8byte
- word는 16bit 시절 기준 주소를 담을 수 있는 메모리
- 16bit = 주소 할당 영역이 16bit ( 2**16bit = 4GB , 그래서 4GB 램까지밖에 못가지는? )
- 메모리(RAM) 주소는 대괄호[]로 숫자를 둘러쌈
- 상태 레지스터 ( 플래그 )
- C : carry
- 연산결과가 1bit의 범위를 넘으면 1
- equal 결과 전>=후 0 , 전<후 1 ( a - b 가 음수이면 범위를 벗어나기 때문, 비교연산자는 논리상 sub를 통해 접근 )
- P
- A
- Z(E) ( Zero, Equal )
- zero : 이전 작업결과가 0일때
- equal : cmp결과가 same일때
- S : sign
- sign ( 부호 ) 할당 슬롯 값을 가져옴
- T
- D
- O : over flow
- C : carry
- DB = data byte
- 명령어
- MOV [Output Address] [Input Data or Address] : Input data를 Output data에 덮어쓰기
- mov qword/dword/word(byte등도 가능) ptr [pointer], [value or pointer] 도 가능 ( 데이터 뒤쪽부터 유효갯수만 판정, word = 16bit )
- Jmp ( J ) [명령줄 Address] : 다음 명령줄(좌상단)을 대상 주소로 변경 ( 레지스터의 EIP를 Target으로 변경 )
- 기본은 읽어온 갯수 만큼 ( byte ) 타겟명령주소(EIP)에 추가
- EIP : 실행명령줄의 주소
- SHORT 사용 시, 메모리에는 현재명령줄 주소와, 대상 명령줄 주소의 차이만을 담고, 실행시 가감연산하여 주소 변경 ( 명령줄 메모리 아끼기 위해 )
- INC/DEC [reg Address] : address의 값++
- INC/DEC word ptr [ram address]
- Add/Sub [a] [b] : 더하기/빼기 ( * 주의, 에디터에 따라 16진수가 디폴트일수 있음 ) a += b, a -= b
- 포인터 사용하기
- [11]에 22가 있고, [22]를 참조하고싶다면,
- mov EAX [11] → mov [대상] [EAX] 이런식으로 저장 후 덮어씌워야 함
- ( 대괄호 안에 reg주소를 넣으면 reg값을 주소로 메모리에서 탐색 )
- offset [ECX + n]
- ex. char = 3byte라고 치면, EAX = [EDX], EBX = [EDX+1], ECX = [EDX+2] 이런식으로 묶어 가져올 수 있음
- ex. ECX를 offset으로 쓰고, mov ECX 0, mov qword [EDX + ECX] → INC ECX → mov [EDX + ECX] ( [EDX + ECX * n]도 가능 )
- but reg + reg는 불가
- [base + offset + index * scale 가능], reg는 최대 2개, index는 reg만 가능 ( 곱연산은 reg에서만 가능하다는 건듯?, offset과 base는 맥락적 구분 )
- NOP : Null
- cmp [a] [b]
- a==b 비교연산자
- 접두 + 논리 + 접미
- 접두 : 명령어축약 ( ex. J = jump )
- 논리 : 연산자 ( ex. N = not 등 )
- 접미 : 조건 ( 보통 상태레지스터 ( ex. Z, OllyDbg의 우하단 ) )
- ( ex. JNZ = z가 0일때, 할당 명령줄로 점프 )
- 조건 ( flag 이름을 붙이면 그냥 flag 그대로 사용 )
- E : z와 동일, z flag 사용 ( jump flag = equal flag, jump와 equal의 발생 조건이 배타적이라서, 레지에서 플래그메모리를 공유하는 듯 )
- A, B : 상호 배타 A ( above ) ↔ B ( below ) ( unsigned )
- A는 c=0 z = 0, B는 c=1 z =0
- z=1이면 a = b이니 z = 0
- G, L : 상호 배타 G ( grater ) ↔ L ( less )
- A↔B와 동일하지만, 부호를 포함 ( 첫번째 자리를 부호로 취급, signed )
- ZAE = ZNB, ZBE = ZNA
- MOV [Output Address] [Input Data or Address] : Input data를 Output data에 덮어쓰기