• Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом


  • Иллюстрированный самоучитель по задачам и примерам Assembler

    Чтение, запись, позиционирование в файле

    Чтение из файла или устройства

    Чтение из файла в область памяти осуществляется функцией 3Fh.

    Вход: АН = 3Fh; BX = дескриптор файла; СХ = количество байтов для чтения; DS-.DX – указатель на область памяти, в которую помещаются прочитанные байты.

    Выход: CF = 0 – АХ = число действительно прочитанных байтов из файла; CF = 1 – АХ = код ошибки: 5 – в доступе отказано; 6 – недопустимый дескриптор.

    Чтение данных производится начиная с текущей позиции в файле, которая после успешного чтения смещается на значение, равное количеству прочитанных байтов. Если в качестве файла используется стандартная консоль (клавиатура), то чтение производится до первого символа CR (carriage return) с кодом 0dh, соответствующего нажатию клавиши Enter. Это, кстати, еще один способ ввода данных с клавиатуры в программу. Кроме символов введенной строки в ее конец помещаются символы 0dh и Oah. Это необходимо учитывать при задании размера буфера для ввода.

    Способ ввода данных с экрана с помощью функции 3Fh демонстрирует приведенный ниже пример программы.

    :prg07_10.asm – программа демонстрации ввода данных с экрана с помощью функции 3Fh.
    .data
    string db 80 dup Г ") 1en_string=$-string point_fname dd string
    .code
    :………вводим с экрана……-----…..----------------
    movbx.O стандартный дескриптор – клавиатура
    mov cx.len_string
    Ids dx.point_fname:формируем указатель на строку string
    movah,3fh;номер функции DOS
    int 21h
    jc exit:переход в случае ошибки;---------выводим на экран---------------------………..
    movbx.l стандартный дескриптор – экран:две строки ниже в данном случае можно опустить
    mov ex.len_string
    Ids dx.point_fname;0opMnpyeM указатель на строку string
    movah.40h;номер функции DOS
    int 21h открываем файл
    jc exit:переход в случае ошибки
    

    Для демонстрации работы функции с дисковым файлом приведем программу чтения и вывода на экран содержимого файла, имя которого вводится в командной строке. Побочная цель этой программы – научиться обрабатывать в программе командную строку DOS. Поясним последний момент.

    Содержимое командной строки, следующее за именем программы при ее вызове и называемое хвостом команды, помещается в префикс программного сегмента (PSP) со смещением 80h от его начала и максимально имеет размер 128 байт. Первый байт этой области содержит длину хвоста команды, а первый символ хвоста, при его наличии, располагается со смещением 81h от начала PSP. Последний символ хвоста команды – всегда 0dh. Начало PSP найти очень легко – когда программа загружается в память для исполнения, то загрузчик устанавливает регистры ES и DS равными адресу PSP.

    :prg07_ll.asm – программа чтения и вывода на экран содержимого файла.
    ;имя которого вводится в командной строке.
    .data
    filejiame db 128 dup (" ");буфер, в который будет помещен путь к файлу
    point_fname dd file_name
    string db 80 dup (" ")
    len_stnng=$-string
    point_string dd string
    >handle dw 0 дескриптор файла
    [size_f dd 0:размер файла
    .code
    main::копируем командную строку в filejiame
    ;вначале уберем (установкой указателя) ведущие пробелы в командной строке
    :перед путем к файлу: movdi,81h mov al," " mov ex. 128 repe scasb
    dec di push di pop si
    movax.@data – . адрес сегмента данных – в регистр АХ
    mov es.ax:ax в es iTOvcl.ds:[80h] deccl
    lea di.filejiame rep movsb push es pop ds
    :--------открываем файл--……-----------------………
    moval.OOh:режим доступа – только чтение
    Ids dx.point_fname:формируем указатель на имя файла
    movah.3dh;номер функции DOS
    int 21h открываем файл
    jc exit:переход в случае ошибки
    mov handle.ax
    ;--------определяем размер файла-------------------------
    raovbx.ax – . дескриптор файла – в bх mov al.2 xor ex .ex
    xordx.dx:CX:DX =0 – нулевое смещение mov ah.42h
    int 21h;в DX:AX возвращается длина файла в байтах jc exit
    :если ошибка:формируем полную длину в
    edx shl eax.16 shld edx.eax.16 mov size_f.edx
    ;сохраним как условие выхода из программы при достижении снизу
    ;--------устанавливаем указатель на начало файла---…….
    mov bх.handle:дескриптор файла – в bх
    mov al.0
    xor ex.ex
    xordx.dx;CX:DX =0 – нулевое смещение
    mov ah,42h
    int 21h:текущий указатель в начале файла
    jc exit:если ошибка
    ;………читаем файл по lenjstring байт…………….---
    cycl: mov bx.handle:дескриптор файла в bх mov cx.lenjsthng
    Ids dx.pointjstring:формируем указатель на строку string movah.3fh
    :номер функции DOS int 21h:открываем файл jc exit;переход в случае ошибки
    ;………выводим на экран целиком…..---------…….----------
    movbx.l стандартный дескриптор – экран
    mov cx.len_string
    Ids dx.point_string.формируем указатель на строку string movah.40h
    ;номер функции DOS
    int 21h открываем файл
    jc exit:переход в случае ошибки
    cwde расширяем количество выведенных байт
    sub size_f.eax cmp size_f.О
    jleexit:достигли конца файла
     .jmp cycl
    exit::выход из программы
    mov al.1 int 21h
    …….
    

    Не забывайте после определения размера файла возвращать файловый указатель в нужное место файла.

    Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.