汇编编写 可以自启动的磁盘

原创 2002年11月15日 14:02:00

下面贴出了两段代码boot.asm 和shell.asm,实现磁盘启动,并且解析了两个命令 time 和 reboot,有兴趣的朋友可以看看。

由于本人的汇编知识很菜,这篇文章只是让大家看看磁盘启动是如何实现的,如果有错误的地方,大家能够指出那就太谢谢了

步骤:放入一张磁盘,把这两段代码编译成EXE,分别执行一次,重启计算机,如果有虚拟系统环境的软件更好,如virtual PC,直接就可以看到效果。



以下是boot.asm

;启动代码
;-----------------------------------------------------

code_seg segment para 'code'
main proc far
 assume cs:code_seg,ds:code_seg
 org 00h
start:
 push ds
 sub ax,ax
 push ax
 mov ax,code_seg
 mov ds,ax
 mov es,ax

 mov ax,0301h   ;写1扇区
 mov cx,0001h
 mov bx,7c00h   ;从代码7c00h开始
 mov dx,0
 int 13h

 mov ax,0301h   ;写2扇区,数据
 mov cx,0002h
 mov bx,7e00h   ;从代码7e00h开始
 mov dx,0
 int 13h
 
 ret
 org 7c00h   ;MBR开始
        mov ax,0
        mov es,ax
 
 mov ax,201h   
 mov bx,7e00h   ;把2扇区读入7e00h
 mov cx,2   ;第二扇区
 mov dx,0
 int 13h

 mov ah,6h   ;清屏
 mov al,26
 mov bh,07h
 mov cx,0
 mov dh,26
 mov dl,80
 int 10h 

 mov ax,1301h   ;显示文字
 mov bx,04eh
 mov cx,18
 mov dx,0
 lea bp,hello   ;7e00h存放着字符串
 int 10h

 mov ah,3h   ;换行
 mov bh,0
 int 10h
 inc dh
 mov dl,0
 mov ah,2h
 mov bh,0
 int 10h
 
 jmp init   ;跳转到初始化代码
 
 org 7dfeh
 db 55h,0aah
 
 org 7e00h   ;数据扇区
 hello db 'Loading System....'
      
 org 7f00h   ;初始化区

init: 
 mov ax,0
 mov es,ax
 mov ds,ax

 mov ax,201h   ;5扇区读入8000h,把命令解释器载入内存
 mov bx,8000h
 mov cx,5
 mov dx,0
 int 13h 

 mov ax,201h   ;7扇区读入8400h,把命令处理程序
 mov bx,8400h
 mov cx,7
 mov dx,0
 int 13h 

 jmp command   ;跳到命令解释器
 org 7ffeh
 db 55h,0aah
command: org 8000h
 
main endp
code_seg ends
 end start


以下是shell.asm


;命令解析器
;-------------------------------------------------------------
code_seg segment para 'code'
main proc far
 assume cs:code_seg,ds:code_seg
start: 
 push ds
 sub ax,ax
 push ax
 mov ax,code_seg
 mov ds,ax
 mov es,ax

 mov ax,0301h   ;写5扇区
 mov cx,0005h
 mov bx,8000h   ;从代码8000h开始
 mov dx,0
 int 13h

 mov ax,0301h   ;写7扇区数据
 mov cx,0007h
 mov bx,8400h   ;从代码8400h开始
 mov dx,0
 int 13h
 ret


 org 8000h

kaishi: call printtsf
 
 lea di,command   ;命令输入开始
 mov dx,0
 push dx
 
begin: mov ah,0h
 int 16h

 cmp al,0dh   ;等于回车
 je  finish 

 cmp al,08
 jne  sast
 call backgb
 jmp begin
 
sast: pop dx
 cmp dx,13   ;命令最大14字符
 ja tolong
 inc dx
 push dx
 
 stosb  ;存储单个字符
 
 mov ah,9h ;打印单个字符
 mov bh,0
 mov bl,07h
 mov cx,1
 int 10h
 
 call tuigb ;光标移动
 
jump1: jmp begin
tolong: push dx  ;发出警告声音
 mov dx,100
 in al,61h
 and al,11111100b
sound: xor al,2
 out 61h,al
 mov cx,140h
wait1:  loop wait1
 dec dx
 jne sound
 jmp begin
finish: pop dx
 cmp dx,0
 je nos
 call scroll
nos: call check_com
 jmp kaishi

main endp
;------------------------------------------------------------
 command db 14 dup(' ')   ;6扇区开始
 messrb   db 'System will reboot now!'
 messnf  db 'Input command isnot exit!'
 tsf db '$'
 comlist db 'reboot        ',00h,84h
  db 'time          ',00h,85h
;------------------------------------------------------------
check_com proc near
 lea bx,comlist  ;便于定位每个命令的首地址
 lea di,comlist  ;命令表首地址
 mov dx,2  ;指令的个数
cmpcom: lea si,command  ;存储输入命令地址
 cld
 mov cx,14
 repz cmpsb
 jz match
 add bx,16
 mov di,bx
 dec dx
 jnz cmpcom
 
 call getgb
 mov ax,1301h  ;显示文字mess2 NO
 mov bx,07h
 mov cx,25
 lea bp,messnf  ;no found地址
 int 10h
 call scroll

 lea di,command  ;清空command
 mov cx,0014
 cld
 mov ax,20h
 rep stosb
 ret
match: add bx,14
 call [bx]  ;定位命令处理地址
 
 lea di,command  ;清空command
 mov cx,0014
 cld
 mov ax,20h
 rep stosb
 ret
check_com endp
;-------------------------------------------------------------
scroll proc near
 call getgb
 cmp dh,23  ;是否到达23行
 jbe scrend  ;判断是否到达屏底
 mov dl,0  ;到达屏底,到第1列
 call setgb

 mov ah,6  ;滚1行
 mov al,1
 mov bh,07
 mov cx,0
 mov dh,26
 mov dl,80
 int 10h
 ret
scrend: call getgb
 inc dh
 mov dl,0
 call setgb
 ret
scroll endp
tuigb proc near
 call getgb
 inc dl
 call setgb
 ret
tuigb endp
;--------------------------------------------------------------
printtsf proc near
 mov ah,9h ;打印单个字符$
 mov al,tsf
 mov bh,0
 mov bl,07h
 mov cx,1
 int 10h
 call tuigb
 ret
printtsf endp
backgb proc near
 call getgb
 dec dl
 call setgb
 ret
backgb endp
getgb proc near
 mov ah,3h
 mov bh,0
 int 10h
 ret
getgb endp
setgb proc near
 mov ah,2h
 mov bh,0
 int 10h
 ret
setgb endp
 org 83feh
 db 55h,0aah

 org 8400h
reboot proc near
 call getgb
 mov ax,1301h  ;显示文字重启信息
 mov bx,07h
 mov cx,23
 lea bp,messrb  ;reboot字符地址
 int 10h
 call scroll
 
 mov bl,0Feh  ;重启命令,利用键盘控制器
 xor cx,cx
cmd_wait:
 in al,64h
 test al,2
 jz cmd_send
 loop cmd_wait
 jmp cmd_error
cmd_send:
 mov al,bl
 out 64h,al
 xor cx,cx
cmd_accept:
 in al,64h
 test al,2
 jz cmd_ok
 loop cmd_accept
cmd_error:
 mov ah,1
 jmp cmd_exit
cmd_ok:
 xor ah,ah
cmd_exit:
 ret
reboot endp

 org 8500h
time proc near
 mov ah,4h
 int 1ah
 
 push cx

 lea di,nowtime
 mov al,ch  
 call bcd2asc
 pop cx
 mov al,cl
 call bcd2asc
 inc di
 mov al,dh
 call bcd2asc
 inc di
 mov al,dl
 call bcd2asc
 
 mov ah,2h
 int 1ah
 
 push cx
 
 inc di
 mov al,ch
 call bcd2asc
 inc di
 pop cx
 mov al,cl
 call bcd2asc
 inc di
 mov al,dh
 call bcd2asc

 call getgb
 mov ax,1301h
 mov bx,07h
 mov cx,19
 lea bp,nowtime  ;时间地址
 int 10h
 call scroll

 ret
 nowtime db 4 dup(?)
  db '/'
  db 2 dup(?)
  db '/'
  db 2 dup(?)
  db ' '
  db '  ',':','  ',':','  '
time endp

bcd2asc proc near
 mov bl,al  
 mov cl,4
 shr al,cl
 or al,30h
 mov [di],al
 inc di
 mov al,bl
 and al,0fh
 or al,30h
 mov [di],al
 inc di
 ret
bcd2asc endp
 org 85feh
 db 55h,0aah
code_seg ends
;-------------------------------------------------------
 end start


完,Thx

如何使用x86汇编对硬盘进行读写

阅读李忠的《x86汇编语言》看到的一段代码,写入博客,算是个人的笔记吧。...
  • fjlq1994
  • fjlq1994
  • 2015年10月28日 18:23
  • 1249

Linux下实现编写汇编程序

本学期的微机原理课程上机使用的是MASM汇编器,上课时使用的是Windows上的DOS,而Linux中的汇编工具是nasm. (具体的可以点击链接:http://os.51cto.com/art/20...
  • u013166575
  • u013166575
  • 2015年10月25日 09:10
  • 1974

使用汇编语言编写一条简单的贪吃蛇

本文中的汇编语言是基于x86
  • u012220268
  • u012220268
  • 2014年07月06日 12:49
  • 1276

利用纯汇编写一个WIN32的窗口程序

;ml /coff demo.asm /link /subsystem:windows /entry:main user32.lib kernel32.lib .486 .model flat,s...
  • cosmoslife
  • cosmoslife
  • 2016年07月08日 17:17
  • 815

修复被“磁盘自动运行”类病毒感染的电脑

由于最近接手的机器都是由于感染“磁盘自动运行”类病毒而送修的,所以在这里将对此类问题提供一个相对完善的解决方案。 一、“磁盘自动运行”类病毒 所谓“磁盘自动运行”类病毒指的是在感染初始阶段在每个磁...
  • cmzsteven
  • cmzsteven
  • 2015年10月11日 16:57
  • 1143

用VS2008编写汇编程序

在VS2008中编写汇编语言程序,整个步骤与写C++程序类似。查目录,汇编程序ml.exe和连接程序link都在VC的bin中,这也就不见怪了。   具体的步骤是:   1、新建简单的VC控制台应...
  • sxhelijian
  • sxhelijian
  • 2017年04月23日 22:07
  • 1095

在Linux环境下(Ubuntu)编写MASM汇编程序

转载自:http://blog.renren.com/share/333499439/14661346767 作者:丁枣枣 名词解释: MASM: MASM是微软公司开...
  • tenlee
  • tenlee
  • 2015年09月24日 15:44
  • 3292

VS2017编写汇编并调用c库函数(msvcrt.lib)

前言 本文参考http://blog.csdn.net/sinat_27382047/article/details/70339455以及峰神的网站~~~~~~膜一发​ 本文提供了在Visual S...
  • maguanzhan7939
  • maguanzhan7939
  • 2017年11月22日 21:46
  • 608

汇编语言实验:编写0号中断处理程序

汇编语言实验:编写0号中断处理程序任务:编写0号中断处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回操作系统。下面写给出效果,再给出实现代码,最后给出设计思...
  • wyf12138
  • wyf12138
  • 2016年12月20日 23:41
  • 779

Windows下编写汇编代码

NASM ALINK 汇编代码
  • chengyu779394084
  • chengyu779394084
  • 2015年12月16日 11:55
  • 671
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:汇编编写 可以自启动的磁盘
举报原因:
原因补充:

(最多只允许输入30个字)