harib00a
本次添加的代码
MOV AX, 0x0820 ;往ax内输入数字0820
MOV ES,AX ;往es输入0820
MOV CH,0 ;柱面0
MOV DH,0 ;磁头0
MOV CL,2 ;扇区2
MOV AH,0x02 ;AH=0x02读盘
MOV AL,1 ;1个扇区
MOV BX,0 ;
MOV DL,0x00 ;A驱动器
INT 0x13 ;调用磁盘BIOS
JC error
jc指令意思是有进位就跳转
harib00b
软盘不可靠,读5次之后还没法读出数据就认为出错
本次添加的代码
;读取磁盘
MOV AX,ox0820
mov es,ax
mov ch,0
mov dh,0
mov cl,2
mov si, 0;记录失败的次数
retry:
mov ah 0x02
mov al ,1
mov bx,0
mov dl,0x00
int 0x13
jnc fin
add si,1
cmp si,5
jae error
mov ah,0x00
mov dl,0x00
int 0x13
jmp retry
jae小于等于跳转,,jnc进位标志为0跳转
harib00c
;都磁盘
mov ax,0x0820
mov es,ax
mov ch,0
mov dh,0
mov cl,2
readloop:
mov si,0
retry:
同上
next:
mov ax,es
add ax,0x0020
mov es,ax
add cl,1
cmp cl,18
jbe readloop
问题:为什么是0820??
7c00+512==8112-------数据段es就是0820*16=8200+dx就是数据段的大小
harib00d
首先还是说说新出现的指令JB。这也是条件跳转指令,是“jump if below”的缩写。翻译过来就是:“如果小于的话,就跳转。”还有一个新指令,就是在程序开头使用的EQU指令。这相当于C语言的#define命令,用来声明常数。“CYLS EQU 10”意思是“CYLS = 10”。EQU是“equal”的缩写。只将它定义成常数是因为以后我们可能修改这个数字。现在我们先随意定义成10个柱面,以后再对它进行调整(CYLS代表cylinders)由于想把操作系统汉化,后面会加入字体大约500kb使得文件超过文章所提的10个柱面把10个柱面改成80个柱面