ох уж еэтот DOS... help!!!

Тема в разделе "WASM.BEGINNERS", создана пользователем al_gert, 7 июн 2009.

  1. al_gert

    al_gert New Member

    Публикаций:
    0
    Регистрация:
    1 май 2008
    Сообщения:
    6
    здравствуйте.
    Есть задача: вывести в файл имена и последовательности кластеров для всех com и exe файлов корневого каталога диска A:.
    Пока работал с отладчиком (td.exe), проблем не было: все читалось, писАлось и отображалось. Когда окончательно отладил и стал запускать без отладчика, программа либо не выводит в файл вообще ничего, либо ведет себя так, будто не может считать часть секторов с дискеты. Здесь, видимо, какая-то тонкость есть, вот только никак не возьму в толк, в чем именно дело. При запуски из-под отладчика программа по-прежнему работает корректно...

    Подскажите, пожалуйста, кто-нибудь, что здесь не так:

    Код (Text):
    1. cseg segment
    2.     ;привяжем сегмент к регистрам
    3.     assume  cs:cseg,ds:cseg,es:cseg,ss:cseg
    4.     org     100h
    5.  
    6. start:  jmp     begin
    7.    
    8.     ;объявим переменные
    9.     handler     dw  0h
    10.     fname       db  'a:\file.txt',0
    11.    
    12.     fout        db  '----name----',': ',20h
    13.     klaster     db  'fff '
    14.     buf     db  03000h dup(0)  
    15.  
    16. lister  proc
    17.     mov bp,sp
    18.     mov bx,[bp+2]
    19.  
    20.     mov ax,word ptr [bx]
    21. ;   v ax - nomer sled. klastera
    22. begina: xor dx,dx
    23.     mov cx,02h
    24.     div cx
    25.     push    dx
    26.     mov cx,03h
    27.     mul cx
    28.     pop dx
    29.     cmp dx,00h
    30.     jne part2
    31.  
    32. part1:  mov si,ax
    33.     add si,offset buf
    34.     add si,200h
    35.     mov ch,[si]+1
    36.     mov cl,[si]
    37.     and ch,0fh
    38.     jmp pos
    39. part2:  mov si,ax
    40.     add si,offset buf
    41.     add si,200h
    42.     mov ch,[si]+2
    43.     mov cl,[si]+1
    44.     shr cx,04h
    45.     and cx,0fffh
    46. pos:    cmp cx,0fffh
    47.     je  finita
    48.  
    49. ;   v cx -  soderjimoe tekuschego klastera 
    50.  
    51.     mov [klaster],20h
    52.     mov al,cl
    53.     and al,0fh
    54.     add al,30h
    55.     cmp al,39h
    56.     jle dd0
    57.     add al,07h
    58. dd0:    mov [klaster]+3,al
    59.     mov al,cl
    60.     and al,0f0h
    61.     shr al,4h
    62.     add al,30h
    63.     cmp al,39h
    64.     jle dd1
    65.     add al,07h
    66. dd1:    mov [klaster]+2,al
    67.  
    68.     mov al,ch
    69.     and al,0fh
    70.     add al,30h
    71.     cmp al,39h
    72.     jle dd2
    73.     add al,07h
    74. dd2:    mov [klaster]+1,al
    75.    
    76.  
    77.     push    cx
    78.     mov ah,40h
    79.     mov bx,handler
    80.     mov cx,04h
    81.     mov dx,offset klaster
    82.     int 21h
    83.  
    84.     pop ax
    85.  
    86.     jmp begina
    87.  
    88. finita: mov [klaster],13
    89.     mov [klaster+1],10
    90.     mov ah,40h
    91.     mov bx,handler
    92.     mov cx,02h
    93.     mov dx,offset klaster
    94.    
    95.  
    96.     int 21h
    97.     ret 2
    98. lister  endp
    99.  
    100. print   proc
    101.     mov bp,sp
    102. ; vivod imeni i tipa faila 
    103.     mov cx,08h
    104.     mov si,offset fout
    105.  
    106. rt: mov al,[bx]
    107.     mov [si],al
    108.     inc si
    109.     inc bx
    110.     loop    rt
    111.  
    112.     mov cx,03h
    113.     mov al,2eh
    114.     mov [si],al
    115.     inc si
    116.  
    117. rt2:    mov al,[bx]
    118.     mov [si],al
    119.     inc si
    120.     inc bx
    121.     loop    rt2
    122.     push    bx
    123.     mov ah,40h
    124.     mov bx,handler
    125.     mov cx,0fh
    126.     mov dx,offset fout
    127.     int 21h
    128. ; vivod spiska klasterov
    129.    
    130.     pop bx
    131.     add bx,0fh
    132.     mov al,[bx]
    133.     and al,0fh
    134.     add al,30h
    135.     cmp al,39h
    136.     jle ccc
    137.     add al,07h
    138. ccc:    mov [klaster]+2,al
    139.  
    140.     mov al,[bx]
    141.     and al,0f0h
    142.     shr al,04h
    143.     add al,30h
    144.     cmp al,39h
    145.     jle ccc2
    146.     add al,07h
    147. ccc2:   mov [klaster]+1,al
    148.  
    149.     mov al,[bx]+1
    150.     and al,0fh
    151.     add al,30h
    152.     cmp al,39h
    153.     jle ccc3
    154.     add al,07h
    155. ccc3:   mov [klaster],al
    156.    
    157.     mov [klaster]+3,20h
    158.    
    159.     push    bx
    160.     mov ah,40h
    161.     mov bx,handler
    162.     mov cx,04h
    163.     mov dx,offset klaster
    164.     int 21h
    165.     mov ah,[bx+1]
    166.     and ah,0fh
    167.  
    168.     call    lister
    169.    
    170.     ret
    171. print   endp
    172.  
    173. begin: ; открытие файла сохранение handler
    174.     mov ah,3ch
    175.     mov cx,0h
    176.     mov dx,offset fname
    177.     int     21h
    178.    
    179.     mov handler,ax
    180.    
    181.     ;чтение секторов диска
    182.     mov ah,02h
    183.     mov al,0ah  ;количество секторов
    184.     mov ch,00h  ;номер дорожки
    185.     mov cl,01h  ;номер сектора
    186.     lea bx,buf  ;адрес буфера
    187.     mov dh,0    ;сторона 00
    188.     mov dl,0    ;дисковод 00 -> A:
    189.     int 13h
    190.    
    191.     mov ah,02h
    192.     mov al,0Eh  ;количество секторов
    193.     mov ch,00h  ;номер дорожки
    194.     mov cl,02h  ;номер сектора
    195.     lea bx,buf+1400h    ;адрес буфера
    196.     mov dh,01h  ;сторона 01
    197.     mov dl,0    ;дисковод 00 -> A:
    198.     int 13h
    199.  
    200.     ;zanesenie v bx adresa kornevogo kataloga  
    201.     lea bx,buf
    202.     add bx,1400h
    203.  
    204. big_c:     
    205.     mov al,[bx]
    206.     cmp al,00h
    207.     je  endd
    208.     cmp al,0e5h
    209.     je  endd
    210.  
    211. exe:    mov al,[bx]+8
    212.     cmp al,65h
    213.     jne com
    214.     mov al,[bx]+9
    215.     cmp al,78h
    216.     jne com
    217.     mov al,[bx]+0ah
    218.     cmp al,65h
    219.     jne com
    220.     jmp printer
    221.        
    222. com:    mov al,[bx]+8
    223.     cmp al,63h
    224.     jne EXE_SH
    225.     mov al,[bx]+9
    226.     cmp al,6fh
    227.     jne EXE_SH
    228.     mov al,[bx]+0ah
    229.     cmp al,6dh
    230.     jne EXE_SH
    231.     jmp printer
    232.        
    233. EXE_SH: mov al,[bx]+8
    234.     cmp al,45h
    235.     jne COM_SH
    236.     mov al,[bx]+9
    237.     cmp al,58h
    238.     jne COM_SH
    239.     mov al,[bx]+0ah
    240.     cmp al,45h
    241.     jne COM_SH
    242.     jmp printer
    243.        
    244. COM_SH: mov al,[bx]+8
    245.     cmp al,43h
    246.     jne endd   
    247.     mov al,[bx]+9
    248.     cmp al,4fh
    249.     jne endd
    250.     mov al,[bx]+0ah
    251.     cmp al,4dh
    252.     jne endd
    253.  
    254. printer:push    bx
    255.     call    print
    256.     pop bx
    257.  
    258. endd:   add bx,20h
    259.     lea dx,buf
    260.     add dx,2600h
    261.     add dx,1c00h
    262.     cmp bx,dx
    263.     jne big_c
    264.    
    265.     ; закрытие файла  
    266.     mov ah,3eh
    267.     mov bx,handler
    268.     int 21h
    269.        
    270.     mov ah,4ch
    271.     int 21h
    272.  
    273. cseg        ends
    274. end     start
     
  2. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    Дискетка просто не успевает раскрутиться от 0 до нужной скорости. В старых доках рекомендуется первое чтение сектора выполнять не менее 3 раз, контролируя ошибку.
     
  3. al_gert

    al_gert New Member

    Публикаций:
    0
    Регистрация:
    1 май 2008
    Сообщения:
    6
    спасибо, drmad.
    помогли локализовать проблему, сделал так:

    Код (Text):
    1. metka:
    2.  ....
    3.  считывание секторов
    4.  ...
    5.  
    6.  cmp ax, <число секторов, которое должно было считаться>
    7. jne metka
    Зацикливается! не может прочитать и все тут.
    При этом в отладчике программа по-прежнему работает как часы, даже в режиме безостановочного прогона.

    Как же все-таки заставить его прочитать секторы?
     
  4. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    1. Один из секторов может быть битым. В этом случае (под чистым ДОСом) он прочитается с мусором внутри, а функа даст ошибку.
    2. А заполняются ли ли все регистры в цикле заново? Лет 15 назад я делал примерно так:

    Код (Text):
    1.              mov       si, 4
    2. metka:  
    3.              dec        si
    4.              jz           error
    5. ; Сброс
    6.              mov       ah, 0
    7.              mov       dl, 0
    8.              int         13h
    9. ; Чтение
    10.     mov ah,02h
    11.     mov al,0ah  ;количество секторов
    12.     mov ch,00h  ;номер дорожки
    13.     mov cl,01h  ;номер сектора
    14.     lea bx,buf  ;адрес буфера
    15.     mov dh,0    ;сторона 00
    16.     mov dl,0    ;дисковод 00 -> A:
    17.     int 13h
    18.  
    19.              jc           Metka
    20. ok:
    21.              ....
    22. error:
    23.              add         byte ptr messag, ah
    24.              mov         ah, 9
    25.              lea           dx, messag
    26.              int           21h
    27.              ...
    28. messag   db           'a$'
    Если ошибка, то на экран выскакивала какая-то буква, по котрой легко можно было вычислить код ошибки. Если 'a' - нет ошибки, если 'b' - недопустимая команда; 'c' - неформатированная дорожка; 'i' - буфер под данные пересекает границы сегмента, и т.п.

    3. Кстати, "буфер под данные пересекает границы сегмента" - тоже случается. А под дебагером может и не быть.