www.pudn.com > czxtsycx1.zip > REPOSIT0.ASM


G_EXEC      PROC FAR 
            ;in---- (ds)=system data segment 
            ;       (gs)=gDT_BUF segment-->head+program 
            ;       (ax)=THIS TASK GDT FIRST ADDRESS:OFFSET 
            ;       DS:G_WORK 100 DB PARA AREA 
            ;this   FS:USER_PsLDTT_ASDATA_SEL 
 
;jmp G_EXEC_END 
            PUSH AX            ;SS:1=USER_PsLDT ADDR 
            MOV BX,GS:00H 
            CMP BX,5A4DH 
            JZ  G_EXEC0 
            POP AX 
            MOV AX,1           ;Not DOS .exe  first 2 bytes is 4D5AH 
            JMP G_EXEC_END 
            ;*********************get program_size 
G_EXEC0:     
;pop ax 
;jmp G_EXEC_END 
            ;                   ss:1=GDT ADDR 
            MOV AX,USER_PsLDTT_ASDATA_SEL ;should use selector in gdt 
;pop ax 
;jmp G_EXEC_END 
 
            MOV FS,AX 
;pop ax 
;jmp G_EXEC_END 
            ;                    set ldt_desc for CS OF USER PROCESS  -->START 
            MOV AX,GS:08H       ;SIZE_HEAD PARA 
            SHL AX,4            ;SIZE_HEAD BYTE 
            PUSH AX             ;SS:1=GDT ADDR 2=SIZE_HEAD BYTE INTO STACK 
            ;;;;;;;;;           ;GET FILE_SIZE 
            MOV BX,GS:02H     ;mod512 
            MOV AX,GS:04H     ;file_sectors 
            CMP BX,0 
            JZ  g_exec1 
            DEC AX 
g_exec1:    XOR DX,DX 
            MOV CX,512 
            MUL CX          
            ADD AX,BX       
            ADC DX,0              ;DX:AX  file_size 
            MOV DS:G_WORK,AL        
            MOV DS:G_WORK[1],AH       
            MOV DS:G_WORK[2],DL 
            MOV DS:G_WORK[3],DH   ;DS:G_WORK FILE SIZE 
            MOV BX,GS:0EH 
            MOV DS:G_WORK[4],BL 
            MOV DS:G_WORK[5],BH 
            ;;;;;;;;;; 
            POP BX                ;GET SIZE_HEAD  
            SUB AX,BX 
            SBB DX,0              ;DL:AX=PROGRAM_SIZE=LIMIT 
            POP DI                ;DI=GDT ADDR   SS:0 
            PUSH DI 
            PUSH BX            ;SS:1=GDT ADDR 2=SIZE_HEAD BYTE INTO STACK 
            MOV FS:[DI].LIMIT,AX 
            MOV FS:[DI].GRAN,DL      ;limit HIGH 4 IN DL_LOW4  LIMIT<=1M 
            MOV FS:[DI].ACCESS,9AH 
                                  ;9EH:P=1 ,DPL=00,S=1 DATA SEGMENT,TYPE=EH 
                                  ;BASE_ADDR=3M+SIZE_HEAD+CS_OFF 
            MOV AX,GS:16H 
            ADD AX,BX 
            MOV FS:[DI].BASE_L,AX       
            MOV FS:[DI].BASE_M,G_BUF_BASE 
            MOV FS:[DI].BASE_H,0  
            ;                     set gdt_desc for CS OF USER PROCESS  --->END 
 
            ;                     LOOP OTHER SEGMENT-----START  
            MOV SI,GS:6H     ;reposit_count 
g_exec_1:   OR SI,SI 
            JZ g_exec_end1 
            MOV AX,SI 
            DEC AX 
            CMP AX,0 
            JLE g_exec_2 
            MOV CL,4 
            MUL CL 
g_exec_2: 
            MOV BX,GS:18H          
            ADD BX,AX              
            MOV CX,GS:[BX]       ;offset 0007 
            PUSH CX 
            MOV AX,GS:[BX+2]     ;SEG    0000  IN PARAG 
            XOR DX,DX 
            MOV CX,4 
            MUL CX               ;DX:AX= SEG IN BYTE 
            POP CX         ;SS:1=GDT ADDR 2=SIZE_HEAD BYTE INTO STACK 
            ADD AX,CX             
            ADC DX,0             ;DX:AX=OFFSET IN PROGRAM  
            POP CX               ;GET HEAD_SIZE 
            PUSH CX     ;SS:1=GDT ADDR 2=SIZE_HEAD BYTE INTO STACK 
            MOVZX EBX,CX          ;HEAD_SIZE 
            MOVZX EDX,DX 
            SHL EDX,16 
            MOVZX EAX,AX          ;OFFSET IN PROGRAM 
            ADD EDX,EAX 
            ADD EBX,EDX          ;EBX=OFFSET IN GS 
            MOV AX,GS:[EBX]      ;AX=SEG---GET SEGMENT IN PARA 0292 
                                 ;SEG TURN TO SEL. 
            push dx 
            MOV dL,DS:G_WORK[4] 
            MOV dH,DS:G_WORK[5] 
            CMP dX,AX 
            JZ g_exec_3 
            MOV DS:G_WORK[6],0      ;OTHER SEG 
            jmp g_exec_3_3 
g_exec_3: 
            MOV DS:G_WORK[6],1      ;STACK SEG 
g_exec_3_3: pop dx 
            MOV DX,SI 
            SHL DX,3 
            ADD DX,user_ps_sel      ;SEL. OF CS=NO.7 
                                    ;DX IS SEL. TI=0 RPL=0(2) 
            MOV GS:[EBX],DX         ;;;;;;;;reposit 
            CMP DS:G_WORK[6],1 
            JNE g_exec_33 
            MOV DS:G_WORK[7],DL 
            MOV DS:G_WORK[8],DH 
            ;set desc for segment 
g_exec_33:  XOR DX,DX 
            MOV CX,16 
            MUL CX               ;DX:AX SEG IN BYTE IN PROGRAM 
            POP CX         ;SS:1=GDT ADDR 2=SIZE_HEAD BYTE INTO STACK 
            ADD AX,CX             
            ADC DX,0             ;DX:AX=OFFSET IN GS 
            PUSH CX        ;SS:1=GDT ADDR 2=SIZE_HEAD BYTE INTO STACK 
            MOVZX EDX,DX 
            SHL EDX,16 
            MOVZX EAX,AX          ;OFFSET LOW16 
            ADD EDX,EAX           ;EDX= SEG OFFSET IN GS  IN BYTE  
                                  ;EDX= BASE IN GS 
            PUSH EDX              ;EDX=OFFSET FROM GS START  
            MOV EAX,G_BUF_BASE 
            SHL EAX,16            ;EAX=300000H 
            ADD EDX,EAX           ;EDX= BASE FROM 0 
            MOV BX,SI 
            SHL BX,3              ;OFFSET IN USER_P  
            MOV FS:[DI+BX].BASE_L,DX    ;DI NO CHANGE:GDT ADDR   
            SHR EDX,16 
            MOV FS:[DI+BX].BASE_M,DL 
            MOV FS:[DI+BX].BASE_H,0  
 
            MOV CL,DS:G_WORK 
            MOV CH,DS:G_WORK[1] 
            MOV AL,DS:G_WORK[2] 
            MOV AH,DS:G_WORK[3]     ;AX:CX FILE_SIZE 
            MOVZX EAX,AX 
            SHL EAX,16 
            MOVZX ECX,CX 
            ADD EAX,ECX          ;EAX FILE_SIZE 
            POP EDX              ;EDX=OFFSET FROM GS START 
            SUB EAX,EDX          ;EAX=SEG_LIMIT LEN(STACK)=200 
            MOV FS:[DI+bx].LIMIT,AX 
            SHR EAX,16 
            MOV FS:[DI+bx].GRAN,AL      ;limit HIGH 4 IS IN AL_LOW4  LIMIT<=1M 
            CMP DS:G_WORK[6],1 
            JE g_exec_4 
            MOV FS:[DI+bx].ACCESS,92H  
            JMP g_exec_5 
g_exec_4: 
            MOV FS:[DI+bx].ACCESS,92H 
                         ;96H:P=1 ,DPL=00,S=1 DATA SEGMENT,TYPE=3 (SS) 
                         ;BASE_ADDR=3M+SIZE_HEAD+SS_OFF 
g_exec_5: 
            DEC SI 
            JMP g_exec_1 
