突破512字节限制(2)
反汇编
找到readsec函数的入口地址
通过查看寄存器可以看到
当汇编代码定义了函数,那么就需要定义栈空间
突破512字节限制(2)
如何在根目录区查找目标文件?
A.内存比较
1.指定源起始地址(DS:SI)
2.指定目标起始地址(ES:DI)
3.判断在期望长度(CX)内每一个字节是否都相等
汇编中比较和跳转命令
cmp cx,0–比较cx的值是否为0
jz equal–如果比较的结果为真,则跳转到equal标签处
需要一个内存比较函数,然后查找根目录区是否存在目标文件
实验 :内存比较函数 Memcmp
实验:根目录区查找函数 FindEntry
查看LOADER是否存在
org 0x7c00 jmp short start nop define: BaseOfStack equ 0x7c00 RootEntryOffset equ 19 RootEntryLength equ 14 header: BS_OEMName db "D.T.Soft" BPB_BytsPerSec dw 512 BPB_SecPerClus db 1 BPB_RsvdSecCnt dw 1 BPB_NumFATs db 2 BPB_RootEntCnt dw 224 BPB_TotSec16 dw 2880 BPB_Media db 0xF0 BPB_FATSz16 dw 9 BPB_SecPerTrk dw 18 BPB_NumHeads dw 2 BPB_HiddSec dd 0 BPB_TotSec32 dd 0 BS_DrvNum db 0 BS_Reserved1 db 0 BS_BootSig db 0x29 BS_VolID dd 0 BS_VolLab db "D.T.OS-0.01" BS_FileSysType db "FAT12 " start: mov ax, cs mov ss, ax mov ds, ax mov es, ax mov sp, BaseOfStack mov ax, RootEntryOffset mov cx, RootEntryLength mov bx, Buf call ReadSector mov si, Target mov cx, TarLen mov dx, 0 call FindEntry cmp dx, 0 jz output jmp last output: mov bp, MsgStr mov cx, MsgLen call Print last: hlt jmp last ; es:bx --> root entry offset address ; ds:si --> target string ; cx --> target length ; ; return: ; (dx != 0) ? exist : noexist ; exist --> bx is the target entry FindEntry: push di push bp push cx mov dx, [BPB_RootEntCnt] mov bp, sp find: cmp dx, 0 jz noexist mov di, bx mov cx, [bp] call MemCmp cmp cx, 0 jz exist add bx, 32 dec dx jmp find exist: noexist: pop cx pop bp pop di ret ; ds:si --> source ; es:di --> destination ; cx --> length ; ; return: ; (cx == 0) ? equal : noequal MemCmp: push si push di push ax compare: cmp cx, 0 jz equal mov al, [si] cmp al, byte [di] jz goon jmp noequal goon: inc si inc di dec cx jmp compare equal: noequal: pop ax pop di pop si ret ; es:bp --> string address ; cx --> string length Print: mov ax, 0x1301 mov bx, 0x0007 int 0x10 ret ; no parameter ResetFloppy: push ax push dx mov ah, 0x00 mov dl, [BS_DrvNum] int 0x13 pop dx pop ax ret ; ax --> logic sector number ; cx --> number of sector ; es:bx --> target address ReadSector: push bx push cx push dx push ax call ResetFloppy push bx push cx mov bl, [BPB_SecPerTrk] div bl mov cl, ah add cl, 1 mov ch, al shr ch, 1 mov dh, al and dh, 1 mov dl, [BS_DrvNum] pop ax pop bx mov ah, 0x02 read: int 0x13 jc read pop ax pop dx pop cx pop bx ret MsgStr db "No LOADER ..." MsgLen equ ($-MsgStr) Target db "LOADER " TarLen equ ($-Target) Buf: times 510-($-$$) db 0x00 db 0x55, 0xaa
小结: