'EXE'에 해당되는 글 2건

이것은 EXE파일(16bit) 을 binary 또는 .COM인듯이 가공해주는 Overlap 코드입니다.
_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
크리에이티브 커먼즈 라이센스
Creative Commons License
Posted by minzkn

트랙백 주소 :: http://blog.minzkn.com/trackback/64

댓글을 달아 주세요