Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/68: Рейтинг темы: голосов - 68, средняя оценка - 4.69
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
MASM

Вывод файла на экран (из книги Калашникова)

21.02.2011, 11:59. Показов 13552. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начинаю работать с файлами. Разобрал код из книги, некоторое непонятно (пометил вопросами). Кто может, прокомментируйте плиз некоторые строки кода
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
CSEG segment
assume cs:CSEG, ds:CSEG, es: CSEG, SS:CSEG
org 100h
Begin:
    ;функция ah=3Dh прерывания 21h - Открытие файла
    mov ax, 3D00h;открывает файл для чтения
    mov dx, offset Filename;ds:dx указывают путь к файлу
    int 21h;открываем файл
    jc Error_file;перейти если установлен флаг переноса (jump if carry) (если произошла ошибка)
    
    ;Для того чтобы прочитать файл, необходимо в bx указать его номер, полученный после открытия, который находится в ax
    ;Загрузка числа в один регистр из другого происходит быстрее, чем из памяти (переменной)
    ;Хотя записмь mov bx, Handle не была бы ошибочной
    
    
    mov Handle, ax;Handle - переменная, в которую заносим номер файла после открытия
    mov bx,ax 
    mov ah, 3Fh; функция 3Fh - чтение файла
    ;????????????????????????????????????????
    mov cx, 0FDE8h;будем читать 0FDE8h=65000 байт
    ;ds:dx должен указывать на буфер в памяти для чтения
    mov dx, offset Buffer;зачем нужен этот оператор????????????????????????
    int 21h;всё готово, читаем...
    
    mov ah, 3Eh;для закрытия файла
    mov bx, Handle;номер файла должен находиться в bx,но так как регистр bx менялся, то загружаем ее из переменной Handle
    int 21h;непосредственно закрываем файл
    
    mov dx, offset Mess_ok
    
    Out_prog:
    mov ah,9;вывод строки на экран
    int 21h;выводим строку
    
    int 20h;выходим из программы
    
    Error_file:
    mov dx, offset Mess_error
    jmp Out_prog
    
    ;==Переменные==
    ;что такое dw и почему переменная объявлена в конце, а не в начале как в c++/c#,pascal,php??????????????????????????????
    Handle dw 0;резерв 2 байта для нашей переменной
    Mess_ok db 'Файл загружен в память$'
    Mess_error db 'Ошибка$'
    
    ;откуда будем читать этот файл
    Filename 'C:\1.txt',0, '!$'
    
    Buffer equ $;?????????????????????????????
    
CSEG ends
End Begin
И самое непонятное -это Filename 'C:\1.txt',0, '!$'
Зачем тут 0???
Автор писал про то что строки должны заканчиваться 0, но в самом начале книги он писал про то что строка заканчиаеся $
и восклицательный знак что значит?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.02.2011, 11:59
Ответы с готовыми решениями:

Не работает резидентная программа - пример из книги Калашникова
Набрал программу из книги Калашникова: CSEG segment assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG org 100h Start: ;Переходим на метку...

Не могу найти диск из книги Калашникова "Ассемблер — это просто. Учимся программировать"
Офф сайт Калашникова закрыли. Может быть кто - нибудь знает, где можно скачать диск или найти программы, которые на нём были? Заранее...

Прямой вывод символа в видеопамять (по книге Калашникова)
разбираю пример из Калашникова CSEG segment org 100h begin: mov ax,0b800h;загружаем в 16-битный регистр данных ;0b800h...

3
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
21.02.2011, 13:07
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Зачем тут 0???
для команд работающих с файлами строки должны заканчиваться именно нулем, а $ только для функции 9 21го прерывания
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
22.02.2011, 13:57  [ТС]
1. mov cx, 0FDE8h;будем читать 0FDE8h=65000 байт
это как понять? То есть прежде чем мы начнем работу с файлом, надо записать его размер, чтобы программа знала, сколько байт надо читать? А если мы будем производить запись в файл?
И еще. почему 65000? Может быть правильнее сначала вызвать функцию, которая узнает размер файла, а затем уже записать это значение в cx???
2. mov dx, offset Buffer;зачем нужен этот оператор????????????????????????
3. ;==Переменные==
;что такое dw и почему переменная объявлена в конце, а не в начале как в c++/c#,pascal,php??????????????????????????? ???
Handle dw 0;резерв 2 байта для нашей переменной
4. что это делает?

Buffer equ $;?????????????????????????????
0
 Аватар для Sashka
14 / 14 / 2
Регистрация: 03.04.2009
Сообщений: 72
26.02.2011, 17:29
1. mov cx, 0FDE8h;будем читать 0FDE8h=65000 байт
это как понять? То есть прежде чем мы начнем работу с файлом, надо записать его размер, чтобы программа знала, сколько байт надо читать? А если мы будем производить запись в файл?
И еще. почему 65000? Может быть правильнее сначала вызвать функцию, которая узнает размер файла, а затем уже записать это значение в cx???

Если я подумал о той самой книге, то там написано: в листинге приведен образец чтения файла ДО 65000 байт. Вызывается в данном случае прерывание MS-DOS, то есть если файл будет меньше, все необходимое сделает операционная система.

Вот эта часть может быть не правельна: Если файл больше 0FFFFh байт, то возможно будет что то похожее на это
C
1
2
3
4
while(ReadFile(args,...) == BytesToRead)
{
...
}
То есть пока мы читаем заданное колличество байт из файла, значит он не закончился, как только прочитали меньше - все, файл закончился

---------------------------------

2. mov dx, offset Buffer;зачем нужен этот оператор????????????????????????

Какой именно? offset - смещение. То место в памяти, точнее тот адрес с которого начнем записывать полученные данные. В данном случае это местом является переменная Buffer. Под него было зарезервировано место в памяти.

Каков размер регистра dx? А какой у переменной Buffer? Buffer явно больше.

---------------------------------

;что такое dw и почему переменная объявлена в конце, а не в начале как в c++/c#,pascal,php??????????????????????????? ???
Handle dw 0;резерв 2 байта для нашей переменной

Ассемблер отличается от языков программирования высокого уровня. В С++ и других языках программирования
C++
1
char s;
сообщает компилятору, что под перемнную s нужно отвести в памяти один байт. Особенности компиляции... трудно вот так на пальцах объяснить.

PS
Лучше пользоваться отладчиком и смотреть что, да как. Так трудно понять.
На 95 стр. после картинки ответ на первый вопрос.
Поправьте, если я не прав.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2011, 17:29
Помогаю со студенческими работами здесь

Считывания текста книги(любой формат), вывод на экран, подобие генерации короткого содержания
Ребят, может есть кого-то программа(желательно реализована через С#), c открытым исходным кодом, для считывания и вывода текста(книги)...

создание файла и вывод файла на экран не менее 7ми записей
Добрый день. Вот у меня такая задачка: создание файла и вывод файла на экран не менее 7ми записей. Создание отсортированного файла. Выборка...

Lvalue required. Добавление строк в Memo - ввод книги, вывод книги по ID.
Вроде библиотечной программы. Ввод книги. Вывод книги по ID. #include "Unit1.h" ...

Структура Книга: Автор, Название книги, Год издания. Вывести книги старше 10 лет. Ввод-вывод – в файлы
. Входную информацию требуется сохранять в бинарном файле, выходную – в текстовом. Написать программу, которая использует структуру...

вывод из файла на экран
Добрый вечер! Что-то я никак не пойму. Нужно вывести числа из файла на экран по пять числа в строке. И никак не могу понять как это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru