전공/시스템 프로그래밍

[시스템 프로그래밍 7-3] Irvine32 Library 정리

뜨거운 개발자 2023. 4. 28. 11:15

중간고사 범위 : Stack 과 프로시저까지 (슬라이드 25까지)

이 글은 시험범위가 아닙니다. 개인이 만든 라이브러리에 대해서 정리한 글 입니다.

이 책의 저자가 Irvine32 Library 를 개인적으로 만들었습니다. 따라서 우리는 실습을 이 라이브러리를 이용할 것입니다. 그러나 이것을 암기하는 것은 불 필요하므로 저는 이 글을 과제를 진행할 때 지속적으로 참고할 목적으로 만들었습니다.

왜 이걸 하냐면 우리가 printf를 하려면 상위 언어에서는 printf해주면 됐지만 어셈블리 언어에서는 print하나 하는데도, 메모리에 저장된 값을 해석해서 하나하나 그것에 해당하는 함수를 만들어 줘야 하기 때문에 우리는 그것정도는 미리 구현해 놓은 라이브러리를 사용한다.

printf(”%d”,126); 을 예시로 보아도..!

36h를 해석해서 126을 화면에 찍어줘야 하기 때문

뭔갈 출력하려면 21번 인터럽트도 걸어줘야하고.. 이것저것 많이 해야한다..

배경 지식

링크 라이브러리

  • 머신 코드로 어셈블된 프로시저(서브루틴)가 포함된 파일입니다.
  • 링크 라이브러리는 하나 이상의 소스 파일로 시작되며, 이 소스 파일은 객체 파일로 어셈블됩니다.
  • 객체 파일은 링커 유틸리티에서 인식하는 특수 형식의 파일에 삽입됩니다.
  • 프로그램이 WriteString이라는 프로시저를 호출하여 콘솔 창에 문자열을 표시한다고 가정해 보겠습니다. • 프로그램 소스에는 WriteString 프로시저를 식별하는 PROTO 지시문이 포함되어야 합니다: (WriteString proto) • 다음으로, CALL 명령은 WriteString을 실행합니다: (call WriteString) • 프로그램이 어셈블될 때, 어셈블러는 링커에 의해 채워질 것을 알기 때문에 CALL 명령어의 대상 주소를 비워 둡니다. • 링커는 링크 라이브러리에서 WriteString을 찾아 라이브러리에서 프로그램의 실행 파일로 적절한 기계어 명령을 복사합니다. – 또한, WriteString의 주소를 CALL 명령에 삽입합니다. • 호출하는 프로시저가 링크 라이브러리에 없는 경우 링커는 오류 메시지를 표시하고 실행 파일을 생성 하지 않습니다.

링커 명령 옵션

링커 유틸리티는 프로그램의 객체 파일을 하나 이상의 객체 파일 및 링크 라이브러리와 결합합니다. • 예) 다음 명령은 hello.obj를 irvine32.lib 및 kernel32.lib 라이브러리에 연결합니다.

32비트 프로그램 연결

kernel32.lib 파일(Microsoft Windows 플랫폼 소프트웨어 개발 키트의 일부)에는 kernel32.dll이라는 파일에 있는 시스템 기능에 대한 링크 정보가 포함되어 있습니다.

  • 후자는 MS-Windows의 기본 부분이며 동적 링크 라이브러리라고 합니다.
  • 문자 기반 입출력을 수행하는 실행 함수가 포함되어 있습니다.
  • 이 과정에서는 Irvine32.lib를 링크합니다.

라이브러리 생성 동기

어셈블리 언어 프로그래밍을 위한 MS 공식 표준 라이브러리가 없습니다

Windows에서 실행되는 32비트 모드에서 IO 라이브러리는 OS에 직접 호출해야 합니다.

하지만 초보 프로그래머에게는 몇 가지 어려움이 있습니다

따라서 Irvine32 라이브러리는 초보자를 위한 간단한 IO 인터페이스를 제공하도록 설계되었습니다.

개요

콘솔 창

콘솔 창(또는 명령 창)은 명령 프롬프트가 표시될 때 MS-Windows에서 생성하는 텍스트 전용 창입니다

Microsoft Windows에서 콘솔 창을 표시하려면 검색 시작 필드에 cmd를 입력합니다.

파일 핸들

Windows OS에서 현재 열려 있는 파일을 식별하는 데 사용되는 32비트 정수입니다.

프로그램에서 Windows 서비스를 호출하여 파일을 열거나 만들면 OS에서 새 파일 핸들을 생성하여 프로그램에서 사용할 수 있도록 합니다.

파일에서 읽거나 쓰기 위해 OS 서비스 메서드를 호출할 때마다 동일한 파일 핸들을 서비스 메서드에 파라미터로 전달해야 합니다

각 기능 설명

RandomRange

Randomize

WriteString

라이브러리 테스트1

테스트 2

테스트 3


Uploaded by N2T

728x90