CHAR DEFINE LON 发表于 2023-6-18 14:08

申请会员ID:SuuXaxLZtQDNxLR

1、申请ID:SuuXaxLZtQDNxLR
2、个人邮箱: 610644034@qq.com
3、原创技术文章

由于以前的账号太久没有登陆,现在已经找不回了,想重新注册,希望看到申请的管理员帮个忙。

一、原创技术文章 https://bbs.kanxue.com/thread-212994.htm
二、翻了一下硬盘,就地发个以前自己撸的源码,由于没有上传附件的权限,整个项目包括一个VB修改MBR工具源码没有办法上传,所以就核心源码直接发:

功能: 多分区选择引导启动 MBR
描述: MBR 引导显示 Enter 1 2 3 4 Load Dbr: 的时候输入数字从对应主分区引导启动系统。
asm 文件源码如下:

data segment
data ends
stack segment
stack ends
code segment
    assume cs:code,ds:data,ss:stack
start:
;寄存器环境准备
xorax,ax; 准备寄存器 33 C0
movss,ax; 准备堆栈段寄存器 8E D0
; 33 C0 8E D0 给出MBR特征码提供搜索MBR程序,提取MBR用
sti; 允许中断 FB
;=====================================================================================================================
movsp, 07C00h; 准备堆栈寄存器BC 00 7C
movsi, sp; mbr 准备复制的源地址 8B F4
movdi, 0600h; mbr 准备复制的目的地址 BF 00 06
push ax; 50
movcl , 0; B1 00            正好在 0fh 偏移量位置,方便以后查找和修改 ******************
popes; 准备代码段寄存器 07
push ax; 50
popds; 准备数据段寄存器 1F
cld; rep 指令si di 自加1FC
;起始代码不变
;=====================================================================================================================
;准备寄存器环境
;cl 为 原始MBR的扇区号
;sp 7C00h
;si 7C00h
;di 0600h
;ax 0
;bp 指向 0600h 的分区表
;bx 指向 07C00h 的分区表
;dl 为 BIOS 环境磁盘驱动器 号
;每次 pusha popa 都恢复这个环境
mov   bp ,00600h + 01beh ; bp 指向 00600h 的分区表
mov   bx ,07C00h + 01beh ; bx 指向 07C00h 的分区表
db 1h dup(60h); pusha 寄存器全部保存 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
;------------------------------------------------
;修正 FAT32 引导扇区号 + 6
;mov   bp , bx
;mov   cl , 4
Scan_Set_DPT_Fat32_Boot_Loop:
;        cmp   byte ptr , 0efh; fat32 分区标识
;        jz      Scan_Set_DPT_Fat32_Boot_SetFat32 ;
;        cmp   byte ptr , 0bh; fat32 分区标识
;        jz      Scan_Set_DPT_Fat32_Boot_SetFat32 ;
;        cmp   byte ptr , 0ch; fat32 分区标识
;        jnz   Scan_Set_DPT_Fat32_Boot_Check_byte1 ;
Scan_Set_DPT_Fat32_Boot_SetFat32:
;        add   byte ptr , 6   ; fat32 分区引导扇区在分区第6扇区 + 6
;        add   byte ptr , 6   ; fat32 分区引导扇区在分区第6扇区 + 6
;        adc   byte ptr , 0 ; fat32 分区引导扇区在分区第6扇区
Scan_Set_DPT_Fat32_Boot_Check_byte1:
;        add   bp, 10h
;loop    Scan_Set_DPT_Fat32_Boot_Loop;
;------------------------------------------------
;拷贝MBR 从 07C00h 到 0600h
movcx,200h;复制的字节数
rep movsb; 复制 mbr 拷贝 ds:si 到 es:di上,长度为cx
;也就是将MBR从07C00h处拷贝到 0600h,长度为200h 即512字节
;------------------------------------------------
;跳转到 0600h 的 Check_F_Mbr: 执行
db 6Ah,00h   ; push word 00h
movsi , offset Check_F_Mbr - offset start + 00600h
push si
retf; 跳转到 0600h 的 Check_F_Mbr:执行
;=====================================================================================================================
Check_F_Mbr: ;检查没有 原始MBR
db 1h dup(61h); popa寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 1h dup(60h); pusha 寄存器全部保存 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
cmp cl , 0; cl 原始MBR 的扇区号
jne Load_Boot_Mbr; 有 原始MBR
;------------------------------------------------
Look_Boot_Dbr: ;寻找活动分区启动
movcx , 4 ;
Look_Boot_Dbr_Loop:
        cmp byte ptr , 0; 判断分区活动状态
        jlLook_Boot_Dbr_Read_Dbr;
        add bp , 010h;
Loop Look_Boot_Dbr_Loop
;-----------------------------------------------
Error_Boot:
        hlt ;处理器暂停
jmp Error_Boot ;
;-----------------------------------------------
Look_Boot_Dbr_Read_Dbr:
call Read_Disk_Proc ;
jb   Error_Boot ;读扇区失败
cmp word ptr[ si + 510 ] , 0aa55h
jneError_Boot ;读扇区没有55aa标志
db 1h dup(61h) ; popa寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 6Ah,00h   ; push word 00h
push si;
retf;
;-----------------------------------------------
Load_Boot_Mbr:   ;加载原始mbr
xor ch , ch;
mov word ptr , 00080h;
mov    , cx;
mov , ax;
inc cl
mov , cx;
call Read_Disk_Proc;读原始MBR扇区
jbError_Boot;
db 1h dup(61h); popa寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 1h dup(60h); pusha 寄存器全部保存 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
cmp word ptr[ si + 510 ] , 0aa55h
jneError_Boot ;读扇区没有55aa标志
movbp , bx
movcx , 4 ;
Cel_DPT_Boot:
        movbyte ptr , 0; 取消所有分区活动状态
        addbp , 010h
Loop Cel_DPT_Boot
Boot_Loop:
;-----------------------------------------------
mov si , offset init_msg - offset start + 0600h;
mov cx , 019h;
Show_Char_A: ;循环显示一个字符
        lodsb;
        mov bx, 7;
        mov ah, 0Eh;
        int 10h;
loop Show_Char_A;
;-----------------------------------------------
xor ax,ax;
int 16h;捕捉键盘输入
cmp al,'1';
jeBoot_Tab ;键盘输入 1 跳到0分区表项引导
cmp al,'2';
jeBoot_Tab ;键盘输入 2 跳到1分区表项引导
cmp al,'3';
je Boot_Tab ;键盘输入 3 跳到2分区表项引导
cmp al,'4';
jne Boot_Loop; 键盘输入 4 跳到3分区表项引导 否则重新提示输入
;-----------------------------------------------
;捕捉到键盘输入(1/2/3/4键)后定位对应的分区表位置
Boot_Tab:
push ax;
movbx, 7 ; 显示键盘输入
movah, 0Eh
int10h;
popcx ; cl 获取键盘输入码
subcl , '1';
moval , 10h;
mulcl ; ax 为 选中分区表项的 分区表偏移量
movbp , ax;
addbp , 7C00h + 01beh;
movbyte ptr , 080h; 设置选中分区活动状态
db 1h dup(61h); popa寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 6Ah,00h   ; push word 00h
db 68h,00h,7Ch ; push word 7C00h
retf;
; ---------------------------------------------------------------------------
;参数 bp 指向 分区表项 DPT , 返回 jnb 到读取成功处理
Read_Disk_Proc:
; ---------------------------------------------------------------------------
mov   byte ptr , 5
mov    , dl
Read_Disk_Mode_Sel: ;选择扇区读寻址方式
        db 1h dup(60h); pusha 寄存器全部保存
    call Disk_Read_Sel_Mode
    db 1h dup(61h); popa 寄存器全部恢复
    db 1h dup(60h); pusha 寄存器全部保存
    jb Disk_Read_SHS
Read_Disk_LBA: ;LBA 方式区读寻址方式
        db 6Ah,00h   ; push word 00h
        db 6Ah,00h   ; push word 00h
        push    word ptr
        push    word ptr
        db 6Ah,00h   ; push word 00h
        db 68h,00h,7Ch ; push word 7C00h保存数据地址
        db 6Ah,01h   ; push word 01h    读多少扇区
        db 6Ah,10h   ; push word 010h
        mov   ah, 42h ;
        mov   dl,
        mov   si, sp
        int   13h
        lahf
        add   sp, 10h
jmp   Disk_Read_Check_Exit
; ---------------------------------------------------------------------------
Disk_Read_SHS: ;SHS 方式区读寻址方式
        mov   ax, 201h   ; al 读多少扇区
        mov   bx, 7C00h    ; 保存数据地址
        mov   dl,
        mov   dh,
        mov   cl,
        mov   ch,
        int   13h            
        lahf
Disk_Read_Check_Exit:
        call Disk_Read_Reset;
        db 1h dup(61h); popa 寄存器全部恢复
        sahf
        jnb   Disk_Read_On
        dec   byte ptr
        jnz   Disk_Read_Check_Exit_Error
        cmp   byte ptr , 80h
        jz      Disk_Read_Check_Exit_Error
        mov   byte ptr , 80h
jmp   Read_Disk_Mode_Sel
; ---------------------------------------------------------------------------
Disk_Read_Check_Exit_Error:
stc;
Disk_Read_On:
retn;
; ---------------------------------------------------------------------------
Disk_Read_Sel_Mode: ;获取磁盘寻址模式
        push    bp
        mov   dl,
        mov   ah, 8
        int   13h            
        pop   bp
        jb      Disk_Read_Sel_Mode_SHS
        mov   dl,
        mov   bx, 55AAh
        mov   ah, 41h
        int   13h         
        jb      Disk_Read_Sel_Mode_SHS
        cmp   bx, 0AA55h
        jnz   Disk_Read_Sel_Mode_SHS
        test    cl, 1
        jnz   Disk_Read_Sel_Mode_LBA
Disk_Read_Sel_Mode_SHS:
        stc;
retn;jnb LBA模式
Disk_Read_Sel_Mode_LBA:
    clc;
retn;jnb LBA模式
; ---------------------------------------------------------------------------
Disk_Read_Reset: ; 磁盘复位
        xor   ah, ah
        mov   dl,
        int   13h
retn;
; ---------------------------------------------------------------------------
init_msgdb 0dh,0ah,'Enter 1 2 3 4 Load Dbr:'
;Error_msg db 'Error Dbr',0dh,0ah,0h
;boot_msgdb 0dh,0ah,'boot Look Dbr X'
db 200H dup(0);全0标志
code ends
end start

以上asm文件编译链接出来的MBR为:

33 C0 8E D0 FB BC 00 7C 8B F4 BF 00 06 50 B1 00 <- 该值指定原始MBR的扇区号,0为无原始MBR或者不进行原始MBR引导,非0则会加载对应扇区继续引导启动,可根据需要修改
07 50 1F FC BD BE 07 BB BE 7D 60 B9 00 02 F3 A4
6A 00 BE 27 06 56 CB 61 60 80 F9 00 75 23 B9 04
00 80 7E 00 00 7C 08 83 C5 10 E2 F5 F4 EB FD E8
83 00 72 F8 81 BC FE 01 55 AA 75 F0 61 6A 00 56
CB 32 ED C7 46 00 80 00 89 4E 08 89 46 0A FE C1
89 4E 02 E8 5F 00 72 D4 61 60 81 BC FE 01 55 AA
75 CA 8B EB B9 04 00 C6 46 00 00 83 C5 10 E2 F7
BE 53 07 B9 19 00 AC BB 07 00 B4 0E CD 10 E2 F6
33 C0 CD 16 3C 31 74 0C 3C 32 74 08 3C 33 74 04
3C 34 75 DC 50 BB 07 00 B4 0E CD 10 59 80 E9 31
B0 10 F6 E1 8B E8 81 C5 BE 7D C6 46 00 80 61 6A
00 68 00 7C CB C6 46 11 05 88 56 00 60 E8 55 00
61 60 72 22 6A 00 6A 00 FF 76 0A FF 76 08 6A 00
68 00 7C 6A 01 6A 10 B4 42 8A 56 00 8B F4 CD 13
9F 83 C4 10 EB 15 B8 01 02 BB 00 7C 8A 56 00 8A
76 01 8A 4E 02 8A 6E 03 CD 13 9F E8 3D 00 61 9E
73 12 FE 4E 11 75 0C 80 7E 00 80 74 06 C6 46 00
80 EB A9 F9 C3 55 8A 56 00 B4 08 CD 13 5D 72 17
8A 56 00 BB AA 55 B4 41 CD 13 72 0B 81 FB 55 AA
75 05 F6 C1 01 75 02 F9 C3 F8 C3 32 E4 8A 56 00
CD 13 C3 0D 0A 45 6E 74 65 72 20 31 20 32 20 33
20 34 20 4C 6F 61 64 20 44 62 72 3A 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Hmily 发表于 2023-6-26 11:21

你好,请尝试邮箱重置密码找回,如果无法找回我们再走申请方式,需要在看雪论坛给hmilywen发一条短消息,确认这个申请是本人发布的,然后回复我进行审核。
页: [1]
查看完整版本: 申请会员ID:SuuXaxLZtQDNxLR