第七课 突破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字节限制--中的主要内容,如果未能解决你的问题,请参考以下文章