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

📄 priboot.asm

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 ASM
字号:
CODE        SEGMENT PARA USE16 
            ASSUME CS:CODE
            ORG  0600H
NEWBOOT:    
            XOR  AX,AX
            MOV  SS,AX
            MOV  SP,7C00H
            MOV  SI,SP
            PUSH AX
            POP  ES
            PUSH AX
            POP  DS
            STI
            CLD
            ;MOV  SI,7C00H          ;BOOT sector moved to 600h
            MOV  DI,0600H
            MOV  CX,0200H
            REPZ MOVSB
            DB   0EAH
            DW   OFFSET BEGIN,0
;TEST1:                               1/3
BEGIN:
            MOV AX,0600H
            MOV BH,07H
            MOV CX,0
            MOV DX,184FH
            INT 10H

            MOV AX,1301H         ;display menu
            MOV DX,0200H
            MOV BX,12H
            MOV CX,29
            MOV BP,OFFSET M1
            INT 10H

            MOV BX,070H
            CALL DISPM2
            MOV BX,7
            CALL DISPM3

            MOV AX,1301H
            MOV DX,0700H
            ;MOV BX,7
            MOV CX,35
            MOV BP,OFFSET M4
            INT 10H

            MOV SI,0         ;0:DOS  1:COS
KEY:        MOV AH,10H 
            INT 16H
            CMP AL,0DH
            JE  SELECTED
            CMP AH,48H    ;up
            JE  G48H
            CMP AH,50H
            JNE  KEY

            CMP SI,0        ;50h  down
            JNE KEY
            INC SI
            MOV BX,07H
            CALL DISPM2
            MOV BX,70H
            CALL DISPM3
            JMP KEY
G48H:
            CMP SI,1        ;48h  up
            JNE KEY
            DEC SI
            MOV BX,070H
            CALL DISPM2
            MOV BX,7H
            CALL DISPM3
            JMP KEY
SELECTED:   ;SI=0: DOS =1:COS  look for 80H(DOS) or 90H(COS)
 
            MOV AH,2
            MOV BH,0
            MOV DX,0900H
            INT 10H

            ADD SI,8
            MOV CL,12
            SHL SI,CL
            MOV AX,SI    ;Ah=80H or 90H
            MOV SI,07BEH
            MOV CX,4
FIND:
            CMP [SI],AH
            JZ  IS_ONE
            ADD SI,+10H
            LOOP FIND

            MOV BP,OFFSET ERROR1  ; no 80h or 90h
ERROR0:     
            MOV SI,BP
            XOR CH,CH
            MOV CL,[SI]
            INC BP
            MOV SI,1FFFH      
ERROR11:            
            MOV AX,1301H         
            MOV DX,0800H
            MOV BX,12H
            INT 10H
            DEC SI
            JNZ ERROR11
            INT 18H    ;jmp end_ok ;INT 18H

IS_ONE:   
            MOV DX,[SI]
            MOV DL,80H        ;only driver no=1
            MOV BX,[SI+2]
            MOV BP,SI         ;
NEXT:       ADD SI,+10
            DEC CL
            JZ  READ_DOSBOOT
            CMP BYTE PTR [SI],AH
            JNE NEXT
            MOV BP,OFFSET ERROR1
            JMP ERROR0
READ_DOSBOOT:    ; only one 80h or 90h
            MOV DI,5
READ_DOSBOOT1:
            MOV CX,BX             ; cylinder ???
            MOV BX,7C00H          ;OFFSET PRIBOOT ;7C00H    
            MOV AX,0201H
            PUSH DI
            INT 13H
            JNB READ_DOSBOOT_OK
            XOR AX,AX
            INT 13H
            POP DI
            DEC DI
            JNZ READ_DOSBOOT1
            MOV BP,OFFSET ERROR2
            JMP ERROR0
READ_DOSBOOT_OK:
            MOV BP,OFFSET ERROR1
            MOV SI,7DFEH   ;OFFSET PRIBOOT ;7DFEH     ???
            CMP WORD PTR [SI],0AA55H
            JZ  G_RUN
            MOV BP,OFFSET ERROR1
            JMP ERROR0
G_RUN:      MOV SI,BP

;jmp end_ok                           2/3
            DB 0EAH
            DW 7C00H,0

DISPM2      PROC NEAR        
            MOV AX,1301H
            MOV DX,0403H
            MOV CX,12
            MOV BP,OFFSET M2
            INT 10H
            RET
DISPM2      ENDP
DISPM3      PROC NEAR        
            MOV AX,1301H
            MOV DX,0503H
            MOV CX,12
            MOV BP,OFFSET M3
            INT 10H
            RET
DISPM3      ENDP

