还想追问一下,学完单片机后能解决下面的一个问题没:org 07c00h ;
mov ax,cs ;显示问候
mov es,ax
mov ax,BootMessage
mov bp,ax
mov cx,6
mov dx,0
call showgreen
mov ax,8000h
mov ss,ax
mov sp,0ffffh
mov ch,00000000b ;设置光标形状
mov cl,00010000b
mov ah,01h ;中断入口
int 10h
call loadf
jmp $
loadf: ;读取软盘1至7e00 可软盘内容是复制到了7e0a 前10个位置留空了,为什么?
push es
mov ax,07e0h
mov es,ax
mov bp,0h
mov ah,2 ;int13 入口参数
mov al,18 ;读取两个扇区
mov cx,0001h ;从第一扇区开始
mov dx,0001h ;1号驱动器(0~80为软驱
int 13h
pop es
ret
showgreen: ;以绿色显示指定位置的字符串,需要设置es,bp,cx,dx
mov ax,01301h
mov bx,00001010b
int 10h
ret
BootMessage: db "Hello!" ; 6byte
times 510-($-$) db 0
dw 0xaa55
思路:
1 电脑启动后,会进入实模式,从0000:0000处创建中断向量表;
2 BIOS中断程序被加载到了内存中;
3 CPU跳至0000:7c00处执行引导程序。
因此,我用汇编写好引导程序,加入写软盘功能,将0000:0000~FFFF:FFFF的内存全部写入到软盘,然后利用反汇编工具对其反汇编以得到BIOS中断程序的汇编代码。
行动步骤:
1 用虚拟机(VirtualBox)创建一台电脑;
2 虚拟两个软驱;
3 在linux下利用nasm编译引导程序(boot),生成.bin文件,然后使用linux的dd命令(如dd if=boot.bin of=boot.img)将其虚拟成软盘镜像。
4 继续使用dd命令创建一个空白软盘镜像(dd if=/dev/zero of=blank.img bs=1474560 count=1)。bs的作用是限制大小,1474560=1.44m软盘(不知道对不对)
5 分别将两个镜像装进软驱,从0号软盘启动虚拟电脑。出现问候后按回车执行写软盘程序。
6 将0000:0000~FFFF:FFFF的内存全部写入到1号软盘。
问题是:
读软盘的程序有问题,本想把软盘内容读到0000:7e00处,可直接将es=0000h,bx=7e00h的话程序会卡死,将es=07e0h,bp=0的话可以读,但是读到的内存位置变成了07e0:000a,为什么会出现这个问题 |