哪位大虾开发过系统引导程序

billxiaohe 2003-09-11 09:58:12
不知哪位大虾用汇编开发过系统引导程序,请多多指教。小弟100分相送。
...全文
26 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
billxiaohe 2003-09-19
  • 打赏
  • 举报
回复
jackyspy(jackyspy):
不好意思,boot.ini找到了。加入c:\test.sec="This is a test",是加入到boot.ini文件的末尾吗?
billxiaohe 2003-09-19
  • 打赏
  • 举报
回复
jackyspy(jackyspy):
谢谢你! 你的代码我认真看了(虽然还有点不懂,但也看得差不多了),你的方法是要改boot.ini,我的机子里怎么查不到这个文件(boot.ini),98和2000我都查了。
reludson 2003-09-19
  • 打赏
  • 举报
回复
up
reludson 2003-09-19
  • 打赏
  • 举报
回复
up
jackyspy 2003-09-19
  • 打赏
  • 举报
回复
无语,就这简单的代码我用得着抄别人的?!什么眼看人低!!!
jackyspy 2003-09-19
  • 打赏
  • 举报
回复
楼上的兄弟如此怀疑我的能力,我也不想多说。老实说,最开始的程序还不是用masm编译的,是在TR中a命令直接写的,后来觉得地址改动起来太麻烦,才整理成asm源文件,当然注释就没有去写了,自己看得懂就行。如果你需要看注释的话,就请看http://bbs.wuyou.com/cgi-bin/topic.cgi?forum=2&topic=11413&show=25
aprilsnow 2003-09-19
  • 打赏
  • 举报
回复
谁的代码呀? 连个注释也没有, 肯定是抄的, 不是自己写的.
jackyspy 2003-09-18
  • 打赏
  • 举报
回复
把程序整理了一下,下面是test.asm源代码。用MASM6编译,ml /AT /Fetest.sec test.asm
将test.asm拷到C盘根目录下,在boot.ini加入c:\test.sec="This is a test",启动时选择该项,要求输入密码,这里为bootsector,密码输入正确后即调用BOOTSECT.DOS进入98系统,前提是装了2000,并且c盘为98系统,如果不同则进行相应修改。另外单独做了一个生成密码的工具,将生成的结果修改汇编代码中密码数据,源代码genpass.c如下:
#include <stdio.h>

void main()
{
char szPassword[16];
char c;
int i, sum, length;

for(i = 0, sum = 0; (c = getchar()) != '\n' && i < 16; i++)
szPassword[i] = c, sum += c;
szPassword[i] = 0;
length = i;
sum &= 0xFF;
for(i = 0; i < length; i++)
{
printf("%0Xh, ", szPassword[i] ^ sum);
sum = (sum + 1) & 0xFF;
}
}


.386
option casemap :none ; 对大小写敏感

BUFFER=7C00h
KEYBUFF_LEN=16-1
ECHOCHAR=0A2Ah
SECTORS_PER_TRACK=63
NUM_HEADS=255

code segment use16
assume ds:code

org 7A00h
__start:
mov si, 7C00h
mov di, __start
mov cx, 200h
rep movsb ;move code to 0000:7A00
push cs
push showPrompt
retf
showPrompt:
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,BUFFER
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,BUFFER-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:
xor ax,ax
mov es,ax ;restore es
;Read MBR
mov ax,201h
mov cx,1
mov dx,80h
mov bx,BUFFER
int 13h
;Read Partion 1
mov ax,201h
mov cx,[bx+1C0h]
mov dh,[bx+1BFh]
mov dl,80h
int 13h
xor eax,eax
mov al,dh
mov bl,SECTORS_PER_TRACK
mul bl
xor esi,esi
xchg eax,esi
mov al,ch
and ecx,0Fh
add esi,ecx
mul bl
mov bl,NUM_HEADS
mul bx
add esi,eax
shl edx,10h
add esi,edx
dec esi
mov startSector,esi
StoreSomeParam:
mov si,BUFFER
mov al,[si+0Dh]
mov SectorsPerCluster,al
xor eax,eax
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
;Search File
;Search for a Cluster
xor eax,eax
mov ax,[si+2Ch]
NextCluster:
push eax
sub eax,2
xor ebx,ebx
mov bl,SectorsPerCluster
mul ebx
add eax,RootDir
;Search for a Sector
xor cx,cx
mov cl,SectorsPerCluster
NextSector:
push eax
push cx
push eax
call ReadSect
;Search for a Directory
mov bx,BUFFER
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
inc eax
dec cx
jnz NextSector
pop eax
;eax*4/512
mov si,ax
and si,7Fh
shl si,2
push si
shr eax,7
add ax,FAT
push eax
call ReadSect
pop si
cmp dword ptr[si+BUFFER],0FFFFFFFh
jnz NextCluster
jmp $ ;Halt

ReadSect proc
push bp
mov bp,sp
mov eax,[bp+4]
add eax,startSector
xor edx,edx
xor ebx,ebx
mov bl,SECTORS_PER_TRACK
div ebx
inc dx
mov cx,dx
xor dx,dx
mov bl,NUM_HEADS
div ebx
xchg ch,al
shr ax,2
add cl,al
mov dh,dl
mov dl,80h
mov bx,BUFFER
mov ax,201h
int 13h
pop bp
ret 4
ReadSect endp

found:
pop cx
pop eax
pop eax
;Read file bootsect.dos to the memory starting at 0000:7C00
xor eax,eax
mov ax,[si+14h-0Bh]
shl eax,10h
mov ax,[si+1Ah-0Bh]
sub eax,2
xor ebx,ebx
mov bl,SectorsPerCluster
mul ebx
add eax,RootDir
push eax
call ReadSect

;Jmp to the bootsect.dos image
jmp RealStart

filename db 'BOOTSECTDOS'
prompt db 'P',0Ah,'a',0Ah,'s',0Ah,'s',0Ah,'w',0Ah,'o',0Ah,'r',0Ah,'d',0Ah,':',0Ah
passwd db 26h, 2Ah, 29h, 33h, 3Bh, 2Ch, 29h, 3Fh, 23h, 3Fh, 6 dup (0) ;'bootsector'
screen dd 0B8000000h+2*(12*80+39)
startSector dd ?
RootDir dd ?
SectorsPerCluster db ?
FAT dw ?
org __start + 1FEh
db 55h, 0AAh
RealStart:
code ends
end __start
jackyspy 2003-09-18
  • 打赏
  • 举报
回复
楼主,不好意思,我这里不知道为什么不能给你发短信息,总是错误,只好发到这里来了
1. 这个无关紧要,不影响程序编译,只是编程的个人习惯而已。
2. 这个文件在c盘根目录下面是有的,为隐藏的系统文件,万一没有也没关系,可 以从c盘的引导扇区中提取前512字节保存为BOOTSECT.DOS。可以用WinHex等工具,当然debug也可以读取的。
3. 程序可以运行,在boot.ini文件中加入c:\test.sec="This is a test",test.sec是生成的引导文件。系统启动时选择"This is a test"菜单。
程序我做了一些修改,便于编译和理解。如果需要请告诉我你的email,我可以发给你,因为太大,不能这样传给你。
----------------------------------------------------------------
原贴内容:
jackyspy:
我看了你9月14的关于引导程序的一个程序有些不解,有几个问题想请教你一下。
1.‘option casemap :none ; 对大小写敏感’在编译的时候总是报错。不过好象对程序影响不大。
2. 我看到你提到的文件BOOTSECT.DOS,我的机器内找不到(我用的是win200),
这个文件是不是要另外编一个程序从主引导扇区读取。
3. 你这个程序能不能运行,好象我调试后运行没看到效果。
我现在才刚刚涉及引导编程,请多多赐教。
jackyspy 2003-09-15
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2254/2254529.xml?temp=.1711084
limd 2003-09-11
  • 打赏
  • 举报
回复
网上有,去找找吧
紫郢剑侠 2003-09-11
  • 打赏
  • 举报
回复
以前有几位兄弟贴过有关的代码, 找找看.
W32API 2003-09-11
  • 打赏
  • 举报
回复

http://expert.csdn.net/Expert/topic/2170/2170060.xml?temp=.5169336
问 POLOM (北岸WUS) 看看
aprilsnow 2003-09-11
  • 打赏
  • 举报
回复
写过一个.
WhoIsBill 2003-09-11
  • 打赏
  • 举报
回复
学习学习MBR:)
spbabyba 2003-09-11
  • 打赏
  • 举报
回复
LINUX有源码

21,459

社区成员

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

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