이것은 EXE파일(16bit) 을 binary 또는 .COM인듯이 가공해주는 Overlap 코드입니다.
_OVERLAY 세그먼트의 위치에 EXE파일 그대로 복사해넣으면 됩니다.
초기 CS:IP를 검출하여 EXE파일 이미지를 적절히 재배치해주게 되는 그런겁니다.
(PSP를 대체한다고 하면 이해가 쉬울려나?)
옛날에 16bit 커널개발하시려고 도전해보셨던 분들이라면 이런것쯤 하나 만들어 두셨을거라 생각합니다.
저 역시 예전부터 커널 개발한답시고 이것을 만들었지만 지금은 DOS가 아닌 32bit OS를 만들기
때문에 이런거는 불필요해보이기도 합니다.
하지만 이 개념 자체는 알아두면 좋은 내용인듯 하여 적어둡니다.
(컴파일러가 요즘에는 좋아져서 이제는 이런 코드를 만들일은 없습니다만 알아두면 응용할곳은 많습니다.)
_OVERLAY 세그먼트의 위치에 EXE파일 그대로 복사해넣으면 됩니다.
초기 CS:IP를 검출하여 EXE파일 이미지를 적절히 재배치해주게 되는 그런겁니다.
(PSP를 대체한다고 하면 이해가 쉬울려나?)
옛날에 16bit 커널개발하시려고 도전해보셨던 분들이라면 이런것쯤 하나 만들어 두셨을거라 생각합니다.
저 역시 예전부터 커널 개발한답시고 이것을 만들었지만 지금은 DOS가 아닌 32bit OS를 만들기
때문에 이런거는 불필요해보이기도 합니다.
하지만 이 개념 자체는 알아두면 좋은 내용인듯 하여 적어둡니다.
(컴파일러가 요즘에는 좋아져서 이제는 이런 코드를 만들일은 없습니다만 알아두면 응용할곳은 많습니다.)
| 코드: |
|
; /**************************** ; * MINZ kernel overay * ; * Copyright(c)1998 by MINZ * ; * Code by Cho JaeHyuk * ; ****************************/ ; ------- MZIPOVER.ASM ------- .286 OGROUP group _TEXT, _OVERLAY assume cs:OGROUP, ds:OGROUP, es:nothing, ss:nothing _TEXT segment byte public use16 'CODE' org 0h _start@ label near cli call near ptr $ + 3 + 2 jmp short _getip0@ mov bp, sp mov bx, word ptr [bp] sub bx, 4 retn _getip0@ label short push cs pop ds lea ax, OGROUP:_run_data@[bx] shr ax, 4 mov cx, cs add ax, cx add ax, word ptr OGROUP:_run_data@[bx + 8] mov word ptr OGROUP:_run_seg@[bx], ax mov cx, 16 mov ax, cs mul cx lea cx, OGROUP:_run_data@[bx] add ax, cx adc dx, 0 add ax, word ptr OGROUP:_run_data@[bx + 24] mov word ptr OGROUP:_run_src@[bx + 0], ax mov word ptr OGROUP:_run_src@[bx + 2], dx mov ax, word ptr OGROUP:_run_seg@[bx] add ax, word ptr OGROUP:_run_data@[bx + 22] mov word ptr OGROUP:_run_jump@[bx + 3], ax mov ax, word ptr OGROUP:_run_data@[bx + 20] mov word ptr OGROUP:_run_jump@[bx + 1], ax mov ax, word ptr OGROUP:_run_seg@[bx] add ax, word ptr OGROUP:_run_data@[bx + 14] mov ss, ax mov sp, word ptr OGROUP:_run_data@[bx + 16] mov cx, word ptr OGROUP:_run_data@[bx + 6] or cx, cx jz short _run_norelocate@ _run_relocate@ label short push cx mov cx, 16 mov ax, word ptr OGROUP:_run_src@[bx + 0] mov dx, word ptr OGROUP:_run_src@[bx + 2] mov di, ax and di, 0fh div cx mov es, ax mov ax, word ptr OGROUP:_run_seg@[bx] mul cx push dx push ax mov ax, word ptr es:[di + 2] mul cx add ax, word ptr es:[di] adc dx, 0 pop di pop si add ax, di adc dx, si mov di, ax and di, 0fh div cx mov es, ax mov ax, word ptr OGROUP:_run_seg@[bx] add word ptr es:[di], ax add word ptr OGROUP:_run_src@[bx + 0], 4 adc word ptr OGROUP:_run_src@[bx + 2], 0 pop cx loop short _run_relocate@ _run_norelocate@ label short push cs pop ds push cs pop es sti jmp short $ + 2 _run_jump@ db 0eah db 'MINZ' _run_seg@ db ' k' _run_src@ db 'ernel o' db 'verlay ' db 'by Cho JaeHyuk' _TEXT ends _OVERLAY segment para public use16 'OVERLAY' _run_data@ label byte _OVERLAY ends end _start@ ; End of source |




댓글을 달아 주세요