Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 29.08.2021
Сообщений: 43
MASM

DOSBox: создать заполнить и вывести файл

10.01.2025, 11:31. Показов 805. Ответов 1

Студворк — интернет-сервис помощи студентам
Написать и отладить программу, которая выполняет следующие действия:
- создает файл, содержащий 2 строки
- читает содержимое всего файла и выводит его на экран
- выводит на экран заданное количество байт из определенной строки.
11-15 и 6-9
2 строка
Я написал программу, но она вроде выводит 11-15 и 6-9 байт файла, а не второй строки.
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
stdout equ 1
 
cr equ 0Dh   ; Возврат каретки
lf equ 0Ah   ; Перевод строки
text segment 'code'
assume CS:text, DS:data
 
myproc proc
    mov ax, data
    mov ds, ax
 
    ; ---------------------------------
    ; Создать файл
    mov ah, 3Ch           ; Функция создания файла
    mov cx, 0             ; Без атрибутов
    mov dx, offset filename ; Адрес имени файла
    int 21h
    mov handle, ax        ; Сохранить дескриптор
 
    ; Записать первую строку в файл
    mov ah, 40h           ; Функция записи
    mov bx, handle        ; Дескриптор
    mov cx, stringln      ; Длина строки
    mov dx, offset string ; Адрес первой строки
    int 21h
 
    ; Записать вторую строку в файл
    mov ah, 40h           ; Функция записи
    mov bx, handle        ; Дескриптор
    mov cx, string2ln     ; Длина второй строки
    mov dx, offset string2 ; Адрес второй строки
    int 21h
 
    ; Закрыть файл
    mov ah, 3Eh           ; Функция закрытия
    mov bx, handle        ; Дескриптор
    int 21h
 
    ; ---------------------------------
    ; Открыть файл для чтения
    mov ah, 3Dh           ; Функция открытия файла
    mov al, 0             ; Открыть файл для чтения
    mov dx, offset filename ; Адрес имени файла
    int 21h
    mov handle, ax        ; Сохранить дескриптор
 
    ; Прочитать содержимое файла
    mov ah, 3Fh           ; Функция чтения файла
    mov bx, handle        ; Дескриптор
    mov cx, 80            ; Считать не более 80 байт
    mov dx, offset bufin  ; Адрес буфера для чтения
    int 21h
    mov [bytes_read], ax  ; Сохранить количество реально прочитанных байт
 
   
    ; Добавить нулевой байт в конец буфера
    mov bx, offset bufin
    add bx, [bytes_read]  ; Указать конец прочитанных данных
    mov byte ptr [bx], '$'  ; Установить нулевой байт (терминатор строки)
 
    ; Вывести содержимое буфера на экран
    lea dx, bufin         ; Указать адрес буфера
    mov ah, 09h           ; Функция вывода строки на экран
    int 21h
 ; ---------------------------------
; Закрыть файл
    mov ah, 3Eh           ; Функция закрытия
    mov bx, handle        ; Дескриптор
    int 21h 
 
   ; Открыть файл для чтения
    MOV AH, 3Dh
    MOV AL, 0             ; Режим чтения
    LEA DX, filename
    INT 21h
    MOV handle, AX
 
      ; Чтение байтов 11-15 (вторая строка)
    MOV AH, 42h           ; Функция установки указателя
    MOV AL, 0             ; Относительно начала файла
    MOV BX, handle
    MOV CX, 0
    MOV DX, 11            ; Смещение на 11-й байт
    INT 21h
 
    MOV AH, 3Fh           ; Чтение 5 байт (11-15)
    MOV BX, handle
    MOV CX, 5
    LEA DX, buffer_out
    INT 21h
 
    ; Чтение байтов 6-9 (первая строка)
    MOV AH, 42h           ; Установить указатель на 6-й байт
    MOV AL, 0
    MOV BX, handle
    MOV CX, 0
    MOV DX, 6
    INT 21h
 
    MOV AH, 3Fh           ; Чтение 4 байт (6-9)
    MOV BX, handle
    MOV CX, 4
    LEA DX, buffer_out + 5 ; Продолжить запись после байтов 11-15
    INT 21h
 
    ; Завершение строки символом '$' для вывода
    MOV [buffer_out + 9], '$'
 
    ; Вывод объединенных байтов на экран
    LEA DX, buffer_out
    MOV AH, 09h
    INT 21h
 
    ; Закрыть файл
    mov ah, 3Eh           ; Функция закрытия файла
    mov bx, handle        ; Дескриптор
    int 21h
        
    ; Завершение программы
    mov ax, 4C00h
    int 21h
 
myproc endp
 
text ends
 
data segment
    bufin db 80 dup ('0')           ; Буфер для чтения
    bytes_read dw 0                 ; Количество прочитанных байт
    string db '0123456789',  lf    ; Первая строка
    stringln equ $ - string         ; Длина первой строки
    string2 db '987654321',  lf   ; Вторая строка
    string2ln equ $ - string2       ; Длина второй строки
    handle dw ?                     ; Ячейка для дескриптора
    filename db 'MYFILE.TXT', 0     ; Имя файла
    buffer_out db 20 dup ('$')      ; Буфер для вывода фрагментов
data ends
 
stack segment para stack 'STACK'
db 128 dup (?)
stack ends
 
end myproc
Добавлено через 25 минут
Так верно?
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
stdout equ 1
 
cr equ 0Dh   ; Возврат каретки
lf equ 0Ah   ; Перевод строки
text segment 'code'
assume CS:text, DS:data
 
myproc proc
    mov ax, data
    mov ds, ax
 
    ; ---------------------------------
    ; Создать файл
    mov ah, 3Ch           ; Функция создания файла
    mov cx, 0             ; Без атрибутов
    mov dx, offset filename ; Адрес имени файла
    int 21h
    mov handle, ax        ; Сохранить дескриптор
 
    ; Записать первую строку в файл
    mov ah, 40h           ; Функция записи
    mov bx, handle        ; Дескриптор
    mov cx, stringln      ; Длина строки
    mov dx, offset string ; Адрес первой строки
    int 21h
 
    ; Записать вторую строку в файл
    mov ah, 40h           ; Функция записи
    mov bx, handle        ; Дескриптор
    mov cx, string2ln     ; Длина второй строки
    mov dx, offset string2 ; Адрес второй строки
    int 21h
 
    ; Закрыть файл
    mov ah, 3Eh           ; Функция закрытия
    mov bx, handle        ; Дескриптор
    int 21h
 
    ; ---------------------------------
    ; Открыть файл для чтения
    mov ah, 3Dh           ; Функция открытия файла
    mov al, 0             ; Открыть файл для чтения
    mov dx, offset filename ; Адрес имени файла
    int 21h
    mov handle, ax        ; Сохранить дескриптор
 
    ; Прочитать содержимое файла
    mov ah, 3Fh           ; Функция чтения файла
    mov bx, handle        ; Дескриптор
    mov cx, 80            ; Считать не более 80 байт
    mov dx, offset bufin  ; Адрес буфера для чтения
    int 21h
    mov [bytes_read], ax  ; Сохранить количество реально прочитанных байт
 
   
    ; Добавить нулевой байт в конец буфера
    mov bx, offset bufin
    add bx, [bytes_read]  ; Указать конец прочитанных данных
    mov byte ptr [bx], '$'  ; Установить нулевой байт (терминатор строки)
 
    ; Вывести содержимое буфера на экран
    lea dx, bufin         ; Указать адрес буфера
    mov ah, 09h           ; Функция вывода строки на экран
    int 21h
 ; ---------------------------------
; Закрыть файл
    mov ah, 3Eh           ; Функция закрытия
    mov bx, handle        ; Дескриптор
    int 21h 
 
   ; Открыть файл для чтения
    MOV AH, 3Dh
    MOV AL, 0             ; Режим чтения
    LEA DX, filename
    INT 21h
    MOV handle, AX
 
      ; Чтение байтов 11-15 
    MOV AH, 42h           ; Функция установки указателя
    MOV AL, 0             ; Относительно начала файла
    MOV BX, handle
    MOV CX, 0
    MOV DX, 11+stringln          ; Смещение на 11-й байт
    INT 21h
 
    MOV AH, 3Fh           ; Чтение 5 байт (11-15)
    MOV BX, handle
    MOV CX, 5
    LEA DX, buffer_out
    INT 21h
 
    ; Чтение байтов 6-9 
    MOV AH, 42h           ; Установить указатель на 6-й байт
    MOV AL, 0
    MOV BX, handle
    MOV CX, 0
    MOV DX, 6+stringln
    INT 21h
 
    MOV AH, 3Fh           ; Чтение 4 байт (6-9)
    MOV BX, handle
    MOV CX, 4
    LEA DX, buffer_out + 5 ; Продолжить запись после байтов 11-15
    INT 21h
 
    ; Завершение строки символом '$' для вывода
    MOV [buffer_out + 9], '$'
 
    ; Вывод объединенных байтов на экран
    LEA DX, buffer_out
    MOV AH, 09h
    INT 21h
 
    ; Закрыть файл
    mov ah, 3Eh           ; Функция закрытия файла
    mov bx, handle        ; Дескриптор
    int 21h
        
    ; Завершение программы
    mov ax, 4C00h
    int 21h
 
myproc endp
 
text ends
 
data segment
    bufin db 80 dup ('0')           ; Буфер для чтения
    bytes_read dw 0                 ; Количество прочитанных байт
    string db '0123',  lf    ; Первая строка
    stringln equ $ - string         ; Длина первой строки
    string2 db '0123456789012345',  lf   ; Вторая строка
    string2ln equ $ - string2       ; Длина второй строки
    handle dw ?                     ; Ячейка для дескриптора
    filename db 'MYFILE.TXT', 0     ; Имя файла
    buffer_out db 20 dup ('$')      ; Буфер для вывода фрагментов
data ends
 
stack segment para stack 'STACK'
db 128 dup (?)
stack ends
 
end myproc
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.01.2025, 11:31
Ответы с готовыми решениями:

Создать файл F1, заполнить его случайными числами (всего 10 чисел), наибольшее число вывести в файл F2
У меня получилось создать файл и заполнить его случайными 10 числами StreamWriter sw =...

Файлы. Создать и заполнить текстовой файл f. Вывести на экран чётные строки файла
Создать и заполнить текстовой файл f. Вывести на экран чётные строки файла.

Создать и заполнить текстовые файлы\Создать и заполнить файл f1 числами
Создать и заполнить текстовые файлы f и g. Записать в файл h сначала строки файла f, затем - строки файла g с сохранением порядка. ...

1
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
10.01.2025, 16:04
1) При вызове файловых функций надо обязательно проверять флаг ошибки C
т к может быть ошибочное имя файла, защита диска от записи и т д
При этом, например при открытии файла AX возвращает код ошибки, а не дескриптор
файла, что при игнорировании рушит всю дальнейшую работу программы.

2) При получении строки из текстового файла не надо использовать LSeek (AH=42h),
а надо побайтно (последовательно) читать строки и считать (при желании) номера строк.

Вот мой пример, который создаёт файл, а затем читает его и построчно выводит на экран.

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
stdout equ 1
 
cr equ 0Dh   ; Возврат каретки
lf equ 0Ah   ; Перевод строки
buflen = 80
 
stack segment para stack 'STACK'
db 128 dup (?)
stack ends
 
data segment
    bufbyte db ?
    bufin db buflen+1 dup ('0')     ; Буфер для чтения
    bytes_read dw 0                 ; Количество прочитанных байт
    handle dw ?                     ; Ячейка для дескриптора
    filename db 'MYFILE.TXT', 0     ; Имя файла
mytext db "To be, or not to be: that is the question:",cr,lf
       db "Whether 'tis nobler in the mind to suffer",cr,lf
       db "The slings and arrows of outrageous fortune,",cr,lf
       db "Or to take arms against a sea of troubles,",cr,lf
       db "And by opposing end them?",13,10
mylen equ $-(offset mytext)
emess  db "File error!",cr,lf,"$"
data ends
 
text segment 'code'
assume CS:text, DS:data, ES:data
 
; длинный условный переход 
jumpc   macro label
    local m
    jnc m
    jmp label
m:  
    endm
 
; сообщение об ошибке и выход в Дос при ошибке работы с файлом
fileErr:mov dx,offset emess
    mov ah,9
    int 21h
    mov ax,4C01h
    int 21h
 
myproc:
    mov ax, data
    mov ds, ax
    mov es, ax
 
    ; ---------------------------------
    ; Создать файл
    mov ah, 3Ch           ; Функция создания файла
    mov cx, 0             ; Без атрибутов
    mov dx, offset filename ; Адрес имени файла
    int 21h
    jumpc fileErr
    mov handle, ax        ; Сохранить дескриптор
 
    ; Записать текст в файл
    mov ah, 40h           ; Функция записи
    mov bx, handle        ; Дескриптор
    mov cx, mylen         ; Длина строки
    mov dx, offset mytext ; Адрес текста
    int 21h
    jumpc fileErr 
   ; Закрыть файл
    mov ah, 3Eh           ; Функция закрытия
    mov bx, handle        ; Дескриптор
    int 21h
 
    ; ---------------------------------
    ; Открыть файл для чтения
    mov ah, 3Dh           ; Функция открытия файла
    mov al, 0             ; Открыть файл для чтения
    mov dx, offset filename ; Адрес имени файла
    int 21h
    jumpc fileErr 
    mov handle, ax        ; Сохранить дескриптор
 
m0: call readline         ; читать строку
    cmp bytes_read,0      ; конец файла ?
    jz  closefile         ; да - к закрытию
    call printline        ; печать строки на дисплей
    jmp m0
closefile:
; Закрыть файл
    mov ah, 3Eh           ; Функция закрытия
    mov bx, handle        ; Дескриптор
    int 21h 
    ; Завершение программы
    mov ax, 4C00h
    int 21h
 
; читать строку последовательно до байта lf или до конца файла 
readline:mov di,offset bufin
     mov bytes_read,0
rline1:mov dx,offset bufbyte
     mov cx,1 ; читать 1 байт
     mov bx,handle
     mov ah,3Fh
     int 21h
     jumpc  fileErr
     cmp ax,0    ; конец файла ?
     jz  rline2
     cmp bytes_read,buflen ; буфер строки заполнен ?
     jnc rline2
     add bytes_read,1
     mov dl,bufbyte
     mov [di],dl
     inc di
     cmp dl,lf ; символ новой строки ?
     jnz rline1      
rline2:mov byte ptr [di],0 ; установить конец строки
     ret
 
; печать строки на дисплей
printline:mov si,offset bufin
    mov cx,bytes_read
    jcxz print2
print1: mov dl,[si]
    inc si
    mov ah,2
    int 21h
    loop print1
print2: ret
 
text ends
 
end myproc
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.01.2025, 16:04
Помогаю со студенческими работами здесь

создать массив и заполнить его случайными числами 0-10,вывести максимальный и минимальный элемент,и записать их в файл
создать массив и заполнить его случайными числами 0-10,вывести максимальный и минимальный элемент,и записать их в файл

Создать и заполнить файл случайными целыми значениями. Создать новый файл, выполнив сортировку содержимого файла по убыв
Создать и заполнить файл случайными целыми значениями. Создать новый файл, выполнив сортировку содержимого файла по убыванию. ПОМОГИТЕ...

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

Создать файл произвольных символов. Вывести в один файл цифры, содержащиеся в файле, а в другой файл символы, сохранив первоначальный порядок. Вывести
Создать файл произвольных символов. Вывести в один файл цифры, содержащиеся в файле, а в другой файл символы, сохранив первоначальный...

Заполнить файл f целыми числами(рандом). Из файла f получить файл g, исключив повторные вхождения чисел. Вывести файл g
Заполнить файл последовательного доступа f целыми числами, полученными с помощью генератора случайных чисел. Из файла f получить файл g,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru