Консультация № 196349
12.09.2019, 16:21
0.00 руб.
1 25 0
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Здравствуйте! в университете задана была РГР по ассемблеру есть очень объемный код и преподаватель сказал,что нужно его упростить.
задание на РГР: Определять тип символьной строки в текстовом файле
(символы, цифры, смешанная);
код очень объемный т.к. рассмотрены различные виды строк (слишком много) сказал оставить то что в задании и сложно написан по словам преподавателя, не могли бы вы помочь с упрощением?


Прикрепленные файлы:
bd67779bf07b2723833d7ee15b17ab6a00ffe974.docx

Обсуждение

давно
Посетитель
403252
10
12.09.2019, 16:25
общий
12.09.2019, 16:26
[code lang=asm].MODEL small
.CODE
ORG 100H
Begin: ;метка начала программы
jmp Start
filenameMsg db 'Имя файла: '
FileName DB 'string.txt',0,10,13,'$'
charMsg db 'Строка букв',10,13,'$'
binMsg db 'Двоичное число',10,13,'$'
octMsg db 'Восьмеричное число',10,13,'$'
decMsg db 'Десятичное число',10,13,'$'
hexMsg db 'Шестнадцатеричное число',10,13,'$'
mixedMsg db 'Строка состоит из смешанных символов',10,13,'$'
typesHeader db 10,13,'Возможные типы строки:',10,13,'$'
ErrStr DB 'Ошибка работы с файлом. Возможно, файл отсутствует.',10,13,'$'
Header DB 'Расчетно-графическая работа',10,13,'<<Системное программное обеспечение>>',10,13,'Студента группы ИВТ-314',10,13,'Лобова В.А.',10,13,'Вариант 13',10,10,13,'$'
PressContinue DB 'Press any key to continue...',10,10,13,'$'
progSizeMsg db 'Размер программы: '
progSize db ' ',' байт',10,13,'$'
isChar db 1
isBin db 1
isOct db 1
isDec db 1
isHex db 1
isMixed db 1
fileMsg db 'Строка в файле:'
Buffer DB 80 DUP(0)
Start:
;процедура вычисление размера файла
lea dx, EndFile ;загружаем в dx адрес метки на конце файла
mov ax, dx ;копируем в ax
lea dx, Begin ;загружаем в dx адрес метки на начале файла
sub ax,dx ;вычитаем из конца начало, получая размер в байтах в ax

;процедура перевода числа из регистра ax(размера программы) в символьную строку
std ; Устанавливаем ОБРАТНЫЙ порядок записи
lea di,progSize+3 ; ES:DI = последний символ строки progSize
;Начинаем перевод числа AX в строку
mov cx,10 ; Задаемся делителем CX = 10
Repeat:
mov dx,0 ; Обнуляем DX (для деления)
div cx ; Делим DX:AX на CX (10),
;Получаем в AX частное, в DX остаток
xchg ax,dx ; Меняем их местами (нас интересует остаток)
add al,'0' ; Получаем в AL символ десятичной цифры
stosb ; И записываем ее в строку progSize
xchg ax,dx ; Восстанавливаем AX (частное)
cmp ax,0 ; Сравниваем AX с 0
jne Repeat ; Если не ноль, то повторяем
;на этом вывод программы закончен. переходим к самой проге

lea dx,progSizeMsg ;загружаем адрес строки с размером программы
call Show ;функция вывода

lea dx,Header ;загружаем адрес строки заголовка
call Show ;функция вывода
lea dx, filenameMsg ;загружаем адрес строки с именем файла
call Show
lea dx,PressContinue ;адрес строки с сообщением о продолжении
call Show
MOV AH,10H ;ожидание нажатия кнопки
INT 16H

lea dx,FileName ;загружаем в dx адрес с именем файла
call OpenFile ;получаем дескриптор файла через функцию
jnc l ;проверить флаг на ошибку открытия файла(файл отсутствует) ;эта команда и ниже эквивалентны jc Error. Дальности условного перехода jc не хватает, поэтому используем jmp, так как у него дальность больше
jmp Error
l: mov bx,ax ;сохраняем дескриптор файла в bx
lea dx,Buffer ;записываем адрес буфера в dx
mov cx,1 ;сколько байт(символов) читать. Будем читать по одному символу
Read:
mov ah,3fh ;функция считывания из файла
int 21h ;сервис dos
inc dx ;сдвинем адрес записи на ячейку
cmp ax, 0 ;в ax будет 0, если достигнут конец файла
jnc l1 ;Аналогично эта команда и ниже эквивалентны одной команде jc Error. Дальности условного перехода jc не хватает, поэтому используем jmp, так как у него дальность больше
jmp Error ;проверить флаг на ошибку
l1: jne Read ;если не конец файла, читаем дальше
mov si,dx
mov [si],'$'
dec dx
;dec dx

Call CloseFile ;функция закрытие файла

;начинаем обработку
mov ax,dx ;сохраняем конечный адрес полученной строки в ax
lea dx,Buffer ;берем начальный адрес строки
;call Show
sub ax,dx ;Вычитаем из адреса конца строки адрес начала. Тем самым находим размер строки
mov cx,ax ;сохраним размер строки в cx. Будем использовать его как счетчик.

lea dx, fileMsg ;выведем сообщение с содержимымм файла
call Show

mov bx, 0 ;счетчик сдвига по буферу
Process:
mov al, [Buffer + bx] ;копируем из буфера очередной считанный символ
cmp al,'0' ;сравниваем с ascii-кодом 0
jnb l2 ;Аналогично эта команда и ниже эквивалентны одной команде jb Error. Дальности условного перехода jb не хватает, поэтому используем jmp, так как у него дальность больше
jmp Other ;в случае если значение лежит в интервале от начала до символа 0.
l2: cmp al,'1'
jbe Bin ;в случае если значение лежит в интервале от 0 до 1 включительно
cmp al,'7'
jbe Oct ;в случае если значение лежит в интервале от 1 до 7 включительно
cmp al,'9'
jbe Decim ;в случае если значение лежит в интервале от 8 до 9 включительно
cmp al,'A'
jnb l3 ;Аналогично эта команда и ниже эквивалентны одной команде jb Error. Дальности условного перехода jb не хватает, поэтому используем jmp, так как у него дальность больше
jmp Other ;в случае если значение лежит в интервале от до 7 включительно
l3: cmp al,'F'
jbe Hex
cmp al,'Z'
jbe Char
cmp al,'a'
jnb l4 ;Аналогично эта команда и ниже эквивалентны одной команде jb Error. Дальности условного перехода jb не хватает, поэтому используем jmp, так как у него дальность больше
jmp Other
l4: cmp al,'f'
jbe Hex
cmp al,'z'
jbe Char
jmp Other

Char: ;если в строке есть буквы(начиная с g), значит это уже не число
mov [isBin], 0
mov [isOct], 0
mov [isDec], 0
mov [isHex], 0
jmp Lop
Bin: ;двоичное число. если в строке есть цифра, то это уже не строка букв
mov [isChar], 0
jmp Lop
Oct: ;восьмеричное число. если в строке есть цифра больше 1, то это уже не строка букв и не двоичное число.
mov [isBin], 0
mov [isChar], 0
jmp Lop
Decim: ;десятичное число. если в строке есть цифра больше 7, то это уже не строка букв, не двоичное и не восьмеричное число.
mov [isBin], 0
mov [isOct], 0
mov [isChar], 0
jmp Lop
Hex: ;шестнадцатеричное число. если в строке есть цифра больше 9(a-f), то это уже не строка букв, не двоичное, не восьмеричное и не десятичное число.
mov [isBin], 0
mov [isOct], 0
mov [isDec], 0
jmp Lop
Other: ;в случае, если в строке встретилась не буква и не цифра.
mov [isBin], 0
mov [isOct], 0
mov [isDec], 0
mov [isHex], 0
mov [isChar], 0
jmp l5

Lop:
inc bx ;увеличиваем счетчик сдвига по буферу
dec cx ;уменьшаем общий счетчик
cmp cx, 0
je l5
jmp Process

l5: lea dx, typesHeader ;выводим сообщение
call Show

cmp [isChar], 1 ;проверяем, это строка букв?
jne a1 ;если нет, то проверяем сразу следующий флаг
lea dx, charMsg ;если да, выводим собщение об этом
call Show
mov [isMixed], 0 ;значит, это уже строка не смешанных символов

a1: cmp [isBin], 1 ;проверяем, это строка с двичным числом?
jne a2 ;если нет, то проверяем сразу следующий флаг
lea dx, binMsg ;если да, выводим собщение об этом
call Show
mov [isMixed], 0 ;значит, это уже строка не смешанных символов

a2: cmp [isOct], 1 ;проверяем, это строка с восьмеричным числом?
jne a3 ;если нет, то проверяем сразу следующий флаг
lea dx, octMsg ;если да, выводим собщение об этом
call Show
mov [isMixed], 0 ;значит, это уже строка не смешанных символов

a3: cmp [isDec], 1 ;проверяем, это строка с десятичным числом?
jne a4 ;если нет, то проверяем сразу следующий флаг
lea dx, decMsg ;если да, выводим собщение об этом
call Show
mov [isMixed], 0 ;значит, это уже строка не смешанных символов

a4: cmp [isHex], 1 ;проверяем, это строка с шестнадцатеричным числом?
jne a5 ;если нет, то проверяем сразу следующий флаг
lea dx, hexMsg ;если да, выводим собщение об этом
call Show
mov [isMixed], 0

a5: cmp [isMixed],1 ;проверяем, это строка букв?
jne Exit ;если нет, заканчиваем
lea dx, mixedMsg ;значит, это уже строка не смешанных символов
call Show
jmp Exit
a6:
Error:
lea dx, ErrStr ;загружаем в dx адрес строки с сообщением об ошибке
call Show

Exit:
MOV AH,10H ;ожидание нажатия кнопки
INT 16H

mov ah,04Ch ;функция DOS выхода из пpогpаммы
mov al,0h ;код возвpата
int 21h

OpenFile PROC ;Функция открытия файла
mov ah,3dh ;функция открытия файла
mov al,0 ;0 - открыть для чтения 1 - запись 2 - чтение,запись
int 21h ;сервис dos
ret ;возврат
OpenFile ENDP
CloseFile PROC ;функция закрытия файла
mov ah,3eh ;функция закрытия файла
int 21h ;сервис dos
ret
CloseFile ENDP
Show PROC ;функция вывода
mov ah,09 ;функция вывода строки на экран
int 21h ;dos
ret
Show ENDP
EndFile: ;метка на конце программы для вычисления ее размера
End Begin

[/code]
давно
Старший Модератор
31795
6196
13.09.2019, 10:41
общий
Адресаты:

Напишите, свое задание.
Код, предложенный Вами, написан, ну очень плохо.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
13.09.2019, 15:41
общий
Адресаты:
Если на скорую руку и учетом
Цитата: Valeriya
(символы, цифры, смешанная

то так:
[code lang=asm h=300]model tiny
.code
org 100h
begin: lea dx,dbHead
call Show
mov ax,3D02h
lea dx,dbName
int 21h
jnc @@01
aam
or ax,'00'
mov [dwErr],ax
lea dx,dbError
lea bx,Exit
push bx
jmp Show
dbCheck db 0
dbBuff db 1
dwhndl dw ?
@@01: mov dwHndl,ax
xor di,di
@@02: mov ah,3Fh
mov bx,dwHndl
mov cx,1
lea dx,dbBuff
int 21h
or ax,ax
jz @@03
inc di
mov al,[dbBuff]
lea bx,dbType
xlat
mov cl,al
mov al,1
shl al,cl
or [dbCheck],al
jmp @@02
@@03: mov ah,3Eh
mov bx,dwHndl
int 21h
;
lea bx,Exit
push bx
mov al,[dbCheck]
shr al,1
lea dx,dbChar
cmp al,1
jz Show
lea dx,dbNum
cmp al,2
jz Show
lea dx,dbComby
Show proc
mov ah,9
int 21h
ret
Show endp
Exit: lea dx,dbFile
call Show
mov ax,di
call OutNum
lea dx,dbPress
call Show
xor ax,ax
int 16h
ret
Outnum proc
mov bx,10
xor cx,cx
@@on: xor dx,dx
div bx
push dx
inc cx
or ax,ax
jnz @@on
@@ou: pop ax
or al,'0'
int 29h
loop @@ou
ret
outNum endp
dbType db 10h dup(0)
db 10h dup(0)
db 10h dup(0)
db 10 dup(2),6 dup(0)
db 0,15 dup(1)
db 10 dup(1),6 dup(0)
db 0,15 dup(1)
db 10 dup(1),6 dup(0)
dbName db 'String.txt',0
dbHead db 'Расчетно-графическая работа',10,13,'<<Системное программное обеспечение>>',10,13,'Студента группы ИВТ-314',10,13,'Лобова В.А.',10,13,'Вариант 13',10,13,'$'
dbError db 10,13,'dont open file '
dwErr dw ?
db ' $'
dbNum db 10,13,'only numbers$'
dbChar db 10,13,'only simbols$'
dbComby db 10,10,'comby string$'
dbFile db 10,13,'file size:$'
dbPress db 10,13,'Press any key to continue . . .$'
end begin[/code]
Но если:
Цитата: Valeriya
рассмотрены различные виды строк (слишком много)

То код сильно не изменится, только строка dbType, с указаниями типа каждого символа
Прикрепленные файлы:
4ff0bdb70931565f3013f39262a9d5ff.jpg
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403252
10
14.09.2019, 13:31
общий
Вариант 13: Определять тип символьной строки в текстовом файле
(строка букв, десятичное число, 16-ричное число, двоичное число и
т.д.);

здравствуйте! вот задание, но как я упомянула выше нужно учитывать Буквенную,числовую и смешанную строки.

model tiny вот здесь должен быть small
прилагаю доп. условия по программе:
б) Формат программы:
COM - программа;
в) Ввод с клавиатуры:
средствами DOS;
г) Вывод на экран:
в текстовом режиме;
д) Динамическое распределение памяти:
определение размера программы;

давно
Старший Модератор
31795
6196
14.09.2019, 20:26
общий
Адресаты:
Цитата: Valeriya
model tiny вот здесь должен быть small
прилагаю доп. условия по программе:
б) Формат программы: COM - программа;
в) Ввод с клавиатуры:средствами DOS;
г) Вывод на экран:в текстовом режиме;
д) Динамическое распределение памяти:определение размера программы;


Блин, кто Вас учит. Код, который Вы выложили - написан в стиле TINY, но определен как SMALL.


Начинаем переучивать:
Модели памяти и упрощенные директивы определения сегментов
Модели памяти задаются директивой .MODEL
.model модель,язык,модификатор
где модель - одно из следующих слов:
  • TINY - код, данные и стек размещаются в одном и том же сегменте размером до 64 Кб. Эта модель памяти чаще всего используется при написании на ассемблере небольших программ;
  • SMALL - код размещается в одном сегменте, а данные и стек - в другрм (для их описания могут применяться разные сегменты, но объединенные в одну группу). Эту модель памяти также удобно использовать для создания программ на ассемблере;
  • COMPACT - код размещается в одном сегменте, а для хранения данных могут использоваться несколько сегментов, так что для обращения к данным требуется указывать сегмент и смещение (данные дальнего типа);
  • MEDIUM - код размещается в нескольких сегментах, а все данные - в одном, поэтому для доступа к данным используется только смещение, а вызовы подпрограмм применяют команды дальнего вызова процедуры;
  • LARGE и HUGE — и код, и данные могут занимать несколько сегментов;
  • FLAT - то же, что и TINY, но используются 32-битные сегменты, так что максимальный размер сегмента, содержащего и данные, и код, и стек, - 4 Мб.


Единственная модель памяти DOS, которая размещает код, данные, стек в одном сегменте - TINY, FLAT аналогична, но она для WINDOWS, и устроена несколько подругому.
Только в модели TINY нет заголовка программы(его подставляет ОСь), компиляция всех остальных моделей, создает программы, которые начинаются с MZ-header. Если откроете в блокноте(а лучше в редакторе кода, к примеру HIEW, если у Вас его нет обзаведитесь) любую ЕХЕ-программу, Вы увидите подпись:

MZ, для Windows ещё одна подпись PE и адрес где она расположена в испольняемом файле. Если в HIEW смотреть файл СОМ, то там код начинается практически с нулевого байта.

С MZ Header ознакомитесь сами. Обратите внимание на таблицы настройки relocation table, с их помощью программа может получить доступ ко всем используемым сегментам.

Это то что касается
Цитата: Valeriya
Формат программы: COM - программа;

Таки модель TINY.


Цитата: Valeriya
в) Ввод с клавиатуры:средствами DOS;

Все прерывания до 20h - прерывания BIOS, но 16h было исполльзовано Вами в коде.


Цитата: Valeriya
г) Вывод на экран:в текстовом режиме;

Вывод исключительно средствами DOS, int 29h - не документированое сервисное прерывание DOS 1.0, но начиная кажись с DOS 3.0 документирована.

Цитата: Valeriya
д) Динамическое распределение памяти:определение размера программы;

Пример есть в Вашем коде.

Но динамическое распредаление памяти - когда можно попросить у ОСи кусок памяти, использрвать его, потом вернуть обратно ОСи. Вот только при модели TINY, это не возможно. При запуске СОМ-программы, ОСь отдает этой программе ВСЮ память, которая доступна и без танцев с "бубном" тут ничего не сделать.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
14.09.2019, 21:01
общий
Адресаты:
Компилятор какой?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403252
10
15.09.2019, 10:01
общий
компилятор tasm на Windows xp
давно
Старший Модератор
31795
6196
15.09.2019, 15:52
общий
Адресаты:
Цитата: Valeriya
компилятор tasm на Windows xp

Так и знал.
Вы возмутились по поводу "model tiny"
Цитата: Valeriya
model tiny вот здесь должен быть small

, а то, что точки перед model нет, даже не упомянули(masm упадет с ошибкой, tasm - проглатывает). Ну раз у Вас TASM, можно "перелопатить" код до смешного.

Задание правда поставлено не точно, к примеру 1010:
10102=1010=12816, а может это
10108, или 101010, или 101016.
Наличие цифры не говорит, что это число, она может указывать на что угодно, к примеру маркировку груза №ВВВВ1ААА.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
15.09.2019, 15:57
общий
Адресаты:
А ещё один момент(о размере программы), стек программы - является частью программы?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403252
10
17.09.2019, 10:08
общий
Спасибо большое за помощь! Да стек - часть программы.
давно
Старший Модератор
31795
6196
17.09.2019, 13:43
общий
17.09.2019, 13:48
Адресаты:
Цитата: Valeriya
Да стек - часть программы.

При запуске СОМ-программы, ОСь выделяет под неё один сегмент, т.е. 64кБ, но всю свободную память маркирует, как занятую.

[table]
[row][col] 1[/col][col]0000-00FF[/col][col]Префикс программы, подставляется ОСью [/col][/row]
[row][col] 2[/col][col]0100-xxxF [/col][col]Код программы[/col][/row]
[row][col] 3[/col][col]xxxx-yyyF [/col][col]Данные программы[/col][/row]
[row][col] 4[/col][col]yyyy-zzzF [/col][col]Не важно, что именно, может, и код, и данные, и мусор[/col][/row]
[row][col] 5[/col][col]zzzz-FFFF [/col][col]Стек программы[/col][/row]
[/table]
Итого 64кБ, т.е. при любой длине программы на диске ,программа в памяти занимает 64кБ.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403252
10
20.09.2019, 11:22
общий
20.09.2019, 11:40
Здравствуйте ещё раз! А можно вас попросить добавить комментарий к программе, я не понимаю как программа считывает из файла информацию, посимвольно или же по другому используя какие либо метки. Спасибо
давно
Старший Модератор
31795
6196
20.09.2019, 14:21
общий
Адресаты:
Строка читается посимвольно.
Может сегодня или завтра выложу упрощеннуюБ усовершенствованую версию Вашего кода.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403252
10
20.09.2019, 14:37
общий
Спасибо! А как программа определяет что это конец строки?
давно
Старший Модератор
31795
6196
22.09.2019, 17:03
общий
Адресаты:
Блин, не успел.
Код с комментариями:
[code lang=asm h=300]model tiny,pascal
.code
org 100h
.186
stdOut equ 1
;выводим заголовок
begin: call Show,offset dbHead
;открываем файл
mov ax,3D02h
lea dx,dbFile
int 21h
;контролируем ошибку
jnc @@01
;записываем код ошибки
aam
or ax,'00'
xchg al,ah
mov dwErr,ax
;выводим сообщение об ошибке
call Show,offset dbErr
;ждем нажатия любой клавыши
Press proc
uses ax
call Show,offset dbPres
xor ax,ax
int 16h
ret
Press endp
;запоминаем указатель на файл
@@01: mov dwHndl,ax
;читаем строку
@@00: call Readln
;контролируем конец файла
mov al,dbType
or al,al
;если переменная типа равна нулю, значит ничего не обработали, т.е. конец файла
;иначе переходим на чтение новой строки
jnz @@00
;закрываем файл
mov ah,3Eh
mov bx,dwHndl
int 21h
;сообщение о завершении работы
call show,offset dbStop
jmp Press
;подпрограмма вывода сообщения
Show proc a:word
uses ax,dx
mov ah,9
mov dx,a
int 21h
ret
Show endp
;переменная типа строки
dbType db 0
;указатель на файл
dwHndl dw ?
;подпрограмма чтения строки
Readln proc
uses bx,cx,dx,di,si
;обнуляем длину
xor di,di
;сбрасываем маркер типа строки
mov byte ptr dbtype,0
;читаем один символ
@@03: mov ah,3Fh
mov bx,dwHndl
mov cx,1
lea dx,dbBuff+[di]
int 21h
;прочитали 0
or ax,ax
jz @@06;end of file
;загружаем прочитаный символ
mov dl,[dbBuff+di]
;проверяем 13
cmp dl,13
jz @@03
;проверяем 10
cmp dl,10
;если конец строки проверяем строку
jz @@06;end of line
inc di
lea si,dwType
mov cx,7
;устанавливаем тип прочитаного символа
@@04: lodsw
sub al,dl
jns @@05
loop @@04
xor ah,ah
@@05: mov cl,ah
mov al,1
shl al,cl
or dbType,al
jmp @@03
;готовим строку к выводу
@@06: mov byte ptr[dbBuff+di],'$'
mov al,dbType
or al,al
jz @@07
;выводим строку
call Show,offset dbStr
;взависимости от от типа будет выведена нужная строка
mov al,dbType
;создаем индексное смещение
lea bx,dwTable
and ax,06h
add bx,ax
mov bx,[bx]
;выводим результат
call Show,bx
;просим нажать кнопку
call press
@@07: nop
ret
;check data
dwType dw 0020h,0330h,0139h,0341h,024Bh,0361h,027Bh
Readln endp
dbServ db 10,13,'Service code$'
dbDigit db 10,13,'Digital string$'
dbChar db 10,13,'Char string$'
dbComby db 10,13,'Comby snring$'
dwTable dw offset dbServ,offset dbDigit,offset dbChar,offset dbComby
dbFile db 'string.txt',0
dbHead db 10,13,'Расчетно-графическая работа'
db 10,13,'<<Системное программное обеспечение>>'
db 10,13,'Студента группы ИВТ-314 Лобова В.А.'
db 10,13,'Вариант №13'
db 10,10,13
db 10,13,'Размер программы: '
;пусть длину считает компилятор
a0 = szCode mod 10
b0 = szCode / 10
a1 = b0 mod 10
b1 = b0 / 10
a2 = b1 mod 10
b2 = b1 / 10
a3 = b2 mod 10
b3 = b2 / 10
;
db '0'+a3
db '0'+a2
db '0'+a1
db '0'+a0
db ' байт.'
db 10,13
db'$'
dbErr db 10,13,'Error code:'
dwErr dw ?
db '$'
dbpres db 10,13,'Press any key to continue...$'
dbStop db 10,13,'Stop program$'
dbStr db 10,13,'строка в файле:'
szCode equ $-begin
;
dbBuff label byte
end begin[/code]
Компилировать нужно таким BAT-файлом, или набирать команды ручками.
D:\CAT\_Lang\Tasm\tasm.2\tasm /M2 %1
D:\CAT\_Lang\Tasm\tasm.2\tlink %1 /t

