Чтение FAT12 - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Помогите подправить программу, кто знает. Программа читает таблицу FAT в память. Необходимо чтобы таблица выводилась на экран и выходной файл был не .com а .exe. Заранее благодарен.
.model tiny 
    .code 
    .386 
    org 100h 
    start: 
    mov ax,0003h 
    int 10h 
    call ReadFAT 
    ret 
 
ReadSect proc 
    push di 
    push es  
    push cs 
    pop ds 
    mov cx,[gnTrackSect]
    mov si,dx 
    mov ax,si 
    xor dx,dx
    div cx 
    mov di,ax 
    mov ax,di 
    imul cx 
    mov dx,si 
    sub dx,ax 
    inc dx 
    mov [AbsSectNum],dx 
    mov ax,di 
    and ax,1 
    mov [AbsHeadNum],ax 
    imul cx 
    push ax 
    mov ax,si 
    pop dx 
    sub ax,dx 
    mov dx,[AbsSectNum] 
    dec dx 
    sub ax,dx 
    mov dx,cx 
    shl dx,1 
    push ax 
    push dx 
    xor dx,dx 
    pop bx 
    pop ax 
    div bx
    mov cx,ax 
    mov al,cl 
    shr cx,2 
    and cl,0C0h 
    mov ch,al 
    and cx,0FFC0h 
    mov ax,[AbsSectNum] 
    or cl,al 
    pop es 
    pop bx
    mov dx,[AbsHeadNum] 
    mov dh,dl
    mov dl,0
    mov al,1
    mov ah,2 
    int 13h 
    ret 
ReadSect endp  
 
ReadFAT proc 
    pusha 
    mov dx,1 
    mov di,offset Mem_FAT 
    Cont_Read_Fat: 
    push dx 
    push di 
    push es 
    Call ReadSect 
    pop es 
    pop di 
    pop dx 
    add di,512 
    inc dx 
    cmp dx,10 
    jne Cont_Read_Fat 
    popa 
    ret 
ReadFAT endp 
 
AbsSectNum dw 0
AbsHeadNum dw 0 
gnTrackSect dw 18 
Mem_FAT db 9*512 dup(?)
end start

Решение задачи: «Чтение FAT12»

textual
Листинг программы
.386
        .model small
;------------------------------------------------------------
.DATA
 
    AbsSectNum dw 0 
    AbsHeadNum dw 0 
    gnTrackSect dw 18 ; Число секторов на дорожку 
    Mem_FAT db 4608 dup(0) ;Столько байт занимает FAT12
;-------------------------------------------------------------
.CODE  
start:
    mov ax,@data
    mov ds,ax
    mov ax,0003h 
    int 10h 
    call ReadFAT
           
ReadSect proc 
    push di 
    push es 
; Начало расчета сектора/дорожки/головки 
    push cs 
    pop ds 
    mov cx,[gnTrackSect] ;В счетчик помещаем 
    mov si,dx 
; tmp=(Sector/TrackSectors); 
    mov ax,si 
    xor dx,dx 
    div cx 
    mov di,ax 
; Sec=Sector-(tmp*TrackSectors)+1; 
    mov ax,di 
    imul cx 
    mov dx,si 
    sub dx,ax 
    inc dx 
    mov [AbsSectNum],dx 
; Head=tmp & 1; 
    mov ax,di 
    and ax,1 
    mov [AbsHeadNum],ax 
; Trk=(Sector-(Head*TrackSectors)-(Sec-1))/(TrackSectors*2); 
    imul cx 
    push ax 
    mov ax,si 
    pop dx 
    sub ax,dx 
    mov dx,[AbsSectNum] 
    dec dx 
    sub ax,dx 
    mov dx,cx 
    shl dx,1 
    push ax 
    push dx 
    xor dx,dx 
    pop bx 
    pop ax 
    div bx ; AX = AbsTrackNum 
; Конец расчетов 
    mov cx,ax 
    mov al,cl 
    shr cx,2 
    and cl,0C0h 
    mov ch,al 
    and cx,0FFC0h 
    mov ax,[AbsSectNum] 
    or cl,al 
    pop es 
    pop bx ; ES:BX = Куда считывать 
    mov dx,[AbsHeadNum] 
    mov dh,dl ; Номер головки 
    mov dl,0 ; Номер диска 0 = A 
    mov al,1 ; Количество считываемых секторов 
    mov ah,2 ; Номер функции 
    int 13h 
    mov ah,4Ch
    int 21h
    
ReadSect endp 
 
ReadFAT proc 
;Чтение таблицы размещения файлов в оперативную память 
    pusha 
    mov dx,1 
    mov di, offset Mem_FAT 
    Cont_Read_Fat: 
    push dx 
    push di 
    push es 
    Call ReadSect 
    pop es 
    pop di 
    pop dx 
    add di,512 
    inc dx 
    cmp dx,10 
    jne Cont_Read_Fat 
    popa 
    mov ah,4Ch
    int 21h 
ReadFAT endp
;++++++++++++++++++++++++++++++++++++++++++++
end start

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы