본문 바로가기

교육

API - 문자열 BOOT - 정수형 / 참과 거짓 중 한가지 값을 가진다. BYTE - unsigned char CHAR - char LONG - long WORD - unsigned short DWORD - unsigned long 0911 문자열 출력 TextOut - 글자를 그리는 함수* 5가지의 인자가 있다. -> TextOut(HDC hdc, int nXStart, int nYStart, LPCTSTR IpString, int cdString); * hdc - 화면에 무엇을 출력하는 '모든' 함수의 첫번째 인자는 hdc이다.* nXStart, nYStart - 출력될 문자열의 좌표 값* IpString - 문자열 포인터* cdString - 문자열의 길이 -> Null문자를 인식하지 않기 때문에 정확한 문자열의.. 더보기
ASSEM- 레지스터값 더보기
[어셈블리어] ESP와 push와 pop명령어 + pushad, popad ESP 레지스터 STACK의 시작'주소'를 가지고 있다. (32bit의 stack point) push 명령어 Operand를 1개 가진다. push 100 의 명령을 수행 할 때는 ESP = ESP - 4 * ESP = 100 이렇게 두가지의 수행을 하게된다. push명령 debug로 실행하는 화면 ESP가 가지고있는 현재 주소는 0012ffc4 push 0ffffffffh 명령을 수행 한 후 1. ESP = ESP - 4 의 주소인 12ffc0을 가지고 2. 그 주소에 ffff ffff의 메모리를 넣는다. push 012345678h 명령을 수행 한 후 1. ESP = ESP -4 의 주소인 12ffbc 2. 그 주소에 12345678의 메모리를 넣는데 리틀엔디안 방식으로 넣어진걸 확인할 수 있음. .. 더보기
[어셈블리어]imul과 div(idiv)와 확장명령어 imul 음수를 포함한 수를 곱할때 필요한 명령어 eax와의 연산만이 아닌 레지스터끼리의 곱, eax가아닌 다른 레지스터와 메모리의 곱, 상수와의 곱을 가능하게한다. imul source eax와의 곱셈, 레지스터와 메모리만 올 수 있다. imul register, source 두개의 operand를 가진다. add의 형식과 같이 곱한값이 operand1로 대입된다. imul register, source, immediate 두개의 operand와 immediate 즉 상수를 가진다. imul source에 대한 Operand 표 imul register, source에 대한 Operand표 imul register, source, immediate에 대한 Operand표 - imul의 곱 연산예시- 1.. 더보기
[어셈블리어] adc와 Jump 4.5 Addition and Subtraction of Larger Numbers adc add 와 기능은 같지만, carry(자리올림수)를 포함해서 덧셈을 하기 때문에 64bit의 연산이 가능하다. .386 .MODEL FLAT ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD .STACK 4096 .DATA Ndr1Hi DWORD ? Ndr1Lo DWORD ? Ndr2Hi DWORD ? Ndr2Lo DWORD ? .CODE _start: mov Ndr1Lo, 0FFFFFFFFh mov Ndr2Lo, 0FFFFFFFFh mov Ndr1Hi, 0 mov Ndr2Hi, 0 mov eax, Ndr1Lo add eax, Ndr2Lo mov Ndr1Lo, eax mov.. 더보기
[어셈블리어]inc(증가), dec(감소), mul(곱셈)명령 자주쓰는 메모리를 cache영역에 저장해두고 필요할 때마다 메모리 영역까지 갈 필요없이 cache영역으로 가서 저장해둔 메모리를 사용할 수 있다. 각 명령어에 해당하는 OP코드가 없으면 컴파일 에러가 난다. 즉 add에 add eax, a 의 경우 OP코드가 05로 존재하지만 add 20, eax의 경우 컴파일 할 OP코드가 없기 때문에 컴파일 불가능. 논리적으로는 20 = 20 + eax의 수식이 불가능 하기 때문에 컴파일이 안되는 걸로 보이지만 컴파일 상으로는 20 = 20 + eax 라는 형식자체가 없기 때문에 컴파일 에러가 뜬다. inc의 386 클럭 = 2, byte = 1 add의 386 클럭 = 2, byte = 5 inc - 1을 증가시키는 어셈블리 명령어 dec - 1을 감소시키는 어셈블.. 더보기
[어셈블리어] mov와 xchg mov일 때 동안은 EFL에 변화가 없고 add연산을 수행한 후 EFL에 아래에 보는 것 과 같이 EFL이 변한다. add연산 전 246 EFL(246) 0 0 1 0 0 1 0 0 0 1 1 0 EFL(flag register)을 확인하면 example의 표처럼 EFL에 OF SF ZF CF플래그의 값이 0인 것을 알 수 있다. EFL(206) 0 0 1 0 0 0 0 0 0 1 1 0 - 책 오류 CF = 1 - EFL(283) 0 0 1 0 1 0 0 0 0 0 1 1 양수의 경우인 7을 넘어섰기 때문에 OF발생 EFL(a96) 1 0 1 0 1 0 0 1 0 1 1 0 EFL(216) 0 0 1 0 0 0 0 1 0 1 1 0 EFL(202) 0 0 1 0 0 0 0 0 0 0 1 0 EFL(24.. 더보기
[어셈블리어] 연산에 따른 flags register의 값 mov일 때 동안은 EFL에 변화가 없고 add연산을 수행한 후 EFL에 아래에 보는 것 과 같이 EFL이 변한다. add연산 전 246 EFL(246) 0 0 1 0 0 1 0 0 0 1 1 0 EFL(flag register)을 확인하면 example의 표처럼 EFL에 OF SF ZF CF플래그의 값이 0인 것을 알 수 있다. EFL(206) 0 0 1 0 0 0 0 0 0 1 1 0 - 책 오류 CF = 1 - EFL(283) 0 0 1 0 1 0 0 0 0 0 1 1 양수의 경우인 7을 넘어섰기 때문에 OF발생 EFL(a96) 1 0 1 0 1 0 0 1 0 1 1 0 EFL(216) 0 0 1 0 0 0 0 1 0 1 1 0 EFL(202) 0 0 1 0 0 0 0 0 0 0 1 0 EFL(24.. 더보기
어셈블리어 기초3 1. CPU에 대한 이해 2. C에 대한 더 높은 이해 - advenced C C에서 이해할 수 없었던 것을 정확히 알기위해서 (C로도 알 수 없었던 것을) 3. ARM Boot Code Windbg사용 - 윈도우 디버그의 준말 output을 실행해서 EIP(명령어의 주소를 담고있는 레지스터)의 주소가 바뀌고 prompt1이 출력된다. input이 실행되면서 키보드로 데이터를 입력받는다. 1234567890을 입력했는데 &number1의 Memory를 보면 숫자가아닌 아스키코드로 입력된걸 알 수 있음 그래서 40개의 메모리중 1234567890을 제외한 30bit는 00으로 채워져있다. atod 함수(문자형을 정수형으로 바꾸어주는 책저작자가 만든 함수)실행 EAX의 주소가 바뀜 -> 1234567890(.. 더보기
ARM SR CDRx 로 DATA를 Read했을 때에는 각각의 메모리를 읽어 들일 수 있는데 LCDR로 Read하면 모두 Low되면서 제일 최근에 Conversion된 메모리를 읽어들인다. 그렇기 때문에 제일 최근의 메모리를 읽어들일 때에는 LCDR을 사용하면 됨. EOCx는 개별적으로 각각 메모리의 Conversion이 완료되었는지(끝났을 때)를 알고싶을 때 사용할 수 있고, DRDY는 제일 빨리 Conversion완료된(끝난) 메모리를 알 수있다. 더보기