ключ /М2 - указывает компилятору, что нужно пару раз пройтись по коду, по умолчанию только один раз. Иначе длину кода нужно подсчитывать в программе самостоятельно.
D:\CAT\_Lang\Tasm\tasm.2\ - это путь к компилятору TASM 2.0(уменя их несколько).
%1 - имя компилируемого файла.
Проверялось на файле
qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM
1234567890
QWERTY12345qwerty

Результат выглядит так:

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403252
10
27.09.2019, 13:13
общий
здравствуйте! так как я уже начала сдавать с тем кодом который был написан ранее, можно я задам вопрос по нему и попрошу его закоментить. так как у преподавателя возникает вопрос : Как программа понимает где конец строки? Что именно является его концом, что и где сравнивается и определяется что это конец. код от 13.09.2019, 15:41
давно
Старший Модератор
31795
6196
27.09.2019, 13:51
общий
Адресаты:
Код, от 13.09.2019 , конец строки не ищет, т.к.
Цитата: Зенченко Константин Николаевич
на скорую руку

правильный код, от 22.09.2019,
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403252
10
27.09.2019, 15:03
общий
А как определяется то ,что знаков в файле больше нет? что обозначает конец считывания символов с файла?
давно
Старший Модератор
31795
6196
27.09.2019, 17:23
общий
Адресаты:
Вход
AH = 3fH
BX = описатель файла
DS:DX = адрес буфера для чтения данных
CX = число считываемых байт
Выход
AX = код ошибки если CF установлен или число действительно прочитанных байт

Если СХ и АХ совпадают, то файл не прочитан до конца, если АХ<СХ, то достигнут конец файла.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403252
10
27.09.2019, 19:12
общий
27.09.2019, 19:28
Преподаватель спрашивает а в файле это как отражается физически, я все пыталась доказать что там так называемая пустота ,как вот это обозначить?

каким образом в AX записывается 0 или 1? Каким образом прога понимает, что в нашем документе есть символ?
давно
Старший Модератор
31795
6196
27.09.2019, 20:22
общий
27.09.2019, 20:22
Адресаты:
Цитата: Зенченко Константин Николаевич
Проверялось на файле
© Цитата:
qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM
1234567890
QWERTY12345qwerty


Последовательность 0D 0A обозначает конец строки, но есть редакторы которые считают концом строки только один код из этих. При загрузке файла память, редакторы выделяют на каждую строку достаточное количество "запасной" памяти, для внесения изменений, при записи эти участки игнорируются, и вместо них ставят маркер 0D 0A.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
27.09.2019, 20:29
общий
Адресаты:
Цитата: Valeriya
каким образом в AX записывается 0 или 1? Каким образом прога понимает, что в нашем документе есть символ?


Цитата: Зенченко Константин Николаевич
Если СХ и АХ совпадают, то файл не прочитан до конца, если АХ<СХ, то достигнут конец файла.

Их ставит фунуция ДОС, как - число действительно прочитанных байт.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403252
10
27.09.2019, 20:33
общий
Это я как то поняла но вопрос преподавателя что в файле обозначает конец поставил меня в ступор
давно
Старший Модератор
31795
6196
27.09.2019, 21:19
общий
Адресаты:
Если функция хочет прочитать 100 байт, а прочитала 50, т.к. больше нету этих байт в файле. Вопрос к Вам, это конец файоа?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
27.09.2019, 21:46
общий
27.09.2019, 21:47
Адресаты:
Цитата: Valeriya
что в файле обозначает конец

Если он хочет услышать, что-то из этого списка

То это было характерно для магнитных лент, сейчас ОСь выделяет под файл клатер(ы), все что там записано, это и есть файл, длина файла с таким именем хранится в другом месте.

Обратите внимание на то, что размер указан дважды, реальный и на диске.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа