목록Programming (132)
외로운 Nova의 작업실
안녕하세요. 이번시간에는 스택 프레임에대해서 알아보도록 하겠습니다. - 스택 프레임 스택 프레임은 스택안에서 함수에 의해 나눠진 공간을 의미합니다. 즉 main 프로시저안에서 프로시저1, 프로시저2, 프로시저3이 있고, 각 프로시저마다 스택에 변수를 넣는다면, 스택에는 프로시저1의 공간, 프로시저 2의 공간. 프로시저3의 공간으로 나눠지며, 각각을 스택 프레임이라고 할 수 있습니다. 스택은 상위주소에서 하위주소로 저장을 합니다. EBP는 Enhance Base Pointer로 각 스택 프레임의 첫 시작 포인터를 의미합니다. 스택프레임은 EBP가 저장된 주소를 기준으로 나뉘어지며, 항상 함수를 시작할때는 이전의 EBP값을 저장시켜주어야합니다. main 프로시저안에 프로시저1, 프로시저 2, 프로시저3 이있..
안녕하세요. 이번시간에는 double 시프트 연산자와 곱셈, 나눗셈에대해 배워보도록 하겠습니다. - SHLD 와 SHRD SHLD 는 shift left double 명령어로, 소스 비트와 목적지 비트를 연결해서 left 해줍니다. 예시를 한번 보겠습니다. .code mov al, 11110000b mov ah, 00001111b SHLD ah, al, 4 위 코드를 실행하게되면 ah - al 이 연결되며 왼쪽으로 시프트 하게됩니다. 즉, 00001111(ah) - 11110000(al) 이 상태에서 왼쪽으로 시프트 하는 거죠. 연산결과는 11111111(ah) - 00000000(al) 입니다. 왜냐면 마지막 4가 4번 하라는 뜻이기 때문입니다. 여기서 소비트는 al 이며, 목적지 비트는 ah라 부릅니..
안녕하세요. 이번시간에는 어셈블리어의 시프트 연산과 회전 명령어에대해 알아보겠습니다. - 시프트와 회전 명령어 SHL 왼쪽 시프트 SHR 오른쪽 시프트 SAL 왼쪽 산술 시프트 SAR 오른쪽 산술 시프트 ROL 왼쪽 회전 ORO 오른쪽 회전 RCL 왼쪽 캐리포함 회전 RCR 오른쪽 캐리포함 회전 SHLD 2배 정밀도 왼쪽 시프트 SHRD 2배 정밀도 오른쪽 시프트 - 논리 시프트와 산술 시프트 시프트 연산에는 총 2가지가 있습니다. 논리 시프트 연산과 산술 시프트 연산이죠. 시프트 연산을 할때는 항상 공백비트가 생깁니다. 이 공백비트를 0으로 채우는게 논리 시프트 연산이고, 이전의 숫자의 부호를 유지시키면서 채우는게 산술 시프트 연산이죠. 예를들어, 11111110b 를 오른쪽 시프트를 하게되면 0111..
안녕하세요. 이번시간에는 조건부 제어흐름을 조금이나마 쉽게 할 수 있는 디렉티브를 알아볼까합니다. 간단하게 말하면 고급언어에서 사용하는 if, while 문을 어셈블러 디렉티브로 작성하면 어셈블러가 그것을 해것하여 어셈블리어로 변경해줍니다. - .IF 디렉티브 고급언어에서 if 문과 같은 .IF 디렉티브에 대해서 알아보겠습니다. eax가1이면 ebx = 321, eax가 2면 ebx = 456, eax 가 3이면 ebx = 789를 넣는 어셈블리어 코드를 .IF 디렉티브를 이용해 짜보도록 하겠습니다. ;-----------------INCLUDE------------------------- ; include c:\assembly\irvine32.inc includelib c:\assembly\irvine..
안녕하세요. 이번 시간에는 문자열 암호화 예제 프로그램으로 XOR 문자열 암호화 프로그램을 어셈블리어로 작성해보도록 하겠습니다. 먼저 스터브 프로그램 작성을 해보도록 하겠습니다. ;this program is encryption or decryption ;-----------------INCLUDE------------------------- ; include c:\assembly\irvine32.inc includelib c:\assembly\irvine32.lib includelib c:\assembly\kernel32.lib includelib c:\assembly\user32.lib ;----------------------------------------------- .data Key = 231..
안녕하세요. 이번 시간에는 점프 명령어에대해서 정리해보도록 하겠습니다. - 특정 플래그 값에 따르는 점프 니모닉 설명 플래그/레지스터 JZ Jump if zero ZF = 1 JNZ Jump if not not zero ZF = 0 JC Jump if carry CF = 1 JNC Jump if not carry CF = 0 JO Jump if overflow OF = 1 JNO Jump if not overflow OF = 0 JS Jump if signed SF = 1 JNS Jump if not signed SF = 0 JP Jump if parity PF = 1 JNP Jump if not parity PF = 0 - 동등 비교에 따르는 점프 니모닉 설명 JE Jump if equal(leftOP..
안녕하세요, 이번 시간에는 프로시저를 사용하여 프로그램을 설계해보겠습니다. - 프로시저의 문서화 프로시저를 만들때 문서화를 하는 것은 개발해야할 좋은 습관입니다. 다음은 프로시저의 시작 부분에 넣을 수 있는 정보입니다. 1. 프로시저가 수행하는 모든 작업에대한 설명 2. Receive : 입력 매개변수에 대한 설명 3. Return : 프로시저가 반환하는 값에대한 설명 4. Requires : 요구 사항에대한 목록 위를 참고하여 세개의 32비트 정수의 합을 계산하는 SumOf라는 이름의 프로시저를 설명해보겠습니다. 3개의 정수는 호출되기전에 eax, ebx, ecx에 저장되어 있어야합니다. ;---------------------------------------------------------------..
안녕하세요, 이번 시간에는 Runtime Stack(실행시간 스택)을 사용하는 방법에대해서 알아보겠습니다. - Runtime Stack Runtime Stack은 스택 포인터 레지스터라고 하는 ESP 레지스터를 이용하여 CPU가 직접 관리하는 메모리 배열입니다. ESP 레지스터에는 스택에 있는 어떤 위치에 대한 32비트 오프셋을 저장합니다. ESP를 직접 조작하는 일은 거의 없으며, CALL, RET, PUSH, POP 과같은 명령어를 사용하여 간접적으로 수정됩니다. - Runtime Stack의 구조 자료구조를 배우셨다면 잘 알듯이 LIFO 구조를 가지고 있습니다. 마지막에 넣은걸 먼저 빼내야 처음에 넣었던 것을 뺄 수가 있죠. 다만, 시스템적으로보자면 Runtime Stack은 큰 숫자의 주소를 먼저..
안녕하세요. 이번 시간에는 이전 시간에 배운 라이브러리 프로시저를 사용하여 예제 프로그램을 만들어보도록 하겠습니다. 1.간단하게 글자색을 변경하고, DumpMem 으로 배열의 값을 나열하고 사용자로부터 값을 3번 입력받아 각각 그것을 int, hex, bin 형태로 출력 하는 프로그램을 짜보도록 하겠습니다. 프로시저들이 궁금하다면 이전 시간의 글을 참고하시면 이해가 편하실 겁니다. include c:\assembly\irvine32.inc includelib c:\assembly\irvine32.lib includelib c:\assembly\kernel32.lib includelib c:\assembly\user32.lib .data COUNT = 3 GreenTextOnBlack = Green + (..
안녕하세요, 이번 시간에는 irvine16과 irvine32 라이브러리에 있는 프로시저가 어떻게 사용되는지 알아보도록 하겠습니다. CloseFile CloseFile 프로시저는 이전에 생성하거나 열었던 파일을 닫습니다. 파일은 eax에 들어있는 32비트 정수 핸들로 식별됩니다. 파일이 성공적으로 닫히면 eax로 반환되는 값은 0이아닌 값입니다. 아래는 예시입니다. mov eax, filehandle call CloseFile Clrscr Clrscr 프로시저는 콘솔 윈도우를 깨끗하게 지웁니다. 이 프로시저는 일반적으로 프로그램의 시작과 끝에서 호출됩니다. 프로그램의 중간에서 호출된다면 사용자가 화면을 지우기전에 스크린에 이미있던 정보를 볼 수 있게 WaitMsg 프로시저를 호출하는 것을 추천합니다. 아래..