g_exec_end1:   
            POP DX      ;SS:1=GDT ADDR 2=SIZE_HEAD BYTE INTO STACK 
            POP AX 
            ;                  LOOP OTHER SEGMENT-----END 
            ;INIT SS,SP,CS,IP--->WORK[0..7] 
            ;DX=SIZE_HEAD 
            MOV AL,DS:G_WORK[7] 
            MOV AH,DS:G_WORK[8] 
            MOV DS:G_WORK,AL     ;SEL. OF SS 
            MOV DS:G_WORK[1],AH 
            MOVZX EDX,DX  
            MOV AX,GS:10H 
            dec ax 
            MOV DS:G_WORK[2],AL     ;SP 
            MOV DS:G_WORK[3],AH 
            MOV DS:G_WORK[4],G_BUF_BASE    ;CS 
            MOV DS:G_WORK[5],0H 
            MOV AL,GS:14H         
            MOV AH,GS:15H         
            MOV DS:G_WORK[6],AL     ;IP 
            MOV DS:G_WORK[7],AH 
            ;*********************A  -->end   deal with loading .exe 
G_EXEC_END: RET 
G_EXEC      ENDP 
 
; ////////////disp USER_Psldt AND head of dos_program after repositiom 
disp_ldt_head PROC FAR 
            ; ////////////disp USER_Psldt 
            MOV AH,9 
            MOV CX,0400H ;15 row 21 column 
            MOV DX,OFFSET TEST1_MSG 
            INT 21H 
            push fs 
            mov ax,USER_PsLDTT_ASDATA_SEL 
            mov fs,ax 
            MOV di,fs:offset user_pS  ;USER_PsLDT FIRST ADDR 
            mov ax,fs:[di].limit;/////CS  
            mov cx,0600H 
            call disp_ax 
            mov ax,fs:[di].BASE_L 
            mov cx,0608H 
            call disp_ax 
            mov aL,fs:[di].BASE_M 
            mov aH,fs:[di].ACCESS 
            mov cx,0610H 
            call disp_ax 
            mov aL,fs:[di].GRAN 
            mov aH,fs:[di].BASE_H 
            mov cx,0618H 
            call disp_ax 
            mov ax,fs:[di+8].limit;/////SS 
            mov cx,0700H 
            call disp_ax 
            mov ax,fs:[di+8].BASE_L 
            mov cx,0708H 
            call disp_ax 
            mov aL,fs:[di+8].BASE_M 
            mov aH,fs:[di+8].ACCESS 
            mov cx,0710H 
            call disp_ax 
            mov aL,fs:[di+8].GRAN 
            mov aH,fs:[di+8].BASE_H 
            mov cx,0718H 
            call disp_ax 
            mov ax,fs:[di+16].limit;/////DS 
            mov cx,0800H 
            call disp_ax 
            mov ax,fs:[di+16].BASE_L 
            mov cx,0808H 
            call disp_ax 
            mov aL,fs:[di+16].BASE_M 
            mov aH,fs:[di+16].ACCESS 
            mov cx,0810H 
            call disp_ax 
            mov aL,fs:[di+16].GRAN 
            mov aH,fs:[di+16].BASE_H 
            mov cx,0818H 
            call disp_ax 
            POP fS 
; ////////////disp USER_Psldt 
 
;disp head of user_ps: after reposition in g_buf 
            MOV AH,9 
            MOV CX,0A00H ;15 row 21 column 
            MOV DX,OFFSET HEAD_DOS 
            INT 21H 
            mov ax,g_buf_sel 
            mov gs,ax 
            mov ax,gs:0200h 
            mov cx,0C00H 
            call disp_ax 
            mov ax,gs:0202h 
            mov cx,0C08H 
            call disp_ax 
            mov ax,gs:0204h 
            mov cx,0C10H 
            call disp_ax 
            mov ax,gs:0206h 
            mov cx,0C18H 
            call disp_ax 
            mov ax,gs:0208h 
            mov cx,0C20H 
            call disp_ax 
            mov ax,gs:020Ah 
            mov cx,0C28H 
            call disp_ax 
            mov ax,gs:020Ch 
            mov cx,0C30H 
            call disp_ax 
            mov ax,gs:020Eh 
            mov cx,0C38H 
            call disp_ax 
            ret 
disp_ldt_head ENDP 
;disp head of user_ps: after reposition in g_buf