На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Путь к файлу
    Всё же я не могу понять как выйти на _путь_ найденного файла:   :-[ :-[ :-[
    ............................
     mov ah,4eh;
     mov dx,offset Mask;
     xor cx,cx;
     int 21h;

     mov ah,9;
     mov dx,offset 9eh;это смещение в DTA.
     int 21h;

    ret;
    Mask db '*.*',0;
    ..............................

    Почему это не работает ?
    В принципе, при этом выводится имя файла, а за ним...почему-то куча
    непонятных иероглифов. Но я думал, что будет не так, а получится
    командная строка. Как быть, чтобы выводился путь к файлу без всяких там.
      По поводу пути:
      Каталог не к чему определять, так как он известен изначально.
      Функции 4Eh и 4Fh осуществляют поиск записей в указанном каталоге (Mask). Когда в Mask ты путь не указываешь, поиск осуществляется в текущем каталоге.
      Чтобы получить путь найденного файла надо объединить строку с каталогом в пути поиска с именем файла

      А то что выводит белеберду, так это потому,  что используешь для вывода ASCIIZ-строки функцию AH=9, которая осуществляет вывод строки, заканчивающейся символом $, на стандартное устройство вывода.
      Используй лучше
      AH = 40h
      BX = 1 (стандартноей устройство вывода)
      DS:DX -> строка
      CX = длина строки

      Функция же AH=9 хороша для вывода константных строк.
      Сообщение отредактировано: rivitna -
        Понял.  :)
        Спасибо.  :)
        Но возникла ещё маленькая проблема. Т.е. ипользование 4Fh.
        Либо она тормозит, либо я (скорее второе), но при этом в DTA
        ничего нет (точнее имя файла не выводится), а ошибки в AX нет
        (я проверил). 4Fh использует, то что возвтатила 4eh, правильно ?
        Ну я и использую 4fh сразу после 4eh. Эффекта нет, но и
        ошибка не возвращается. Где зарыта собака ?
          Скорее всего, ты после выполнения функции не проверяешь флаг CF, сигнализирующий о результатах поиска...
            Наверное, здесь дело всё-таки не в CF: :-[

            ........................
                 mov ah,4eh;
                 mov dx,offset Mask;
                 xor cx,cx;
                 int 21h;

                 mov cx,10; пока так(потом чего-нибудь придумаю)
            Label:
                 mov ah,40h;
                 mov bx,1;
                 mov dx,9eh;
                 mov cx,13;
                 int 21h;

            mov ax,4fh;
            int 21h;
            loop Label;
            .......................
            Такие вот дела.
              Не хорошо и не корректно, а также с грубыми ошибками:
              нельзя внутри цикла loop изменять CX, в твоем случае получается бесконечный цикл.

              Еще раз повторяю, что об успешном результате поиска записи, сигнализирует CF (CF=0), это надо обязательно контролировать

              Короче, примерно так:

              PrintFiles PROC
                 mov ah,4Eh
                 mov dx,offset Mask
                 xor cx,cx
                 int 21h
                 jc @@Exit

                 mov bx,1 ;стандартное устройство вывода

              @@Find_Loop:
                 mov dx,9Eh
                 call StrLen
                 mov ah,40h
                 int 21h

                 call NewLine

                 mov ah,4Fh
                 int 21h
                 jnc @@Find_Loop

              @@Exit:
                 ret
              PrintFiles ENDP

              ;In: DS:DX -> строка
              ;Out: CX = длина строки
              StrLen PROC
                 push es
                 push di

                 push ds
                 pop es
                 mov di,dx ;ES:DI -> строка

                 xor al,al ;AL=0 (признак конца строки)
                 mov cx,0FFFFh
                 cld
                 repne scasb
                 not cx
                 dec cx ;CX = длина строки

                 pop di
                 pop es
                 ret
              StrLen ENDP

              NewLine PROC
                 mov ah,2
                 mov dl,0Dh
                 int 21h
                 mov dl,0Ah
                 int 21h
                 ret
              NewLine ENDP
              Сообщение отредактировано: rivitna -
                Признаю все свои ошибки, только сейчас я понял какаую XЕРНЮ я написал.
                Спасибо.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0268 ]   [ 15 queries used ]   [ Generated: 27.04.24, 07:38 GMT ]