急:自举加载程序用汇编怎么些

waltzer 2003-09-12 10:42:22
老师出了一道这样的 程序题,题的全文如下:
///////////////////////////////////////////////////
特制自举加载程序
BIOS提供的自举加载程序用于把控制传给DOS。现要求按照标准自举加载程序
的原理,编制自定义的自举加载程序。
要求:(1)、编制自举加载程序
(2)、将自举加载程序的二进制代码移动到格式化磁盘的0面,0磁道
和1扇区。
/////////////////////////////////////////////////////
我查了很多自举程序的资料,有的说自举程序就是主引导扇区里的引导程序;
有的说自举程序是BIOS里的一小段程序,用来寻找主引导扇区然后把控制权交
给主引导扇区里的引导程序。
我越来越糊涂了,不知道自己该编什么,急需大侠的帮助,最好能给我详细解释
一下,过几天就要交了,非常谢谢!!!!!!!!!!!!!!





...全文
20 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackyspy 2003-09-14
  • 打赏
  • 举报
回复
最后一个字节是AA,前面一个才是55
spbabyba 2003-09-14
  • 打赏
  • 举报
回复
自举,是引导区的最后一个字节好像是0055,
加载吗,反汇编引导区.

不过最好的办法是看LINUX引导程序.
jackyspy 2003-09-14
  • 打赏
  • 举报
回复
这是我以前大学的时候为了给win98系统引导加密的一段程序代码,编译后由win2000的引导程序加载执行,就是在boot.ini里面加入生成的二进制代码文件名。程序中要求输入正确的密码,然后在根目录中查询BOOTSECT.DOS文件,即98的原始引导扇区代码,然后加载执行,这样就实现了对98系统引导的加密过程,由于代码只能占用512字节,所以整个加密功能很简单。还有,因为代码以x86模式编译,所以不能识别eax等32位寄存器,相关代码我都由机器码表示,在前面将代码以注释的形式显示出来,如:
;xor ebx,ebx
db 66h,31h,0DBh
;add eax,RootDir ;*****Replace 0FFh,0FFh,width address***
db 66h,03,06
dw offset RootDir
ForTest,ForTest2,ForTest3都是为了测试目的加入,与实际代码无关。
realStart部分是将内存中的几段代码合并到一起形成映像文件,其中假如int 3是为了方便在tr中调试,生成最终引导扇区代码的过程是将上面的代码编译,用tr加载执行,程序运行到int 3自动中断,此时用w命令将7C00处的512(200h)字节写入文件,这就是最终所需要的引导扇区文件。虽然我是用2000的loader加载执行,但是把它写到硬盘引导扇区中执行应该也没有什么问题。
jackyspy 2003-09-14
  • 打赏
  • 举报
回复
.model small, c, os_dos
option casemap :none ; 对大小写敏感

KEYBUFFER=7E00h
STACKBUFFER=7C00h
KEYBUFF_LEN=16-1
ECHOCHAR=0A2Ah
SECTORS_PER_TRACK=63
NUM_HEADS=255

ForTest2 macro
local loop2
MOV AX,0201h
MOV CX,0010h
MOV DX,6080h
MOV BX,7A00h
INT 13h
MOV AX,0B800h
MOV ES,AX
MOV AL,0Ah
XOR DI,DI
MOV CX,0200h
MOV SI,7A00h
loop2:
MOVSB
STOSB
loop loop2
xor ax,ax
int 16h
endm

ForTest macro
local loop1
push es
mov ax,0b800h
mov es,ax
mov al,0Ah
xor di,di
mov cx,200h
mov si,7E00h
loop1:
movsb
stosb
loop loop1
pop es
xor ax,ax
int 16h
endm

ForTest3 macro
local next1,next2
mov bx,ax
mov ax,0B800h
mov es,ax
xor di,di
mov ah,0Ah
mov al,'e'
or bl,bl
jz next1
mov al,'E'
next1:
stosw
mov al,'0'
add al,bh
stosw
mov al,'E'
jc next2
mov al,'e'
next2:
stosw
jmp $
endm

