본문 바로가기

교육/ASSEM

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(.. 더보기
어셈블리어 기초 instruction 명령어 .NOLIST 앞에 마침표가 들어가 있으면 directive 라 한다. 디렉티브와 인스트럭션이 모이면 스테이먼트라고 한다. name mnemonic operand(s) ;comment ZeroCount : mov ecx, 0 ; initialize count to zero mnemonic - 니모닉이라 발음 (m 은 묵음) ; (세미콜론) 뒤는 주석 jmp addLoop ; repeat addition name이 없는 경우 EndIfBlank: name만 있는 경우 .386 사용하고 싶은 기능이 어셈블리 버전을 초과한 경우에 써준다. (CPU) .486, .586 은 .386이상의 기능을 사용하게 해 준다. (.586을 사용하면 .586이하의 시스템에는 사용되지 않는다.) ... 더보기
어셈블리어의 기초 EAX, EBX, ECX, EDX를 'data registers' or 'general registers'. 라고 부른다 EAX - accumulator 라 부른다. EAX는 가장 자주사용하는 레지스터이기 때문에 조금 더 빠르게 작동하게 만들었다. (그래서 따로 이름이 붙음) (EAX, EBX, ECX, EDX 다 자주사용하지만 그 중에 EAX를 제일 자주 사용한다.) * ARM의 경우에는 레지스터 수가 많기때문에 모두가 accumulator라고 할 수 있는데 intel의 경우에는 레지스터의 수가 적기 때문에 적은 레지스터를 최대한 활용하는 방향 CPU 가 32bit 이기 때문에 각 레지스터 들은 4byte를 사용한다. 그 중 EAX레지스터의 모양을 보여주는데 EBX, ECX, EDX 레지스터도 전부 비.. 더보기