我写了一个开机的boot刷入软驱中,让它引导读取其他扇区的代码再执行,
但总是莫名其妙的死在那里(在虚拟机里做的实验)不往下执行指令.
我用的是int 13h的bios中断服务, 用2号读取到0:200那里, 再跳到那里执行.
但似乎总卡死再读扇区那里,也不返回错误代码,也不往下执行.
boot的读取扇区的前面的显示提示信息的代码执行的没问题...
看代码吧!
- Assembly code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; BIOS下;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 括号是我测试后的结果, 我是在dos下把下面代码写到0软驱0面0磁道1扇区的; 又把待执行代码写到2扇区, 开机floppy先启动;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>bootsg segment org 7c00h_main proc mov ax,cs mov ss,ax lea bp,BufferTop;********************************************************** mov ax,cs ; 显示Msg1 mov es,ax mov bp,offset Msg1 mov bx,000ch mov cx,Msg1Len xor dx,dx mov al,1 mov ah,13h int 10h ; (能显示执行!!);********************************************************** mov ah,1 ; 读取磁盘状态 xor al,al mov dl,1 int 13h jmp disp ; 显示AL的值 (测试过了,00,没问题!);**********************************************************back: mov ax,cs ; 显示Msg1 mov es,ax mov bp,offset Msg1 mov bx,000ch mov cx,Msg1Len mov dx,0200h mov al,1 mov ah,13h int 10h ; (还能执行!!);********************************************************** mov ax,0 mov es,ax ; 读到0:200h mov bx,100h mov al,1 ; 传输的扇区数 mov ch,0 ; 磁道号 mov cl,2 ; 扇区号 mov dx,0 ; 磁头号, 驱动号 mov ah,2 ; 读 int 13h ; (似乎卡死在这里了,下面的代码都没动!!);********************************************************** mov ax,cs ; 显示Msg2 mov es,ax mov bp,offset Msg2 mov dx,0300h mov bx,000ch mov cx,Msg2Len mov ah,13h mov al,1 int 10h;********************************************************** mov ah,10h ; 读任意一个字符 int 16h lea bx,Entry jmp far ptr cs:[bx] ; 开始待执行程序disp: mov bl,al ; 显示al代码 mov ah,0 mov cl,4 shr al,cl call ToASCII call EchoChar push ax ; 向前移动光标 push bx push dx mov ah,3 mov bh,0 int 10h inc dl mov ah,2 int 10h pop dx pop bx pop ax mov al,bl and al,00001111b mov ah,0 call ToASCII call EchoChar jmp back_main endp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 将AL的低4位转换为ASCII字符。例如:0ah -> 41h、41h -> 31h;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ToASCII proc ; 解释: ; 如果al的低4位小于等于9,第一个daa不变,然后 ; 90+40,第二个daa把高4位调整为3 ; 如果al的低4位大于9,第一个daa调整把高4位清0, ; adc在为低位加41 and al,0fh add al,90h daa adc al,40h daa retToASCII endp;**********************************************************; 打印al的ASCII字符;**********************************************************EchoChar proc uses ax bx cx mov ah,0ah mov bx,000ch mov cx,1 int 10h retEchoChar endp;**********************************************************Entry dw 200h, 0;**********************************************************Msg1 db 'Boot have loaded!!',0dh,0ahMsg1Len = $ - Msg1Msg2 db 'Copy OK!',0dh,0ah db 'Starting test !(press any key!)',0dh,0ahMsg2Len = $ - Msg2MsgErr2 db 'Read Error !',0dh,0ahMsgErr2Len = $ - MsgErr2;**********************************************************Buffer dd 50 dup (?)BufferTop label byte dw 0aa55h ; 结尾BootLen = $ - _main ; 小于512bootsg ends