M1          DB 'Select the Operating System: '
M2          DB 'MS-DOS      '
M3          DB '3G-COS NUAA '
M4          DB 18H,19H,':move high light bar Enter:select'
ERROR1      DB 17H,'Invalid partition table'
ERROR2      DB 10H,'Error loading OS'  
NEWBOOT_END:

            ORG  0800H
START:      
            CLI
            MOV AX,SEG CODE
            MOV SS,AX
            MOV DS,AX
            MOV ES,AX
            STI
            MOV AX,OFFSET STACK0
            ADD AX,511
            MOV SP,AX

            MOV AX,0600H
            MOV BH,07H
            MOV CX,0
            MOV DX,184FH
            INT 10H

            MOV DX,0200H
            MOV CX,1
            MOV BP,OFFSET M2
            ADD BP,4
            INT 10H

            ;;;;;;;;;;;;;;;;;;;;; read priboot use INT13H 02
            MOV AX,SEG CODE
            MOV DS,AX
            MOV ES,AX
            MOV BX,OFFSET PRIBOOT
            MOV AH,2
            MOV AL,1
            MOV CH,0       ;cylinder
            MOV CL,1       ;sector
            MOV DH,0       ;head
            MOV DL,80H     ;driver: hard disk 1
            INT 13H        ;=bios 13h

            MOV SI,OFFSET PRIBOOT  ;4 tables to 07BE
            ADD SI,01BEH
            MOV DI,07BEH
            MOV CX,66
            REPZ MOVSB

;JMP TEST1                               3/3
JMP END_OK

            ;;;;;;;;;;;;;;;;;;;;; save priboot to C:\TC\G\BOOTTT.MBR
            MOV DX,OFFSET FNAME
            MOV CX,0
            MOV AH,3CH     ;CREAT FILE
            INT 21H
            MOV AL,01H     ;FOR WRITE
            MOV AH,3DH     ;OPEN FILE
            INT 21H
            MOV BX,AX      ;BX=FILE HANDLE
            MOV DX,600H
            MOV CX,512
            MOV AH,40H     ;WRITE FILE
            INT 21H
            MOV AH,3EH     ;CLOSE FILE
            INT 21H
jmp G_RETURN

END_OK:
            ;MOV AX,OFFSET NEWBOOT_END
            ;MOV BX,OFFSET NEWBOOT
            ;SUB AX,BX
            ;MOV CX,0a00H
            ;CALL DISP_EXT_AX_dos


            ;;;;;;;;;;;;;;;;;;;;; SAVE priboot use INT13H 03
            MOV BX,0600H   
            MOV AH,3
            MOV AL,1
            MOV CH,0       ;cylinder
            MOV CL,1       ;sector
            MOV DH,0       ;head
            MOV DL,80H     ;driver: hard disk 1
            INT 13H        ;=bios 13h
            JNZ D_ERROR
            MOV AX,1301H         ;display menu
            MOV DX,0800H
            MOV BX,12H
            MOV CX,24
            MOV BP,OFFSET G_OK
            INT 10H
            JMP G_RETURN
D_ERROR:
            MOV AX,1301H         ;display menu
            MOV DX,0800H
            MOV BX,12H
            MOV CX,21
            MOV BP,OFFSET G_ERROR
            INT 10H

G_RETURN:
            MOV AX,4C00H
            INT 21H

FNAME       DB "C:\TC\G\BOOTTT.MBR",0
G_OK        DB 'Modified priboot success'
G_ERROR     DB 'Modified priboot fail'
STACK0      DB 512 DUP(?)
            ORG 7C00H                 ;1st boot table
PRIBOOT     DB 512 DUP(0)
t_string    DB 100 DUP(0)

DISP2_16_dos    PROC FAR
            ;in al code 2 using ah
            ;out ah:al:code 16
            mov ah,al
            MOV CL,4
            shr ah,CL
            cmp ah,9
            jle disp2_16_1_dos
            add ah,7    
disp2_16_1_dos: add ah,30h
            and al,0fh
            cmp al,9
            jle disp2_16_2_dos
            add al,7
disp2_16_2_dos: add al,30h
            RET
DISP2_16_dos    ENDP

DISP_EXT_AX_dos PROC FAR
            ;in cx:position
            PUSH AX
            PUSH BX
            PUSH CX
            PUSH DX

            MOV BX,AX
            mov al,BH
            CALL DISP2_16_dos
            mov DS:t_string,ah
            mov DS:t_string[1],al
            MOV AL,BL
            CALL DISP2_16_dos
            mov DS:t_string[2],ah
            mov DS:t_string[3],al
            mov DS:t_string[4],' '
            mov DS:t_string[5],'$'
            MOV AH,9
            MOV DX,OFFSET t_string
            ;add dx,16
            INT 21H
            POP DX
            POP CX
            POP BX
            POP AX
            RET
DISP_EXT_AX_dos     ENDP

CODE        ENDS
END START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -