突破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

 

 

小结:

 

 

posted @ 2021-08-06 17:43  wsq1219  阅读(69)  评论(0编辑  收藏  举报