.stack
code segment
assume ds:code
realStart:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov di,CodeToMove
mov si,JumpHere
mov cx,EndOfCode-JumpHere
rep movsb
mov bx,__start
add bx,1FEh
mov word ptr [bx],0AA55h
;must no more than 200h
int 3
;Exit
dw CodeToMove-__start+EndOfCode-JumpHere+2
mov ah,4Ch
int 21h

org 7B00h
JumpHere:
mov si,KEYBUFFER
mov di,__start
mov cx,200h
rep movsb
jmp __start
EndOfCode:
startSector dd 0
RootDir dd 0
SectorsPerCluster db 0
FAT dw 0

org 7C00h
__start:
les di,screen
mov cx,9*2
sub di,cx
lea si,prompt
rep movsb
;Clear Password
ClearPass:
les di,screen
mov cx,KEYBUFF_LEN
xor ax,ax
rep stosw
mov si,KEYBUFFER
xor bx,bx
xor dx,dx
mov cx,KEYBUFF_LEN
inputStr:
xor ax,ax
int 16h
cmp ax,1C0Dh
jz pressEnter
mov [si],al
inc si
add dl,al
les di,screen
add di,bx
mov ax,ECHOCHAR
stosw
inc bx
inc bx
loop inputStr
pressEnter:
mov di,offset passwd -1
mov si,KEYBUFFER-1
xor cx,cx
testPasswd:
inc di
inc si
mov cl,[di]
jcxz RightPasswd
xor cl,dl
inc dx
cmp cl,[si]
jz testPasswd
;error password , continue to enter password
jmp ClearPass
RightPasswd:
;org 7C00h
;__start:
xor ax,ax
mov es,ax ;restore es
;Read MBR
mov ax,201h
mov cx,1
mov dx,80h
mov bx,KEYBUFFER
int 13h
;Read Partion 1
mov ax,201h
mov cx,[bx+1C0h]
mov dh,[bx+1BFh]
mov dl,80h
int 13h
;xor eax,eax
db 66h,31h,0C0h
mov al,dh
;db 88h,0F0h
mov bl,SECTORS_PER_TRACK
;db 0B3h,63
mul bl
;db 0F6h,0E3h
;xor esi,esi
db 66h,31h,0F6h
;xchg eax,esi
db 66h,87h,0C6h
mov al,ch
;db 88h,0E8h
;and ecx,0Fh
db 66h,81h,0E1h,0Fh,0,0,0
;add esi,ecx
db 66h,01,0CEh
mul bl
;db 0F6h,0E3h
mov bl,NUM_HEADS
;db 0B3h,0FFh
mul bx
;db 0F7h,0E3h
;add esi,eax
db 66h,01,0C6h
;shl edx,10h
db 66h,0C1h,0E2h,10h
;add esi,edx
db 66h,01,0D6h
;dec esi
db 66h,4Eh
;mov startSector,esi
db 66h,89h,36h ;*****Replace 0FFh,0FFh,width address***
dw offset startSector
StoreSomeParam:
mov si,KEYBUFFER
mov al,[si+0Dh]
mov SectorsPerCluster,al
;xor eax,eax
db 66h,31h,0C0h
mov ax,[si+24h]
xor bx,bx
mov bl,byte ptr [si+10h]
mul bx
mov bx,[si+0Eh]
mov FAT,bx
add ax,bx
;mov RootDir,eax ;*****Replace 0FFh,0FFh,width address***
db 66h,0A3h
dw offset RootDir
;Search File
;Search for a Cluster
;xor eax,eax
db 66h,31h,0C0h
mov ax,[si+2Ch]
NextCluster:
;push eax
db 66h,50h
;sub eax,2
db 66h,2Dh,02h,0,0,0
;xor ebx,ebx
db 66h,31h,0DBh
mov bl,SectorsPerCluster
;mul ebx
db 66h,0F7h,0E3h
;add eax,RootDir ;*****Replace 0FFh,0FFh,width address***
db 66h,03,06
dw offset RootDir
;Search for a Sector
xor cx,cx
mov cl,SectorsPerCluster
NextSector:
;push eax
db 66h,50h
push cx
;push eax
db 66h,50h
call ReadSect
;Search for a Directory
mov bx,KEYBUFFER
mov dx,10h
SearchDirectory:
mov cx,11
mov si,bx
lea di,filename
repz cmpsb
jcxz IsItFile
jmp NextDirectory
IsItFile:
mov al,[si]
and al,18h
jz found
NextDirectory:
add bx,20h
dec dx
jnz SearchDirectory
pop cx
;pop eax
db 66h,58h
;inc eax
db 66h,40h
dec cx
jnz NextSector
;pop eax
db 66h,58h
;eax*4/512
mov si,ax
and si,7Fh
;shl si,2
db 0C1h,0E6h,02h
push si
;shr eax,7
db 66h,0C1h,0E8h,07h
add ax,FAT
;push eax
db 66h,50h
call ReadSect
pop si
;cmp dword ptr[si+KEYBUFFER],0FFFFFFFh
db 66h,81h,0BCh
dw KEYBUFFER
dd 0FFFFFFFh
jnz NextCluster
jmp $


found:
pop cx
;pop eax
db 66h,58h
;pop eax
db 66h,58h
;Read file bootsect.dos to the memory starting at 0000:7C00
;xor eax,eax
db 66h,31h,0C0h
mov ax,[si+14h-0Bh]
;shl eax,10h
db 66h,0C1h,0E0h,10h
mov ax,[si+1Ah-0Bh]
;sub eax,2
db 66h,2Dh,02h,0,0,0
;xor ebx,ebx
db 66h,31h,0DBh
mov bl,SectorsPerCluster
;mul ebx
db 66h,0F7h,0E3h
;add eax,RootDir ;*****Replace 0FFh,0FFh,width address***
db 66h,03,06
dw offset RootDir
;push eax
db 66h,50h
call ReadSect

;Jmp to the bootsect.dos image
mov si,CodeToMove
mov di,JumpHere
mov cx,EndOfCode-JumpHere
rep movsb
jmp JumpHere

ReadSect:
push bp
mov bp,sp
;mov eax,[bp+4]
db 66h,8Bh,46h,04
;add eax,startSector
db 66h,03,06 ;*****Replace 0FFh,0FFh,width address***
dw offset startSector
;xor edx,edx
db 66h,31h,0D2h
;xor ebx,ebx
db 66h,31h,0DBh
mov bl,SECTORS_PER_TRACK
;div ebx
db 66h,0F7h,0F3h
inc dx
mov cx,dx
xor dx,dx
mov bl,NUM_HEADS
;div ebx
db 66h,0F7h,0F3h
xchg ch,al
;shr ax,2
db 0C1h,0E8h,02h
add cl,al
mov dh,dl
mov dl,80h
mov bx,KEYBUFFER
mov ax,201h
int 13h
pop bp
ret 4
filename db 'BOOTSECTDOS'
prompt db 'P',0Ah,'a',0Ah,'s',0Ah,'s',0Ah,'w',0Ah,'o',0Ah,'r',0Ah,'d',0Ah,':',0Ah
passwd db 0B8h,0AEh,0BCh,0BDh,0B4h,085h,093h,9 dup (0)
screen dd 0B8000000h+2*(12*80+39)

CodeToMove:

code ends
end realStart
aabiao 2003-09-13
  • 打赏
  • 举报
回复
硬盘与软盘不一样,硬盘是主引导区,然后再引导区,软盘是直接引导区。
直接用DEBUG或什么工具把软盘的引导扇区读出来,分析即可
W32API 2003-09-13
  • 打赏
  • 举报
回复
特制自举加载程序
BIOS提供的自举加载程序用于把控制传给DOS。现要求按照标准自举加载程序
的原理,编制自定义的自举加载程序。
要求:(1)、编制自举加载程序
(2)、将自举加载程序的二进制代码移动到格式化磁盘的0面,0磁道
和1扇区

??????????????
你们老师怎么回事哦
BIOS提供的自举加载程序用于把控制传给DOS ?????

MBR 不属于 BIOS 吧。。。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