'Programming/DOS'에 해당되는 글 5건

  1. 2007/06/02 장인정신 [C/DOS] 화면에 특정 문자를 유지하는 램상주 예제
  2. 2007/05/07 장인정신 EXE overlay (Convert EXE to BIN/COM)
  3. 2007/05/07 장인정신 Startup code for DOS
  4. 2007/05/05 장인정신 EXE 파일 헤더 초간단 정리
  5. 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
크리에이티브 커먼즈 라이센스
Creative Commons License
2007/06/02 00:31 2007/06/02 00:31
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 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

댓글을 달아 주세요

댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/166
댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/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
크리에이티브 커먼즈 라이센스
Creative Commons License
2007/05/07 11:05 2007/05/07 11:05
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 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

Startup code for DOS

Programming/DOS 2007/05/07 11:03 장인정신
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
크리에이티브 커먼즈 라이센스
Creative Commons License
2007/05/07 11:03 2007/05/07 11:03
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 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

EXE 파일 헤더 초간단 정리

Programming/DOS 2007/05/05 02:11 장인정신
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
크리에이티브 커먼즈 라이센스
Creative Commons License
2007/05/05 02:11 2007/05/05 02:11
TAG , ,
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 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 사용예제

Programming/DOS 2007/05/01 03:08 장인정신
아래의 예제는 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 */
크리에이티브 커먼즈 라이센스
Creative Commons License
2007/05/01 03:08 2007/05/01 03:08
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 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