728x90 CSE/system programing29 [시스템 프로그래밍 12-2강] Memory Management 페이징 기법 Dynamic Memory Allocation동적할당(일명 힙 할당)은 프로그래밍 언어가 객체를 생성할 때 메모리를 예약하는데 사용하는 기술입니다.우리가 high level 언어를 쓰다보면 다이나믹 메모리를 할당을 많이 쓴다.(new, malloc등)실제 C,C++,Java등에는 런타임 힙 관리자가 존재한다.힙 관리자는 스토리지 할당 및 해제를 위한 프로그래밍 요청을 처리한다.일반적으로 프로그램이 시작될 때 OS에서 큰 메모리 블록을 할당한다.스토리지 블록에 대한 Free pointer 목록을 생성한다.실제로 heap을 사용하는건 어셈블리 언어에서 지원하는게 아니라 윈도우 API를 사용해서 해준다.Window API리스트따라서 이걸 깊게 들어가지는 않습니다.GetProcessHeapEAX에 default.. 2023. 5. 28. [시스템 프로그래밍 12 -1강]advanced processor (Stack Frames) 개요우리가 지금껏 쓰던 프로시저(PROC)는 그냥 코드의 위치를 변경하는 것 뿐이었다.사실 high level 언어인 C나 CPP나 모두 함수를 할 때 processor를 쓰는것이다.하지만 고급 언어에서는 함수로 인자를 넘겨주는 것을 볼 수가 있다. 오늘은 어떻게 인자를 함수에 넘겨주는가에 대해서 배울 것이다.물론 그 방법을 이해하기 앞서 필요한 개념들을 먼저 설명하도록 하겠다.Stack Frames1. Stack Parametersstack Frame이란 간단히 말해 다음의 것들을 저장하기 위해서 스택의 영역이다.함수에게 전달된 인수(인자)가 스택에 저장된다.서브루틴의 반환주소(리턴 주소)로컬 변수(함수 안에서 사용하는 로컬 변수로 스택에서 지역변수에 대한 메모리 공간이 할당 되는 것이다.)저장된 레지.. 2023. 5. 28. [시스템 프로그래밍 11강] Multiplication and Division Instructions & Extended Addition and Subtraction Multiplication and Division Instructions곱셈 나눗셈 명령.1. MUL (unsigned multiply) Instruction(명령)Arithmetic 연산을 하면서 부호가 있는 것과 없는 것 들을 살펴봤다.이 명령은 unsigned한 값들의 곱을 의미한다.대부분의 Arithmetic 오퍼레이션은 피연산자가 2개였고 대부분이 바이너리 였다. 다만 이 명령은 특이하게도 피연산자를 하나만 받는다는 특징이 있다.그렇다면 나머지 하나의 연산자는 지정이 되어있다는 뜻이다.이 연산자는 피연산자가 메모리나 레지스터이다.상수가 피연산자로 오지 않는다!MUL명령의 3가지 버전8비트의 피연산자가 있다면, 나머지 하나는 AL레지스터로 고정이다.그 결과를 AX레지스터로 집어넣는다.16비트인 경.. 2023. 5. 18. [시스템 프로그래밍 10강] Shift and Rotate 명령 및 활용 덧셈 나눗셈을 하려 하는데 그 전에 쉬프트 연산자를 먼저 알아보자.Shift and Rotate Instructionsx86 프로세스는 쉬프트 연산에 많은 명령어 세트를 제공한다.모두 OVERFLOW와 캐리플래그에 영향을 준다.2가지 형태의 쉬프트 연산을 제공한다.1. Logical Shifts and Arithmetic Shifts1. Logical shift우리가 익히 알고 있는 쉬프트 연산이다.8비트의 데이터가 있다고 할 때 한칸씩 우리가 원하는 방향으로 이동 시키고 새로 생성된 비트를 0으로 채우는 것이 특징이다.빠져나온 비트가 캐리 플래그로 이동한다.LSB가 빠져나왔고 MSB는 비어있어서 0으로 채워진다.예시 11001111에 대한 단일 논리적 오른쪽 이동으로 01100111이 생성된다.2. A.. 2023. 5. 16. 9-2강 Conditional Control Flow Directives (조건부 제어 흐름 지시어) Conditional Control Flow Directives조건부 제어 흐름 지시어(우리는 이거 쓰면 안돼요!)MASM을 만든 MS에서 조금 더 편하게 하라는 의미로 만들어 준 것이다.high level에 있는 기능을 MASM에서 제공하는 것이다.Directive는 기계어로 번역이 안됨 → 대응하는 기계어가 없어요..! 1. Creating IF Statements.IF, .ELSE, .ELSEIF, and .ENDIF directives또한 연산자도 이런식으로 사용이 가능하다어셈블링 하기 전에 MASM이 어셈블리어로 바꾼 것이다 강조 !! CPU에서 처리하는 게 아니라 번역해주는 것입니다. 기계어 아니고 어셈블리어로 번역!! 과제를 할 떄는 CONDITIONAL CONTROL FLOW Directi.. 2023. 5. 15. 9 -1 강 Conditional Loop Instructions (LOOPZ,LOOPE) Conditional structure(조건부 구조 예시코드!) Conditional Loop Instructions(조건부 루프 명령)오늘은 조건부 loop에 대해 다뤄보겠다.loop 복습해보면 : ecx레지스터를 카운터로 사용해서 하나씩 줄여가면서 반복을 진행했다.1. LOOPZ and LOOPE InstructionsLOOPZ : 제로플래그가 세팅 되어있을떄만 Loop 명령처럼 동작하는 명령어이다.LOOPE : LOOPZ와 완전히 동일한 옵코드를 공유한다. (JUMPZ와 JUMPE가 같은것과 같은 개념이다.)두 명령의 특징이 명령은 Loop명령 처럼 작동하지만 Zero flag를 확인해서 0일때만 레이블로 점프를 진행합니다.ECX가 0이 아니고, 제로플래그가 세팅되어있을 때 루프 실행한다.만약 제로플레그가 0이 아니거나 ECX 레지스터가 0이 아닌 경우에는 점프.. 2023. 5. 15. [시스템 프로그래밍 8-2]Conditional Jumps (조건부 점프 명령) 1. Conditional Structuresx86 명령어 집합에는 명시적인 상위 수준 논리 구조가 없지만 비교와 점프의 조합을 사용하여 구현할 수 있습니다두 단계1. CMP, AND 또는 SUB와 같은 연산은 CPU 상태 플래그를 수정합니다. 2. 조건부 점프 명령은 플래그를 테스트하고 새 주소로 브랜치를 생성합니다.예제 1(jz)jz (zero flag가 0인 경우에 해당 레이블로 점프)cmp eax, 0 jz L1 ; jump if ZF = 1 . . L1:예제 2 (jnz)AND 명령은 DL 레지스터에서 비트 단위 AND를 수행하여 0 플래그에 영향을 줍니다0 플래그가 비어 있으면 JNZ(0이 아닌 경우 점프) 명령이 점프합니다.and dl , 10110000b jnz L2 ; jum if ZF .. 2023. 4. 28. [시스템 프로그래밍 8-1]Boolean and Comparison Instructions (어셈블리어에서 불린 연산자) Boolean and Comparison Instructionsif와 else에 대해서 공부하기 전에 미리 boolean 연산자에 대해서 보겠다.인텔 명령어 세트에는 이미 부울 연산 명령어가 포함되어있다.이 표에서는 보이는 TEST연산은 아마 익숙치 않을텐데 간단하게 설명하면 AND와 같은 연산인데 결과를 저장하지는 않는 것이다. 뒤에서 왜 쓰는지 보겠다. The CPU Status Flags부울 명령은 Zero, Carry, Sign, Overflow, and Parity flags 에 영향을 준다.작업 결과가 0과 같으면 0 플래그가 설정됩니다.캐리 플래그는 연산이 대상 피연산자의 가장 높은 비트의 캐리를 생성할 때 설정됩니다.Sign 플래그는 대상 피연산자의 상위 비트의 복사본입니다.오버플로 플래그.. 2023. 4. 28. [시스템 프로그래밍 7-3] Irvine32 Library 정리 중간고사 범위 : Stack 과 프로시저까지 (슬라이드 25까지)이 글은 시험범위가 아닙니다. 개인이 만든 라이브러리에 대해서 정리한 글 입니다. 이 책의 저자가 Irvine32 Library 를 개인적으로 만들었습니다. 따라서 우리는 실습을 이 라이브러리를 이용할 것입니다. 그러나 이것을 암기하는 것은 불 필요하므로 저는 이 글을 과제를 진행할 때 지속적으로 참고할 목적으로 만들었습니다.왜 이걸 하냐면 우리가 printf를 하려면 상위 언어에서는 printf해주면 됐지만 어셈블리 언어에서는 print하나 하는데도, 메모리에 저장된 값을 해석해서 하나하나 그것에 해당하는 함수를 만들어 줘야 하기 때문에 우리는 그것정도는 미리 구현해 놓은 라이브러리를 사용한다.printf(”%d”,126); 을 예시로 보.. 2023. 4. 28. 이전 1 2 3 4 다음 728x90