第七课 突破512字节限制--中

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第七课 突破512字节限制--中相关的知识,希望对你有一定的参考价值。

  上一节我们写了字符串打印的函数和软盘读取函数,在软盘读取函数中,我们是直接给定了要读的逻辑扇区号,这一节我们来实现一个查找文件的功能,也就是根据给定的文件名,在根目录区中查找指定的文件是否存在,涉及到文件名的查找,就会涉及到内存的比较,因此,我们需要实现两个函数,分别为内存比较函数和根目录区查找函数。

  整体的流程如下:

技术分享图片

 

  首先将根目录区加载到内存中的指定位置上,这里面包含了一定数目的根目录项,而根目录项的前11个字节为文件名,因此,查找文件的工作就可以进行了,我们只需要将目标文件名和每一个根目录项的前11个字节进行比较即可,如果文件存在,必定会在某一个目录项中找到,只需将目录项的偏移位置通过寄存器返回即可。

  内存比较的示意图如下:

技术分享图片

 

  需要用到的两个指令如下:

  比较指令:cmp cx, 0    ;  比较cx的值是否为零

  跳转:jz equal  ; 如果比较的结果为真,则跳转到equal处

  用于比较的汇编程序片段如下:

技术分享图片

 

  

  1 org 0x7c00
  2 
  3 jmp short start
  4 nop
  5 
  6 define:
  7     BaseOfStack      equ 0x7c00
  8     RootEntryOffset  equ 19
  9     RootEntryLength  equ 14
 10 
 11 header:
 12     BS_OEMName     db "D.T.Soft"
 13     BPB_BytsPerSec dw 512
 14     BPB_SecPerClus db 1
 15     BPB_RsvdSecCnt dw 1
 16     BPB_NumFATs    db 2
 17     BPB_RootEntCnt dw 224
 18     BPB_TotSec16   dw 2880
 19     BPB_Media      db 0xF0
 20     BPB_FATSz16    dw 9
 21     BPB_SecPerTrk  dw 18
 22     BPB_NumHeads   dw 2
 23     BPB_HiddSec    dd 0
 24     BPB_TotSec32   dd 0
 25     BS_DrvNum      db 0
 26     BS_Reserved1   db 0
 27     BS_BootSig     db 0x29
 28     BS_VolID       dd 0
 29     BS_VolLab      db "D.T.OS-0.01"
 30     BS_FileSysType db "FAT12   "
 31 
 32 start:
 33     mov ax, cs
 34     mov ss, ax
 35     mov ds, ax
 36     mov es, ax
 37     mov sp, BaseOfStack
 38     
 39     mov si, MsgStr
 40     mov di, DEST
 41     mov cx, MsgLen
 42     
 43     call MemCmp
 44     
 45     cmp cx, 0
 46     jz label
 47     jmp last
 48     
 49     
 50 label:
 51     mov bp, MsgStr
 52     mov cx, MsgLen
 53     
 54     call Print
 55     
 56 output:    
 57     mov bp, MsgStr
 58     mov cx, MsgLen
 59     call Print
 60     
 61 last:
 62     hlt
 63     jmp last    
 64 
 65 
 66 ; ds:si --> source
 67 ; es:di --> destination
 68 ; cx    --> length
 69 ;
 70 ; return:
 71 ;        (cx == 0) ? equal : noequal
 72 MemCmp:
 73     push si
 74     push di
 75     push ax
 76     
 77 compare:
 78     cmp cx, 0
 79     jz equal
 80     mov al, [si]
 81     cmp al, byte [di]
 82     jz goon
 83     jmp noequal
 84 goon:
 85     inc si
 86     inc di
 87     dec cx
 88     jmp compare
 89     
 90 equal:
 91 noequal:   
 92     pop ax
 93     pop di
 94     pop si
 95     
 96     ret
 97 
 98 ; es:bp --> string address
 99 ; cx    --> string length
100 Print:
101     mov ax, 0x1301
102     mov bx, 0x0007
103     int 0x10
104     ret
105 
106 ; no parameter
107 ResetFloppy:
108     push ax
109     push dx
110     
111     mov ah, 0x00
112     mov dl, [BS_DrvNum]
113     int 0x13
114     
115     pop dx
116     pop ax
117     
118     ret
119 
120 ; ax    --> logic sector number
121 ; cx    --> number of sector
122 ; es:bx --> target address
123 ReadSector:
124     push bx
125     push cx
126     push dx
127     push ax
128     
129     call ResetFloppy
130     
131     push bx
132     push cx
133     
134     mov bl, [BPB_SecPerTrk]
135     div bl
136     mov cl, ah
137     add cl, 1
138     mov ch, al
139     shr ch, 1
140     mov dh, al
141     and dh, 1
142     mov dl, [BS_DrvNum]
143     
144     pop ax
145     pop bx
146     
147     mov ah, 0x02
148 
149 read:    
150     int 0x13
151     jc read
152     
153     pop ax
154     pop dx
155     pop cx
156     pop bx
157     
158     ret
159 
160 MsgStr db  "Hello World"    
161 MsgLen equ ($-MsgStr)
162 DEST db  "Hello World" 
163 
164 Buf:
165     times 510-($-$$) db 0x00
166     db 0x55, 0xaa

 

  运行结果如下:

技术分享图片

 

  上图的程序中,我们直接比较的字符串“Hello World”,如果比较成功,就将字符串打印出来。

  

 


以上是关于第七课 突破512字节限制--中的主要内容,如果未能解决你的问题,请参考以下文章

操作系统--突破512字节的限制

6.突破512字节的限制(上)

8.突破512字节的限制(下)

第六课 突破512字节的限制 上

第八课 突破512字节的限制--下

7.突破512字节的限制(中)