|
楼主 |
发表于 2017-7-3 22:30:19
|
显示全部楼层
还想追问一下,学完单片机后能解决下面的一个问题没:
- 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,为什么会出现这个问题 |
|