如何编译自举程序

TaiJi1985 2005-09-27 08:29:24
到汇编,和linux专区都问了。好长时间也没有人回答。
这里高手如云,相信能得到答案。

想做一个这样的简单的东西:

在软盘的第一扇区中,加入代码,在屏幕上显示一句话,如:“helloworld"


步骤:
用汇编编写代码,使用bios中断,完成功能
编译(这里不会)
拷到软盘第一扇区
设置从软盘启动
开机,测试程序。

现在不会的地方就是,如何编译。 一般的编译器会给你加一些文件头之类的东西。
那样就不能直接运行了,那个必须由操作系统装入。
...全文
198 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
TaiJi1985 2005-10-05
  • 打赏
  • 举报
回复
请问 prettywolf
masm5.0支持保护级别的指令吗?
如lgdt之类的。
WYlslrt 2005-10-01
  • 打赏
  • 举报
回复
nasm可以直接编译成bin文件
例如:
nasmw boot1.asm -f bin -o boot1.bin
TaiJi1985 2005-09-30
  • 打赏
  • 举报
回复
虽然上面两位答非所问,还是要给分的。
我把同样的一个帖子发到了另一个社区,有人回复。问题解决了。
想知道的过去看看。

http://community.csdn.net/Expert/TopicView.asp?id=4292613
TaiJi1985 2005-09-29
  • 打赏
  • 举报
回复
上面两位仁兄,谢谢您的参与。

我问的是: 用什么工具编译 代码,一般编译器得到的可执行文件是依赖与操作系统的。
编写代码不是难点。到处都有。

谢谢!
prettywolf 2005-09-29
  • 打赏
  • 举报
回复
我是用masm5.0,
然后用exe2bin转成com文件,把com文件写进引导扇区就好了。
要注意offset.
引导程序是加载到0:7c00的。
一般程序是默认是0:100的。
prettywolf 2005-09-28
  • 打赏
  • 举报
回复
我以前写的一个一键恢复软件.
就是改写自举程序的.
支持中文显示.
codeseg segment public 'code'
;==============================
org 100h
assume es:codeseg,ss:codeseg
assume cs:codeseg,ds:codeseg,es:codeseg
;=====================================================
main proc near
db 8b00h dup(0)
mov ax,1100h
mov bh,10h
mov bl,0
mov cx,28
mov dx,200
lea bp,mode
int 10h
lea si,myname
show: lodsb
cmp al,0
jz next
mov ah,0eh
mov bx,7
int 10h
jmp show
next:
mov ah,2
int 1ah
mov bh,dh ;以得当前秒数
check: mov ah,2
int 1ah
mov ah,1
int 16h ;检测是否有字符可接收
jz nohit ;没有按
cmp ah,44h ;是否按了F10键
jz restore ;按了,转恢复的操作
nohit: cmp bh,dh ;是否过了一秒
jz check ;没有,继续检测按键和时间
inc byte ptr[tick] ;计数加1
cmp byte ptr[tick],3 ;过了3秒了?
jz normal ;是,3秒内没按键,执行正常操作
mov bh,dh
jmp check
normal: mov ax,0201h ;把备份的正常记录读入并执行
mov bx,7c00h
push bx
mov cx,31h
mov dx,80h
int 13h
ret
restore: ;按下了F10键,执行恢复操作啦.
mov ah,42h
mov dl,80h
lea si,diskaddr
int 13h ;读出最后一个分区的分区表
mov bx,0a1c2h
mov word ptr[bx],0bh
mov ah,43h
mov dl,80h
lea si,diskaddr
int 13h ;把修改后的分区表再写回
add word ptr[diskaddr+8],63 ;找到DOS引导分区
adc word ptr[diskaddr+10],0
adc word ptr[diskaddr+12],0
adc word ptr[diskaddr+14],0
mov byte ptr[diskaddr+5],7ch ;设置读到7C00处
mov ah,42h
mov dl,80h
lea si,diskaddr
int 13h ;读扇区
mov bx,7c00h
push bx
ret ;执行



main endp
;=================================================================================================
myname db 200,201,'F','1','0',202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218
db 219,220,221,222,223,224,225,226,227,0dh,0ah,0
;===============================================
tick db 0
;===============================================
status db 0aah
;===============================================
diskaddr db 10h,0h,1h,0h,00h,0a0h,00h,00h,86h,39h,40h,0h,0h,0h,0h,0h
;==================字符的点阵数据====================================
mode:
db 10H,10H,10H,13H,0faH,14H,10H,3fH,0d0H,10H,11H,10H,10H,10H,50H,23H
db 40H,20H,0H,0feH,2H,44H,40H,0feH,088H,088H,8H,090H,60H,50H,08cH,4H
db 20H,27H,39H,41H,082H,7aH,24H,27H,0f9H,21H,25H,22H,2aH,35H,28H,0H
db 10H,10H,7cH,14H,0feH,14H,7cH,10H,7cH,10H,14H,0feH,10H,10H,096H,7cH
db 1H,0H,1fH,10H,10H,10H,1fH,10H,10H,1fH,18H,28H,28H,48H,08fH,8H
db 0H,084H,0feH,4H,4H,4H,0fcH,0H,4H,0feH,4H,4H,4H,4H,0fcH,4H
db 0H,8H,7cH,0H,5H,0feH,10H,10H,20H,24H,42H,0feH,41H,1H,2H,4H
db 40H,40H,40H,44H,0feH,44H,44H,44H,44H,44H,084H,084H,4H,4H,28H,10H
db 1H,21H,11H,9H,9H,1H,0ffH,4H,4H,4H,4H,8H,8H,10H,20H,40H
db 0H,8H,0cH,10H,20H,4H,0feH,40H,40H,40H,40H,40H,42H,42H,3eH,0H
db 0H,40H,30H,17H,4H,084H,44H,0fH,14H,25H,0e4H,24H,28H,29H,32H,24H
db 40H,40H,40H,0fcH,44H,48H,40H,0f8H,8H,10H,0a0H,40H,0a0H,10H,0eH,4H
db 2H,2H,2H,7fH,42H,42H,7fH,42H,42H,7fH,42H,2H,2H,2H,1H,0H
db 0H,0H,10H,0f8H,10H,10H,0f0H,10H,10H,0f0H,10H,0H,4H,4H,0fcH,0H
db 8H,7cH,48H,4fH,48H,7aH,4bH,4aH,4aH,7aH,4aH,4bH,4aH,4aH,4bH,09aH
db 080H,40H,4H,0feH,0H,14H,14H,0a4H,0a4H,44H,0a4H,1cH,0cH,4H,0fcH,4H
db 0H,0H,0H,3fH,0H,0H,0H,0H,0H,0H,0H,0H,0ffH,0H,0H,0H
db 0H,0H,10H,0f8H,0H,0H,0H,0H,0H,0H,0H,4H,0feH,0H,0H,0H
db 20H,27H,39H,41H,082H,7aH,24H,27H,0f9H,21H,25H,22H,2aH,35H,28H,0H
db 10H,10H,7cH,14H,0feH,14H,7cH,10H,7cH,10H,14H,0feH,10H,10H,096H,7cH
db 10H,10H,10H,17H,58H,55H,51H,091H,12H,12H,12H,14H,14H,18H,10H,13H
db 080H,080H,084H,0feH,080H,20H,20H,24H,0acH,70H,20H,20H,50H,50H,08eH,4H
db 10H,1fH,20H,2fH,48H,08fH,8H,0fH,4H,0fH,0cH,12H,21H,42H,4H,38H
db 8H,0fcH,0H,0f0H,10H,0f0H,10H,0f0H,0H,0f0H,20H,40H,080H,40H,30H,0eH
db 0H,7fH,4H,4H,8H,3fH,1H,2H,4H,3fH,1H,9H,9H,11H,25H,2H
db 38H,0c0H,0H,10H,20H,0c0H,0H,20H,10H,0f8H,8H,20H,10H,8H,8H,0H
db 10H,10H,20H,27H,48H,0f9H,12H,27H,41H,0f9H,41H,1H,1aH,0e2H,44H,8H
db 080H,40H,48H,0fcH,080H,10H,8H,0fcH,24H,20H,20H,20H,22H,22H,1eH,0H
;===================================================================
codeseg ends
end main
  • 打赏
  • 举报
回复
把第一扇区数据读出来,反汇编一下就知道啦!

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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