📄 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -