0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 14

Вывод на экран текстового файла

28.12.2011, 11:32. Показов 2239. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, дорогие форумчане CyberForum, помогмте пожалуйста с заданием к программе: имеется сама программа, суть её в том, что программа выводит на экран текстовый файл(текстовый файл должен подаваться в командной строке), должны работать клавиши вверх,вниз,страница вверх и вниз, в конец, в начало. Задача в том, что при выводе текстового файла на экран, в конце каждой строчки должна выводится *(звёздочка). Помогите пожалуйста!

Вот сама программа:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
.586
assume  cs:cseg, ds:dseg, ss:sseg ;присвоение сегментных регистров
 
sseg segment stack
  db 100h dup(?)
sseg ends
 
dseg segment byte
  new_line db 0dh, 0ah, '$' ; новая строка
  mes1 db 'Input file name: $' ; Сообщение 1
  mes2 db 80 dup(205), '         Press Up, Down, Page Up, Page Down, Home, End or ESC for quit         $' ; Сообщение 2
  mes_foe db 'File open error!', 0dh, 0ah, '$' ; Ошибка открытия
  
  screen_width dw 80    ; ширина экрана в символах
  screen_height dw 23   ; высота экрана в символах
  
  ; Буфер чтения
  read_buf  db 254      ; максимальное кол считываемых символов
  read_size db 0        ; размер считанной строки
  read_str  db 256 dup (?) ; считанная строка
 
  file_handle dw 0      ; описатель файла
  file_pos dw 0         ; позиция в файле
  end_page_pos dw ?     ; позиция последней страницы
 
  buf db ?              ; буфер символа
dseg ends
 
cseg segment use16 'CODE';Начало сегмента CSEG - в котором идёт наш код программы. 
;Сообщаем ассемблеру, что внутрисегментная адресация является ;16-ти разрядной - use16
start:
  mov ax, dseg          ; настроим DS  mov-Команда пересылки данных 
  mov ds, ax            ; на реальный сегмент
 
  call cls              ; очищаем экран
 
  lea dx, mes1          ; помещаем адрес на начало строки mes1 в dx
  mov ah, 09h           ; функция вывода строки на экран(Загружаем в регистр ah число (указываем функцию))
  int 21h               ; выводим сообщение 1
  call read_string      ; читаем строку
 
  lea dx, read_str      ; помещаем адрес на начало строки read_str в dx
  mov ax, 3d00h         ; открываем для чтения
  int 21h               ; в ax деcкриптор файла(Выводим фразу)
  jc open_error         ; если не открылся то идем на open_error
  mov file_handle, bx   ; помещаем описатель файла в file_handle
;Данная ошибка генерируется, если системному вызову DOS передается недопустимый описатель файла.
; Появление данной ошибки является свидетельством того, что файловая переменная испорчена.
 
  call find_pos_end_page ; ищем позицию последней страницы
 
main_loop: ; Задержка и вывод на экран 
  call cls              ; очищаем экран
 
  call print_page       ; печатаем страницу
 
  mov ah, 00h           ; функция получающая нажатую клавишу
  int 16h               ; получаем клавишу.Выводим фразу
 
  cmp ah, 01h           ; если нажата клавиша ESC
  je exit               ; то выходим
 
  cmp ah, 48h           ; если не нажата клавиша Up
  jne nk1               ; то идем на nk1
  call pos_line_up      ; инача идем на линию вверх
nk1:
  cmp ah, 50h           ; если не нажата клавиша Down
  jne nk2               ; то идем на nk2
  call pos_line_down    ; инача идем на линию вниз
nk2:
  cmp ah, 49h           ; если не нажата клавиша Page Up
  jne nk3               ; то идем на nk3
  call pos_page_up      ; инача идем на страницу вверх
nk3:
  cmp ah, 51h           ; если не нажата клавиша Page Down
  jne nk4               ; то идем на nk4
  call pos_page_down    ; инача идем на страницу вниз
nk4:
  cmp ah, 47h           ; если не нажата клавиша Home
  jne nk5               ; то идем на nk5
  mov file_pos, 0       ; иначе идем вначало файла
nk5:
  cmp ah, 4Fh           ; если не нажата клавиша End
  jne nk6               ; то идем на nk6
  mov ax, end_page_pos  ; помещаем в ax позицию последней страницы
  mov file_pos, ax      ; идем вконец файла
nk6:
  jmp main_loop         ; продолжаем цикл
 
  mov bx, file_handle   ; помещаем описатель файла в bx 
  mov ah, 3eh           ; функция закрытия файла
  int 21h               ; закрываем файл
  jmp exit              ; выходим
 
open_error:
  lea dx, mes_foe       ; помещаем адрес на начало строки mes_foe в dx
  mov ah, 09h           ; функция вывода строки на экран
  int 21h               ; выводим сообщение 1
 
 
exit:                   ; §*ўҐаи*Ґ¬ Їа®Ја*¬¬г        
  mov ah,4ch            ; дг*ЄжЁп ўл室*
    int 21h     ; ‡*ўҐаи*Ґ¬ Їа®Ја*¬¬г
    
 
;=== Очистка экрана ===
cls proc
  mov ax, 03            ; функция очищающая экран
  int 10h               ; очищаем экран
  ret
cls     endp
 
;=== Читаем строку в read_buf ===
read_string proc
  lea dx, read_buf      ; помещаем адрес на начало строки read_buf в dx
  mov ah, 0Ah           ; функция чтения в буфер
  int 21h               ; читаем строку
 
  mov bl, read_size     ; длина прочтенной строки
  xor bh, bh            ; очищаем bh
  lea di, read_str      ; помещаем адрес на начало строки name_str в di
  add di, bx            ; перемещаем указатель на конец строки
  mov [di], 0           ; ввод конца строки
 
  lea dx, new_line      ; помещаем адрес на начало строки new_line в dx
  mov ah, 09h           ; функция вывода строки на экран
  int 21h               ; переходим на новую строку
  ret
read_string endp
 
; печатаем страницу
print_page proc
  call mov_cur_pos      ; идем в текущую позицию файла
 
  mov si, screen_height ; помещаем в si высоту экрана
pp_loop:
  call print_line       ; печатаем линию
  dec si                ; уменьшаем si
  cmp si, 0             ; кли si не 0
  jne pp_loop           ; то продолжаем цикл
  
  lea dx, mes2          ; помещаем адрес на начало строки mes2 в dx
  mov ah, 09h           ; функция вывода строки на экран
  int 21h               ; выводим сообщение 1
  ret
print_page endp
 
; печатаем линию
print_line proc
  mov di, screen_width ; помещаем в di ширину экрана
 
pl_loop:
  mov bx, file_handle   ; помещаем описатель файла в bx
  mov ah, 3fh           ; будем читать из первого файла
    mov cx, 1             ; 1 байт
    lea dx, buf           ; в память buf1
  int 21h               ; читаем байт
 
  cmp ax, cx            ; если конец файла
  jne end_file          ; то идем на end_file
 
  mov ah, 02h           ; функция печатающая символ
  mov dl, buf           ; помещаем символ в dl
  int 21h               ; печатаем символ
 
  mov ah, buf           ; помещаем символ в ah
  cmp ah, 0dh           ; если символ равен 0dh
  je pl_loop            ; то идем на pl_loop
 
  mov ah, buf           ; помещаем символ в ah
  cmp ah, 0ah           ; если символ равен 0ah
  je end_pl             ; то идем на end_pl
 
  dec di                ; уменьшаем di
  cmp di, 0             ; если di не 0
  jne pl_loop           ; то продолжаем цикл
 
end_pl:
  ret
end_file:
  lea dx, new_line      ; помещаем адрес на начало строки new_line в dx
  mov ah, 09h           ; функция вывода строки на экран
  int 21h               ; переходим на новую строку
  ret
print_line endp
 
; переместить позицию на одну страницу вниз
pos_page_down proc
  mov si, screen_height ; помещаем в si высоту экрана
ppd_loop:
  call pos_line_down    ; перемещаем позицию на одну линию вниз
  dec si                ; уменьшаем si
  cmp si, 0             ; если si не 0
  jne ppd_loop          ; то продолжаем цикл
  ret
pos_page_down endp
 
; переместить позицию на одну линию вниз
pos_line_down proc
  call mov_cur_pos      ; идем в текущую позицию файла
  mov di, screen_width  ; помещаем в di ширину экрана
 
pld_loop:
  mov ax, end_page_pos  ; помещаем end_page_pos в ax
  cmp file_pos, ax      ; если позиция равна ax
  je end_pld            ; то идем на end_pld
  inc file_pos          ; увеличиваем file_pos
 
  mov bx, file_handle   ; помещаем описатель файла в bx
  mov ah, 3fh           ; будем читать из первого файла
    mov cx, 1             ; 1 байт
    lea dx, buf           ; в память buf1
  int 21h               ; читаем байт
 
  cmp ax, cx            ; если конец файла
  jne end_pld           ; то идем на end_pld
 
  mov ah, buf           ; помещаем символ в ah
  cmp ah, 0dh           ; если он равен 0dh
  je pld_loop           ; то идем на pld_loop
 
  mov ah, buf           ; помещаем символ в ah
  cmp ah, 0ah           ; если он равен 0ah
  je end_pld            ; то идем на end_pld
 
  dec di                ; уменьшаем di
  cmp di, 0             ; если di не 0
  jne pld_loop          ; то продолжаем цикл
 
end_pld:
  ret
pos_line_down endp
 
; переместить позицию на одну страницу вверх
pos_page_up proc
  mov si, screen_height ; помещаем в si высоту экрана
ppu_loop:
  call pos_line_up      ; перемещаем позицию на одну линию вверх
  dec si                ; уменьшаем si
  cmp si, 0             ; если si не 0
  jne ppu_loop          ; то продолжаем цикл
  ret
pos_page_up endp
 
; переместить позицию на одну линию вверх
pos_line_up proc
  mov di, screen_width  ; помещаем в di ширину экрана
 
plu_loop:
  cmp file_pos, 0       ; если позиция равна 0
  je end_plu            ; то идем на end_plu
  dec file_pos          ; уменьшаем file_pos
 
  call mov_cur_pos      ; идем в текущую позицию файла
  mov bx, file_handle   ; помещаем описатель файла в bx
  mov ah, 3fh           ; будем читать из первого файла
    mov cx, 1             ; 1 байт
    lea dx, buf           ; в память buf1
  int 21h               ; читаем байт
 
  mov ah, buf           ; помещаем символ в ah
  cmp ah, 0ah           ; если он равен 0ah
  je plu_loop           ; то идем на plu_loop
 
  mov ah, buf           ; помещаем символ в ah
  cmp ah, 0dh           ; если он не равен 0dh
  jne rcmp              ; то идем на rcmp
  cmp di, 80            ; если di равен 80
  je rcmp               ; то идем на rcmp
  add file_pos, 2       ; увеличиваем file_pos на 2
  jmp end_plu           ; идем на end_plu
rcmp:
 
  dec di                ; уменьшаем di
  cmp di, 0             ; если di не 0
  jne plu_loop          ; то продолжаем цикл
end_plu:
  ret
pos_line_up endp
 
; переместить позицию вrjytw 
find_pos_end_page proc
  xor cx, cx            ; очищаем cx
  xor dx, dx            ; очищаем dx
    mov bx, file_handle   ; помещаем описатель файла в bx
    mov ax, 4200h         ; функция перемещения позиции чтения в файле
  int 21h               ; идем к началу файла
  
pe_loop:
  mov ah, 3fh           ; будем читать из первого файла
    mov cx, 1             ; 1 байт
    lea dx, buf           ; в память buf1
  int 21h               ; читаем байт
 
  cmp ax, cx            ; если конец файла
  jne end_pe            ; то идем на end_pe
  inc file_pos          ; увеличиваем file_pos
  jmp pe_loop           ; продолжаем цикл
end_pe:
 
  call pos_page_up      ; перемещаем позицию на страницу вверх
  mov ax, file_pos      ; помещаем file_pos в ax
  mov end_page_pos, ax  ; помещаем ax в end_page_pos
  mov file_pos, 0       ; очищаем file_pos
  ret
find_pos_end_page endp
 
; идем в текущую позицию файла 
mov_cur_pos proc
  xor cx, cx            ; очищаем cx
  xor dx, dx            ; очищаем dx
    mov bx, file_handle   ; помещаем описатель файла в bx
    mov ax, 4200h         ; функция перемещения позиции чтения в файле
  int 21h               ; идем к началу файла
 
    xor cx, cx            ; очищаем cx
    mov dx, file_pos      ; помещаем file_pos в dx
    mov ax, 4201h         ; функция перемещения позиции чтения в файле
    int 21h               ; идем к позиции
  ret
mov_cur_pos endp
 
cseg    ends
 
end start
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.12.2011, 11:32
Ответы с готовыми решениями:

Постраничный вывод текстового файла на экран
Здравствуйте. На данном этапе работы стоит задача постранично вывести текстовый файл. Вывод следующей страницы должен осуществляться при...

Создание текстового файла, чтение и вывод его содержимого на экран
Помогите, пожалуйста разобраться. В учебнике нашла пример, программа должна создавать указанный файл, записывать в него строку-путь к...

Вывод текстового файла на экран. Цветовая "подсветка" символов. Изменение цвета фона мышью.
Остальные лабы уже сданы. А с этой вот проблемы, без неё не хотят зачёт ставить. В этой лабе 4 задачи, но надо сделать 1 из них. Одна...

1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
28.12.2011, 13:20
А не пробовали читать из файла построчно с помощью int 21h/ah=09h?
Т.е. принудительно переназначаете ввод с клавиатуры на чтение из файла с помощью
INT 21 46-- - DOS 2+ - "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE
Inp.:
AH = 46h
BX = file handle
CX = file handle to become duplicate of first handle
Return: CF clear if successful
CF set on error
AX = error code (04h,06h) (see #01680 at AH=59h/BX=0000h)
Notes: closes file with handle CX if it is still open
DOS 3.30 hangs if BX=CX on entry
moving file pointer for either handle will also move it for the other,
because both will refer to the same system file table
CX = 0 - STDIN; BX - ваш file_handle
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.12.2011, 13:20
Помогаю со студенческими работами здесь

Вывод содержимого текстового файла на экран
Нужно написать программу чтоб выводила содержимое текстового файла на экран, желательно по строчно после каждого нажатия ентер, ну или хотя...

Вывод содержимого текстового файла на экран
Прграмно подготавливаю документ (rtf) в директории на диске (не verual dir а физический путь). Как вывести его на экран в браузере?

Вывод матрицы из текстового файла на экран
Добрый вечер. Пришел с не большой проблемой. Записываю в файл матрицу Procedure enter(var fl:text;var m:mas;var n:integer); var...

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

Вывод на экран данные из текстового файла
Создайте текстовый файл целых чисел (значения вводятся с клавиатуры). Проанализировав в программе созданный файл, создайте еще 2 файла: ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
Взаимодействие Python с REST API
py-thonny 27.03.2025
REST API - это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Python располагает функциональным набором инструментов для работы с REST API и основная библиотека для. . .
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru