⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reposit0.asm

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 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 + -