'Programming/DOS'에 해당되는 글 5건
- 2007/06/02 장인정신 [C/DOS] 화면에 특정 문자를 유지하는 램상주 예제
- 2007/05/07 장인정신 EXE overlay (Convert EXE to BIN/COM)
- 2007/05/07 장인정신 Startup code for DOS
- 2007/05/05 장인정신 EXE 파일 헤더 초간단 정리
- 2007/05/01 장인정신 XMS 사용예제
SPAN class=postbody이것은 우측상단 모퉁이에 특정 문자열을 계속 유지하여 표시하는 br /작은 램상주 프로그램입니다. br /br /개발환경은 DOS의 TURBO-C v2.0 또는 Borland-C v3.x 입니다. br /br /Interrupt vector 0x1c(Timer) 를 가로채어 주기적으로 화면에 표시하며 br /램에 상주시키기 위해서 keep function 으로 해당 Vector function 영역을 reserve 시키는 것이 이 소스의 구성입니다. br /br //SPAN
TABLE cellSpacing=1 cellPadding=3 width=90% align=center border=0
TBODY
TR
TDSPAN class=genmedB코드:/B/SPAN/TD/TR
TR
TD class=code#includelt;dos.hgt; br /#includelt;string.hgt; br /#includelt;conio.hgt; br /#includelt;stdlib.hgt; br /br /#define INTERRUPTnbsp; 0x1C br /br /void interrupt far (*old_handler)(void); br /void interrupt Interrupt(void); br /void PutLogoDisplay(void); br /br /char logomunja[80]; br /char munjax; br /char count; br /br /void main(char argc,char *argv[]) br /{ br /nbsp;if(argcgt;1) br /nbsp;{ br /nbsp; strcpy(logomunja,[ ); br /nbsp; strcat(logomunja,argv[1]); br /nbsp; strcat(logomunja, ]); br /nbsp;} br /nbsp;else strcpy(logomunja,[ code by minzkn ]); br /nbsp;munjax=80-strlen(logomunja); br /nbsp;old_handler=getvect(INTERRUPT); br /nbsp;setvect(INTERRUPT,Interrupt); br /nbsp;keep(NULL,_SS+(_SP/16)-_psp); br /} br /br /void interrupt Interrupt(void) br /{ br /nbsp; old_handler(); br /nbsp; PutLogoDisplay(); br /} br /br /void PutLogoDisplay(void) br /{ br /nbsp;long xcount=(long)munjax; br /nbsp;count=NULL; br /nbsp;while(countlt;strlen(logomunja)) br /nbsp;{ br /nbsp; nbsp;*((unsigned char far *)0xB8000000L+(xcount*2L)nbsp; )=logomunja[count++]; br /nbsp; nbsp;*((unsigned char far *)0xB8000000L+(xcount*2L)+1L)=YELLOW+(BLUE*0x10); br /nbsp; nbsp;xcount++; br /nbsp;} br /}/TD/TR/TBODY/TABLESPAN class=postbodybr //SPAN
받은 트랙백이 없고,
댓글이 없습니다.
댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/166
댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/166
트랙백 주소 :: http://blog.minzkn.com/trackback/166
트랙백 RSS :: http://blog.minzkn.com/rss/trackback/166
트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/166
span class=postbody이것은 EXE파일(16bit) 을 binary 또는 .COM인듯이 가공해주는 Overlap 코드입니다.
br /
_OVERLAY 세그먼트의 위치에 EXE파일 그대로 복사해넣으면 됩니다.
br /
초기 CS:IP를 검출하여 EXE파일 이미지를 적절히 재배치해주게 되는 그런겁니다.
br /
(PSP를 대체한다고 하면 이해가 쉬울려나?)
br /
옛날에 16bit 커널개발하시려고 도전해보셨던 분들이라면 이런것쯤 하나 만들어 두셨을거라 생각합니다.
br /
저 역시 예전부터 커널 개발한답시고 이것을 만들었지만 지금은 DOS가 아닌 32bit OS를 만들기
br /
때문에 이런거는 불필요해보이기도 합니다.
br /
하지만 이 개념 자체는 알아두면 좋은 내용인듯 하여 적어둡니다.
br /
(컴파일러가 요즘에는 좋아져서 이제는 이런 코드를 만들일은 없습니다만 알아두면 응용할곳은 많습니다.)
br /
br /
/spantable align=center border=0 cellpadding=3 cellspacing=1 width=90%tbodytr tdspan class=genmedb코드:/b/span/td /tr tr td class=code
br /
; /****************************
br /
;nbsp; *nbsp; nbsp; MINZ kernel overaynbsp; nbsp; *
br /
;nbsp; * Copyright(c)1998 by MINZ *
br /
;nbsp; *nbsp; nbsp; Code by Cho JaeHyuknbsp; nbsp;*
br /
;nbsp; ****************************/
br /
;nbsp; ------- MZIPOVER.ASM -------
br /
br /
.286
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;OGROUP group _TEXT, _OVERLAY
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;assume cs:OGROUP, ds:OGROUP, es:nothing, ss:nothing
br /
_TEXTnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; segment byte public use16 'CODE'
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;org 0hnbsp; nbsp;
br /
_start@nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; label nearnbsp; nbsp; nbsp; nbsp; nbsp;
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;cli
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;call near ptr $ + 3 + 2
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;jmp short _getip0@
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov bp, sp
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov bx, word ptr [bp]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;sub bx, 4
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;retn
br /
_getip0@nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;label short
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;push cs
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;pop ds
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;lea ax, OGROUP:_run_data@[bx]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;shr ax, 4
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov cx, cs
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;add ax, cx
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;add ax, word ptr OGROUP:_run_data@[bx + 8]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov word ptr OGROUP:_run_seg@[bx], ax
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov cx, 16
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov ax, cs
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mul cx
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;lea cx, OGROUP:_run_data@[bx]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;add ax, cx
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;adc dx, 0
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;add ax, word ptr OGROUP:_run_data@[bx + 24]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov word ptr OGROUP:_run_src@[bx + 0], ax
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov word ptr OGROUP:_run_src@[bx + 2], dx
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov ax, word ptr OGROUP:_run_seg@[bx]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;add ax, word ptr OGROUP:_run_data@[bx + 22]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov word ptr OGROUP:_run_jump@[bx + 3], ax
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov ax, word ptr OGROUP:_run_data@[bx + 20]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov word ptr OGROUP:_run_jump@[bx + 1], ax
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov ax, word ptr OGROUP:_run_seg@[bx]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;add ax, word ptr OGROUP:_run_data@[bx + 14]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov ss, ax
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov sp, word ptr OGROUP:_run_data@[bx + 16]
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov cx, word ptr OGROUP:_run_data@[bx + 6]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;or cx, cx
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;jz short _run_norelocate@
br /
_run_relocate@nbsp; nbsp; nbsp;label short
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;push cx
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov cx, 16
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov ax, word ptr OGROUP:_run_src@[bx + 0]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov dx, word ptr OGROUP:_run_src@[bx + 2]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov di, ax
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;and di, 0fh
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;div cx
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov es, ax
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov ax, word ptr OGROUP:_run_seg@[bx]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mul cx
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;push dx
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;push ax
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov ax, word ptr es:[di + 2]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mul cx
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;add ax, word ptr es:[di]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;adc dx, 0
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;pop di
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;pop si
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;add ax, di
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;adc dx, si
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov di, ax
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;and di, 0fh
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;div cx
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov es, ax
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;mov ax, word ptr OGROUP:_run_seg@[bx]
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;add word ptr es:[di], ax
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;add word ptr OGROUP:_run_src@[bx + 0], 4
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;adc word ptr OGROUP:_run_src@[bx + 2], 0
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;pop cx
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;loop short _run_relocate@
br /
_run_norelocate@nbsp; nbsp;label short
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;push cs
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;pop ds
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;push cs
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;pop es
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;sti
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;jmp short $ + 2
br /
_run_jump@nbsp; nbsp; nbsp; nbsp; nbsp;db 0eahnbsp; nbsp; nbsp;
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;db 'MINZ'
br /
_run_seg@nbsp; nbsp; nbsp; nbsp; nbsp; db ' k'
br /
_run_src@nbsp; nbsp; nbsp; nbsp; nbsp; db 'ernel o'
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;db 'verlay '
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;db 'by Cho JaeHyuk'
br /
_TEXTnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ends
br /
_OVERLAYnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;segment para public use16 'OVERLAY'
br /
_run_data@nbsp; nbsp; nbsp; nbsp; nbsp;label bytenbsp; nbsp; nbsp;
br /
_OVERLAYnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;ends
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;end _start@
br /
br /
; End of source
/td/tr/tbody/table
받은 트랙백이 없고,
댓글이 없습니다.
댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/64
댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/64
트랙백 주소 :: http://blog.minzkn.com/trackback/64
트랙백 RSS :: http://blog.minzkn.com/rss/trackback/64
트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/64
댓글을 달아 주세요
댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/64댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/64
span class=postbody이것은 DOS에서 어셈블리로 인자를 받는것에 대한 예제 입니다.
br /
PSP에 대해서 알아두면 이해가 좀더 쉽겠네요.
br /
br /
/spantable align=center border=0 cellpadding=3 cellspacing=1 width=90%tbodytr tdspan class=genmedb코드:/b/span/td /tr tr td class=code
br /
.386
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ASSUME CS:CODE, DS:CODE, ES:NOTHING, SS:STACK_AREA
br /
CODEnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; SEGMENT PARA PUBLIC USE16 'CLASS_CODE'
br /
L_STARTUP:
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ; DS:0080H - PSP area : DS세그먼트는 실행시 값이 넘겨져 옵니다.
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; MOV SI, 0080H
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; CLD
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; LODSB
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; XOR CH, CH
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; MOV CL, AL
br /
L_PRINT_LOOP:
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; JCXZ L_EXIT
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; LODSB
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; MOV DL, AL
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; MOV AH, 02H
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; INT 21H
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; DEC CXnbsp;
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; JMP L_PRINT_LOOPnbsp; nbsp; nbsp; nbsp; nbsp; nbsp;
br /
L_EXIT:nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; MOV AX, 4C00H
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; INT 21H
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; HLT
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; JMP $
br /
CODEnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ENDS
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ASSUME DS:DATA
br /
DATAnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; SEGMENT WORD PUBLIC USE16 'CLASS_DATA'
br /
DATAnbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ENDS
br /
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; ASSUME SS:STACK_AREA
br /
STACK_AREAnbsp; nbsp; nbsp; SEGMENT PARA STACK USE16 'CLASS_STACK'
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; DB 4096 DUP (?)
br /
STACK_AREAnbsp; nbsp; nbsp; ENDS
br /
nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; END L_STARTUP
/td/tr/tbody/table
받은 트랙백이 없고,
댓글이 없습니다.
댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/63
댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/63
트랙백 주소 :: http://blog.minzkn.com/trackback/63
트랙백 RSS :: http://blog.minzkn.com/rss/trackback/63
트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/63
댓글을 달아 주세요
댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/63댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/63
span class=postbody이것은 COFF에 대한 내용이 아닙니다. 그냥 옛날 EXE파일 헤더에 대한 내용입니다.
br /
즉, 요즘의 Win32의 stub 부분에 관계된 내용일뿐입니다.
br /
너무 오래된 내용이라서 별로 중요한 내용은 아닙니다.
br /
br /
span style=font-weight: bold;EXE 파일 포맷/span
br /
/spantable align=center border=0 cellpadding=3 cellspacing=1 width=90%tbodytr tdspan class=genmedb인용:/b/span/td /tr tr td class=quoteOffset 설명
br /
00H File signature MZ (파일 식별자)
br /
02H Length of partial page at end
br /
04H Length of image in pages
br /
06H Number of relocation entries (Entry 하나에 4바이트 할당)
br /
08H Size of header in paragraphs (Header 의 paragraph 단위의 크기)
br /
0AH Minimum memory above program
br /
0CH Maximum memory above program
br /
0EH Stack segment 초기치 (SS register)
br /
10H Stack offset 초기치 (SP register)
br /
12H Check sum
br /
14H Instruction pointer 초기치 (IP register)
br /
16H Code segment 초기치 (CS register)
br /
18H File offset of first relocation (Byte 단위의 offset)
br /
20H Overlay number
br /
22H 이후부터 실행이미지 (재배치 table 및 stuffing byte 포함)/td /tr/tbody/tablespan class=postbody
br /
br /
여기서 paragraph 는 16바이트를 의미함. 정확히는 Segment 간의 간격의 최소단위이기도 함./span
받은 트랙백이 없고,
댓글이 없습니다.
댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/43
댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/43
트랙백 주소 :: http://blog.minzkn.com/trackback/43
트랙백 RSS :: http://blog.minzkn.com/rss/trackback/43
트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/43
댓글을 달아 주세요
댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/43댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/43
아래의 예제는 XMS(himem.sys 가 제공하던 메모리 페이지 할당) 예제br /br /br /br //* Code by JaeHyuk Cho lt;mailto:minzkn@infoeq.comgt; */ br /#include lt;stdio.hgt; br /br /#include lt;string.hgt; br /br /#include lt;dos.hgt; br /br /#include lt;stdlib.hgt; br /br /#include lt;dir.hgt; br /br /#include common.h br /br /br /br /void (far *himemCALLFunction)(void); br /br /unsigned int himemVersion; br /br /himemMEM n_himem; br /br /unsigned int s_AllocTable[N_MAXHIMEMHANDLE]; br /br /unsigned int s_AllocPtr=0; br /br /br /br /inline void far himemCALL(void){(*himemCALLFunction)();} br /br /br /br /signed int far himemInit(void) br /br /{ br /br /union REGS rin; br /br /struct SREGS sin; br /br /unsigned int n_counter; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;for(n_counter=0;n_counterlt;N_MAXHIMEMHANDLE;n_counter++)s_AllocTable[n_counter]=0x0000; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(s_MD.IsSWAP==N_True){s_MD.IsHIMEM=N_False; return(N_False);} br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;rin.x.ax=0x4300; int86(0x2f, amp;rin, amp;rin); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(rin.h.al!=0x80){s_MD.IsHIMEM=N_False; return(N_False);} br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;rin.x.ax=0x4310; int86x(0x2f, amp;rin, amp;rin, amp;sin); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;(void far *)himemCALLFunction=(void far *)MK_FP(sin.es, rin.x.bx); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_AX=0x0000; himemCALL(); himemVersion=(unsigned int)_AX; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;s_MD.IsHIMEM=N_True; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;return(N_True); br /br /} br /br /br /br /unsigned int far himemGetSize(unsigned int *n_big, unsigned int *n_total) br /br /{ br /br /unsigned int n_bigmem, n_totalmem; br /br /unsigned int n_return; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_AH=0x08; himemCALL(); n_return=(unsigned int)_BX; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_totalmem=(unsigned int)_DX; n_bigmem=(unsigned int)_AX; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;*n_total=n_totalmem; *n_big=n_bigmem; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;switch((n_returnamp;0xff)!=0) br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; case 0x80: br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; case 0x81: br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; case 0xa0: br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; case 0xa1: s_MD.IsHIMEM=N_False; break; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; default: break; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;} br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(n_totalmemlt;N_MINHIMEMSIZE)s_MD.IsHIMEM=N_False; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(n_bigmemlt;N_MINHIMEMSIZE)s_MD.IsHIMEM=N_False; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;return(n_returnamp;0x00ff); br /br /} br /br /br /br /unsigned long far himemLock(unsigned int n_handle) br /br /{ br /br /unsigned int n_lock[2]; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_AH=0x0c; _DX=s_AllocTable[n_handle]; himemCALL(); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_lock[0]=_DX; n_lock[1]=_BX; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(_AX!=N_True)return(N_False); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;return(((signed long)n_lock[0]lt;lt;16)|(signed long)n_lock[1]); br /br /} br /br /br /br /signed int far himemUnLock(unsigned int n_handle) br /br /{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_AH=0x0d; _DX=s_AllocTable[n_handle]; himemCALL(); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(_AX!=N_True)return(N_False); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;return(N_True); br /br /} br /br /br /br /unsigned int far himemAlloc(unsigned int n_size) br /br /{ br /br /unsigned int n_return; br /br /unsigned int n_count; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(s_MD.IsHIMEM==N_False) br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; union REGS rin; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; struct SREGS sin; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; signed char far *n_filenamet=new(signed char far [30]); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; signed char far *n_filename=new(signed char far [MAXPATH]); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; for(n_count=1;n_countlt;N_MAXHIMEMHANDLE;n_count++) br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; { br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(s_AllocTable[n_count]==0){s_AllocPtr=n_count; break;} br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; sprintf(n_filenamet, jackswap\\~jswp%03d.swp, s_AllocPtr); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; strcpy(n_filename, MakePath(n_filenamet)); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; delete(n_filenamet); UnLink(n_filename); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.ax=0x3c00; rin.x.cx=0x05; rin.x.dx=FP_OFF(n_filename); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; sin.ds=FP_SEG(n_filename); int86x(0x21, amp;rin, amp;rin, amp;sin); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; n_return=_AX; delete(n_filename); s_AllocTable[s_AllocPtr]=n_return; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; return(s_AllocPtr); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;} br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_AH=0x09; _DX=(unsigned int)n_size; himemCALL(); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(_AX!=N_True)return(N_False); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_return=(unsigned int)_DX; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;for(n_count=1;n_countlt;N_MAXHIMEMHANDLE;n_count++) br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; if(s_AllocTable[n_count]==0) br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; { br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;s_AllocTable[n_count]=n_return; n_return=(unsigned int)n_count; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;break; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; } br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;} br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;himemLock(s_AllocTable[n_return]); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;return(n_return); br /br /} br /br /br /br /signed int far himemFree(unsigned int n_handle) br /br /{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(s_MD.IsHIMEM==N_False) br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; union REGS rin; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; signed char far *n_filenamet=new(signed char far [30]); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; signed char far *n_filename=new(signed char far [MAXPATH]); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; sprintf(n_filenamet, jackswap\\~jswp%03d.swp, n_handle); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; strcpy(n_filename, MakePath(n_filenamet)); delete(n_filenamet); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.ax=0x3e00; rin.x.bx=s_AllocTable[n_handle]; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; int86(0x21, amp;rin, amp;rin); s_AllocTable[n_handle]=0; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; UnLink(n_filename); delete(n_filename); return(N_True); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;} br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;himemUnLock(s_AllocTable[n_handle]); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_AH=0x0a; _DX=s_AllocTable[n_handle]; himemCALL(); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;s_AllocTable[n_handle]=0; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(_AX!=N_True)return(N_False); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;return(N_True); br /br /} br /br /br /br /signed int far himemMEM2XMS(void far *n_source, unsigned int n_handle, unsigned long n_offset, unsigned long n_length) br /br /{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(s_MD.IsHIMEM==N_False) br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; union REGS rin; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; struct SREGS sin; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.ax=0x4200; rin.x.bx=s_AllocTable[n_handle]; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.cx=(unsigned int)((n_offsetgt;gt;16)amp;0xffff); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.dx=(unsigned int)(n_offsetamp;0xffff); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; int86(0x21, amp;rin, amp;rin); rin.x.ax=0x4000; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.bx=s_AllocTable[n_handle]; rin.x.cx=(unsigned int)n_length; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.dx=FP_OFF(n_source); sin.ds=FP_SEG(n_source); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; int86x(0x21, amp;rin, amp;rin, amp;sin); return(N_True); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;} br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm push si; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm push ds; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.length=n_length; n_himem.sourcehandle=0; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.sourceaddress=(unsigned long)n_source; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.targethandle=s_AllocTable[n_handle]; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.targetaddress=(unsigned long)n_offset; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_SI=(unsigned int)FP_OFF(amp;n_himem); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_DS=(unsigned int)FP_SEG(amp;n_himem); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_AH=0x0b; himemCALL(); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm pop ds; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm pop si; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(_AX!=N_True)return(N_False); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;return(N_True); br /br /} br /br /br /br /signed int far himemXMS2MEM(unsigned int n_handle, void far *n_target, unsigned long n_offset, unsigned long n_length) br /br /{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(s_MD.IsHIMEM==N_False) br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; union REGS rin; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; struct SREGS sin; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.ax=0x4200; rin.x.bx=s_AllocTable[n_handle]; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.cx=(unsigned int)((n_offsetgt;gt;16)amp;0xffff); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.dx=(unsigned int)(n_offsetamp;0xffff); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; int86(0x21, amp;rin, amp;rin); rin.x.ax=0x3f00; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.bx=s_AllocTable[n_handle]; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.cx=(unsigned int)n_length; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; rin.x.dx=FP_OFF(n_target); sin.ds=FP_SEG(n_target); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; int86x(0x21, amp;rin, amp;rin, amp;sin); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; return(N_True); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;} br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm push si; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm push ds; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.length=n_length; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.sourcehandle=s_AllocTable[n_handle]; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.sourceaddress=(unsigned long)n_offset; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.targethandle=0; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.targetaddress=(unsigned long)n_target; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_SI=(unsigned int)FP_OFF(amp;n_himem); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_DS=(unsigned int)FP_SEG(amp;n_himem); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_AH=0x0b; himemCALL(); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm pop ds; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm pop si; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(_AX!=N_True)return(N_False); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;return(N_True); br /br /} br /br /br /br /signed int far himemXMS2XMS(unsigned int n_sourcehandle, unsigned int n_targethandle, unsigned long n_offsetsource, unsigned long n_offsettarget, unsigned long n_length) br /br /{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(s_MD.IsHIMEM==N_False)return(N_False); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm push si; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm push ds; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.length=n_length; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.sourcehandle=s_AllocTable[n_sourcehandle]; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.sourceaddress=(unsigned long)n_offsetsource; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.targethandle=s_AllocTable[n_targethandle]; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;n_himem.targetaddress=(unsigned long)n_offsettarget; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_SI=(unsigned int)FP_OFF(amp;n_himem); _DS=(unsigned int)FP_SEG(amp;n_himem); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;_AH=0x0b; himemCALL(); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm pop ds; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;asm pop si; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;if(_AX!=N_True)return(N_False); br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;return(N_True); br /br /} br /br /br /br /void far himemAllFree(void) br /br /{ br /br /signed int n_count; br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;for(n_count=1;n_countlt;N_MAXHIMEMHANDLE;n_count++) br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;{ br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; if(s_AllocTable[n_count]!=0){himemFree(s_AllocTable[n_count]);} br /br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;} br /br /} br /br //* End of source */
받은 트랙백이 없고,
댓글이 없습니다.
댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/31
댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/31
트랙백 주소 :: http://blog.minzkn.com/trackback/31
트랙백 RSS :: http://blog.minzkn.com/rss/trackback/31
트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/31
댓글을 달아 주세요
댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/31댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/31

글
댓글을 달아 주세요
댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/166댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/166