Dos fn 09h выдать строку на дисплей


Содержание

Dos fn 09h: выдать строку на дисплей

DOS INT 21h — DOS Function Codes

The follow abridged list of DOS interrupts has been extracted from a large list compiled by Ralf Brown. These are available on any Simtel mirror (e.g. sunsite.anu.edu.au) under the directory ms-dos/info/interNNp.zip

AH Description AH Description
01 Read character from STDIN 02 Write character to STDOUT
05 Write character to printer 06 Console Input/Output
07 Direct char read (STDIN), no echo 08 Char read from STDIN, no echo
09 Write string to STDOUT 0A Buffered input
0B Get STDIN status 0C Flush buffer for STDIN
0D Disk reset 0E Select default drive
19 Get current default drive 25 Set interrupt vector
2A Get system date 2B Set system date
2C Get system time 2D Set system time
2E Set verify flag 30 Get DOS version
35 Get Interrupt vector
36 Get free disk space 39 Create subdirectory
3A Remove subdirectory 3B Set working directory
3C Create file 3D Open file
3E Close file 3F Read file
40 Write file 41 Delete file
42 Seek file 43 Get/Set file attributes
47 Get current directory 4C Exit program
4D Get return code 54 Get verify flag
56 Rename file 57 Get/Set file date

AH = 01h — READ CHARACTER FROM STANDARD INPUT, WITH ECHO

Return: AL = character read

  • ^C/^Break are checked
  • ^P toggles the DOS-internal echo-to-printer flag
  • ^Z is not interpreted, thus not causing an EOF if input is redirected character is echoed to standard output

AH = 02h -WRITE CHARACTER TO STANDARD OUTPUT

Entry: DL = character to write

Return: AL = last character output

  • ^C/^Break are checked
  • the last character output will be the character in DL unless DL=09h on entry, in which case AL=20h as tabs are expanded to blanks
  • if standard output is redirected to a file, no error checks (write- protected, full media, etc.) are performed

AH = 05h — WRITE CHARACTER TO PRINTER

Entry: DL = character to print

  • keyboard checked for ^C/^Break
  • STDPRN is usually the first parallel port, but may be redirected under DOS 2+
  • if the printer is busy, this function will wait

SeeAlso: INT 17/AH=00h

AH = 06h — DIRECT CONSOLE OUTPUT

Entry: DL = character (except FFh)

Return: AL = character output

Notes: does not check ^C/^Break

AH = 06h — DIRECT CONSOLE INPUT

Entry: AH = 06h DL = FFh

  • ZF set if no character available and AL = 00h
  • ZF clear if character available AL = character read

  • ^C/^Break are NOT checked
  • if the returned character is 00h, the user pressed a key with an extended keycode, which will be returned by the next call of this function
  • although the return of AL=00h when no characters are available is not documented, some programs rely on this behavior

AH=07h — DIRECT CHARACTER INPUT, WITHOUT ECHO

Return: AL = character read from standard input

Notes: does not check ^C/^Break

AH = 08h — CHARACTER INPUT WITHOUT ECHO

Return: AL = character read from standard input

Notes: ^C/^Break are checked

AH = 09h — WRITE STRING TO STANDARD OUTPUT

Entry: DS:DX -> ‘$’-terminated string

Notes: ^C/^Break are checked

AH = 0Ah — BUFFERED INPUT

Return: buffer filled with user input

  • ^C/^Break are checked
  • reads from standard input

Format of DOS input buffer:

Offset Size Description
00 1 maximum characters buffer can hold
01 1 number of chars from last input which may be recalled OR number of characters actually read, excluding CR
02 n actual characters read, including the final carriage return

AH=0Bh — GET STDIN STATUS

  • AL = 00h if no character available
  • AL = FFh if character is available

Notes: ^C/^Break are checked

AH = 0Ch — FLUSH BUFFER AND READ STANDARD INPUT

  • AL = STDIN input function to execute after flushing buffer
  • other registers as appropriate for the input function

Return: as appropriate for the specified input function

Note: if AL is not one of 01h,06h,07h,08h, or 0Ah, the buffer is flushed but no input is attempted

AH = 0Dh — DISK RESET

Notes: This function writes all modified disk buffers to disk, but does not update the directory information

AH = 0Eh — SELECT DEFAULT DRIVE

Entry: DL = new default drive (0=A:, 1=B:, etc)

Return: AL = number of potentially valid drive letters

Notes: the return value is the highest drive present

AH = 19h — GET CURRENT DEFAULT DRIVE

Return: AL = drive (0=A:, 1=B:, etc)

AH = 25h — SET INTERRUPT VECTOR

  • AL = interrupt number
  • DS:DX -> new interrupt handler

Notes: this function is preferred over direct modification of the interrupt vector table

AH = 2Ah — GET SYSTEM DATE

Return: CX = year (1980-2099) DH = month DL = day AL = day of week (00h=Sunday)

AH = 2Bh — SET SYSTEM DATE

Entry: CX = year (1980-2099) DH = month DL = day

  • AL = 00 successful
  • FFh invalid date, system date unchanged

Note: DOS 3.3+ also sets CMOS clock

AH = 2Ch — GET SYSTEM TIME

Return: CH = hour CL = minute DH = second DL = 1/100 seconds

Note: on most systems, the resolution of the system clock is about 5/100sec, so returned times generally do not increment by 1 on some systems, DL may always return 00h

AH = 2Dh — SET SYSTEM TIME

Entry: CH = hour CL = minute DH = second DL = 1/100 seconds

  • AL = 00h successful
  • FFh if invalid time, system time unchanged

Note: DOS 3.3+ also sets CMOS clock

AH = 2Eh — SET VERIFY FLAG

Entry: AL = new state of verify flag (00 off, 01h o)

  • default state at system boot is OFF
  • when ON, all disk writes are verified provided the device driver supports read-after-write verification

AH=30h — GET DOS VERSION

Entry: AL = what to return in BH (00h OEM number, 01h version flag)

Entry: AL = interrupt number

Return: ES:BX -> current interrupt handler

AH = 36h — GET FREE DISK SPACE

Entry: DL = drive number (0=default, 1=A:, etc)


    AX = FFFFh if inval >Notes:

  • free space on drive in bytes is AX * BX * CX
  • total space on drive in bytes is AX * CX * DX
  • «lost clusters» are cons instead

AH = 39h — «MKDIR» — CREATE SUBDIRECTORY

Entry: DS:DX -> ASCIZ pathname

  • CF clear if successful AX destroyed
  • CF set on error AX = error code (03h,05h)

  • all directories in the given path except the last must exist
  • fails if the parent directory is the root and is full
  • DOS 2.x-3.3 allow the creation of a directory sufficiently deep that it is not possible to make that directory the current directory because the path would exceed 64 characters

AH = 3Ah — «RMDIR» — REMOVE SUBDIRECTORY

Entry: DS:DX -> ASCIZ pathname of directory to be removed

  • CF clear if successful, AX destroyed
  • CF set on error AX = error code (03h,05h,06h,10h)

Notes: directory must be empty (contain only ‘.’ and ‘..’ entries)

AH = 3Bh — «CHDIR» — SET CURRENT DIRECTORY

Entry: DS:DX -> ASCIZ pathname to become current directory (max 64 bytes)

  • CF clear if successful, AX destroyed
  • CF set on error AX = error code (03h)

Notes: if new directory name includes a drive letter, the default drive is not changed, only the current directory on that drive

SeeAlso: AH=47h,AH=71h,INT 2F/AX=1105h

AH = 3Ch — «CREAT» — CREATE OR TRUNCATE FILE

  • CF clear if successful, AX = file handle
  • CF set on error AX = error code (03h,04h,05h)

Notes: if a file with the given name exists, it is truncated to zero length

AH = 3Dh — «OPEN» — OPEN EXISTING FILE


  • AL = access and sharing modes
  • DS:DX -> ASCIZ filename

  • CF clear if successful, AX = file handle
  • CF set on error AX = error code (01h,02h,03h,04h,05h,0Ch,56h)

  • file pointer is set to start of file
  • file handles which are inherited from a parent also inherit sharing and access restrictions
  • files may be opened even if given the hidden or system attributes

AH = 3Eh — «CLOSE» — CLOSE FILE

Entry: BX = file handle

  • CF clear if successful, AX destroyed
  • CF set on error, AX = error code (06h)

Note: if the file was written to, any pending disk writes are performed, the time and date stamps are set to the current time, and the directory entry is updated

AH = 3Fh — «READ» — READ FROM FILE OR DEVICE

  • BX = file handle
  • CX = number of bytes to read
  • DS:DX -> buffer for data

  • CF clear if successful — AX = number of bytes actually read (0 if at EOF before call)
  • CF set on error AX = error code (05h,06h)

  • data is read beginning at current file position, and the file position is updated after a successful read
  • the returned AX may be smaller than the request in CX if a partial read occurred
  • if reading from CON, read stops at first CR

AH=40h — «WRITE» — WRITE TO FILE OR DEVICE

  • BX = file handle
  • CX = number of bytes to write
  • DS:DX -> data to write

  • CF clear if successful -AX = number of bytes actually written
  • CF set on error — AX = error code (05h,06h)

  • DS:DX -> ASCIZ filename (no wildcards, but see notes)
  • CL = attribute mask for deletion (server call only, see notes)

  • CF clear if successful, AX destroyed (DOS 3.3) AL seems to be drive of deleted file
  • CF set on error AX = error code (02h,03h,05h)

  • (DOS 3.1+) wildcards are allowed if invoked via AX=5D00h, in which case the filespec must be canonical (as returned by AH=60h), and only files matching the attribute mask in CL are deleted
  • DOS does not erase the file’s data; it merely becomes inaccessible because the FAT chain for the file is cleared
  • deleting a file which is currently open may lead to filesystem corruption.

AH=42h — «LSEEK» — SET CURRENT FILE POSITION

  • AL = origin of move 00h start of file 01h current file position 02h end of file
  • BX = file handle
  • CX:DX = offset from origin of new file position

  • CF clear if successful, DX:AX = new file position in bytes from start of file
  • CF set on error, AX = error code (01h,06h)

  • for origins 01h and 02h, the pointer may be positioned before the start of the file; no error is returned in that case, but subsequent attempts at I/O will produce errors
  • if the new position is beyond the current end of file, the file will be extended by the next write (see AH=40h)

AH=43 — GET FILE ATTRIBUTES

  • CF clear if successful CX = file attributes
  • CF set on error, AX = error code (01h,02h,03h,05h)

BUG: Windows for Workgroups returns error code 05h (access denied) instead of error code 02h (file not found) when attempting to get the attributes of a nonexistent file.

AH=43 — «CHMOD» — SET FILE ATTRIBUTES

  • CF clear if successful, AX destroyed
  • CF set on error, AX = error code (01h,02h,03h,05h)

  • will not change volume label or directory attribute bits, but will change the other attribute bits of a directory
  • MS-DOS 4.01 reportedly closes the file if it is currently open

SeeAlso: AX=4300h,AX=4311h,AX=7143h,INT 2F/AX=110Eh

Bitfields for file attributes:

Bits 7 6 5 4 3 2 1
Description shareable archive directory vol. label system hidden read-only

AH = 47h — «CWD» — GET CURRENT DIRECTORY

  • DL = drive number (00h = default, 01h = A:, etc)
  • DS:SI -> 64-byte buffer for ASCIZ pathname

  • CF clear if successful
  • CF set on error, AX = error code (0Fh)

  • the returned path does not include a drive or the initial backslash
  • many Microsoft products for Windows rely on AX being 0100h on success

AH = 4Ch — «EXIT» — TERMINATE WITH RETURN CODE

Entry: AL = return code

Return: never returns

Notes: unless the process is its own parent, all open files are closed and all memory belonging to the process is freed

AH = 4Dh — GET RETURN CODE (ERRORLEVEL)


    AH = termination type (00=normal, 01h control-C abort, 02h=critical error abort, 03h terminate and stay res >Notes:

  • the word in which DOS stores the return code is cleared after being read by this function, so the return code can only be retrieved once
  • COMMAND.COM stores the return code of the last external command it executed as ERRORLEVEL

AH = 54h — GET VERIFY FLAG

Return: AL = verify flag (00h=off, 01h=on, i.e. all disk writes verified after writing)

AH = 56h — «RENAME» — RENAME FILE

  • DS:DX -> ASCIZ filename of existing file (no wildcards, but see below)
  • ES:DI -> ASCIZ new filename (no wildcards)
  • CL = attribute mask (server call only, see below)

  • CF clear if successful
  • CF set on error, AX= error code (02h,03h,05h,11h)

  • allows move between directories on same logical volume
  • this function does not set the archive attribute
  • open files should not be renamed
  • (DOS 3.0+) allows renaming of directories

AH = 57h — GET FILE’S LAST-WRITTEN DATE AND TIME

  • AL = 00h (Get attribute)
  • BX = file handle

  • CF clear if successful, CX = file’s time DX = file’s date
  • CF set on error, AX = error code (01h,06h)

Bitfields for file time:

Bits 15-11 10-5 4-0
Description hours minutes seconds

Bitfields for file date:

Bits 15-9 8-5 4-0
Description year (1980-) month day

AH = 57h — SET FILE’S LAST-WRITTEN DATE AND TIME

  • CF clear if successful
  • CF set on error AX = error code (01h,06h)

Dos fn 09h: выдать строку на дисплей

Способы вывода на экран

Вывод информации в ассемблерных программах осуществляется обычно при помощи сервисных функций DOS (прерывание 21h). Процесс вывода состоит в следующем:

— определенные регистры микропроцессора загружаются выводимой информацией;

— в регистр AH заносится номер используемой для операции вывода функции;

Ниже представлен перечень функций прерывания 21h, использующихся для вывода информации.
Функция 02h
Вывод на дисплей.
Вход: AH=02h
DL=выводимый символ
Выход: нет
Описание: Посылает символ из DL на стандартный вывод. Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции.
Функция 05h
Вывод на принтер.
Вход: AH=05h
DL= символ, записываемый на стандартный принтер
Выход: нет
Описание: Посылает символ в DL на стандартное устройство принтера, обычно LPT1. Команда DOS MODE может перенаправить этот вывод в последовательный порт.
Функция 09h
Выдать строку.
Вход: AH=09h
DS:DX=адрес строки, заканчивающейся символом ‘$’ (ASCII 24H)
Выход: нет
Описание: Строка, исключая завершающий ее символ ‘$’, посылается на стандартный вывод. Символы Backspace обрабатываются как в функции 02h. Обычно, чтобы перейти на новую строку, включают в текст пару CR/LF (ASCII 13H и ASCII 0aH). Строки, содержащие ‘$’, можно выдать через 40h (BX=0), которая посылает символ в DL на стандартное устройство принтера, обычно LPT1.

Кроме этого прерывания есть еще функции BIOS которые вызываются прерыванием 10h
Функция 02h
Вход. AH=02h
BH = видео страница
DH,DL = строка, колонка (считая от 0)
Выход. Нет
Описание. Устанавливает курсор в позицию DH,DL. Установка кур-сора на строку 25 делает курсор невидимым.
Функция 09h
Писать символ/атрибут в текущей позиции курсора.
Вход. AH=09h
BH = номер видео страницы
AL = записываемый символ
CX = счетчик (сколько экземпляров символа записать)
BL = видео атрибут (текст) или цвет (графика)
Выход. Нет
Описание. Выводит на экран в текущую позицию курсора символ с заданным атрибутом.
Функция 0ah
Писать символ в текущей позиции курсора.
Вход. AH=0ah
BH = номер видео страницы
AL = записываемый символ
CX = счетчик (сколько экземпляров символа записать)
Выход. Нет
Описание. Выводит на экран в текущую позицию курсора заданный символ.
Функция 13h
Вывод строки.
Вход. AH=13h
ES:BP – выводимая строка
CX = длина строки (подсчитываются только символы)
DH,DL = позиция (строка, колонка) начала вывода
BH = номер страницы
AL = код подфункции:
0=атрибут в BL; курсор без изменения
1=атрибут в BL; курсор – в конец строки
2=формат строки: char,attr. ; курсор без изменения
3=формат строки: char,attr. ; курсор – в конец строки
Выход. Нет
Описание. Выдает строку в позиции курсора. Символы 0dH (CarRet), 0aH (LineFeed), 08H (backspace) и 07H (Beep) трактуются как ко-манды управления и не высвечиваются.
Некоторые функции прерывания 10h используют для вывода атрибут символа. Для адаптеров цветной графики в текстовом режиме атрибут оп-ределен следующим образом:
7 6 5 4 3 2 1 0
fgB background brt foreground
foreground – цвет переднего плана (от 0 до 0fH)
brt – интенсивность: 1=передний план яркий
background – фоновый цвет (от 0 до 7)
fgB – мерцание: 1=передний план мерцает
Вычислить значение атрибута можно, используя следующее выраже-ние:
(фон * 16) + передний план + (128 для мерцания)
Видеоадаптер поддерживает следующие цвета:

С учётом рассмотренной ранее теории примеры программ разобрать для вас будет не трудно!
Создайте файл prcom.asm следующего содержания (можно без коментариев):
;устанавливаем модель памяти для com программы
.model tiny
;описываем сегмент кода
.code
;смещение обязательное для COM программ
org 100h
;стартовая метка
start:
;в dx смещение строки
mov dx,offset message
;номер функции DOS
mov ah,09h
;вызываем прерывание DOS для вывода на экран
int 21h
;завершаем com программу
ret
;описываем данные (прямо в сегменте кода)
message db ‘This string is out. ‘,0Ah,0Dh,’$’
;метка конца программы
end start

Для компиляции с помошью пакета TASM воспользуйтесь командами (замените пути к каталогу bin своими):
c:\specprog\tasm\bin\tasm.exe prcom.asm
c:\specprog\tasm\bin\tlink.exe prcom.obj /t/x
В случае masm используйте (тут посложнее!):
ml /c prcom.asm
link prcom.obj,,NULL.
exe2bin prcom.exe prcom.com

Здесь я уже не стану приводить подробнх коментариев:
;модель памяти для EXE программ
.model small
.code
start:
;загружаем явно сегм. регистр DS
mov ax,DGROUP
mov ds,ax
;выводим сообщение
mov dx,offset message
mov ah,09h
int 21h
;выводим символ
mov dl,’!’
mov ah,02h
int 21h
;теперь явно завершаем программу
mov ax,4C00h
int 21h
;описываем сегмент данных — отдельно от кода
.data
message db ‘This symbol is out:’,0Ah,0Dh,’$’
end start

Цель настоящей работы — освоение приемов обработки сим­вольной информации, функций DOS для ввода с клавиатуры и вывода на терминал

Цель настоящей работы – освоение приемов обработки сим­вольной информации, функций DOS для ввода с клавиатуры и вывода на терминал.

2.1. Программные прерывания и системные вызовы

Операционная система MS-DOS предоставляет программисту, работающему на языке ассемблера, большой набор подпрограмм, выполняющих различные полезные действия. Все эти подпро­граммы оформлены как подпрограммы обработки прерываний, и для каждой подпрограммы в руководстве по MS-DOS указан но­мер соответствующего ей прерывания. Для вызова системной под­программы следует использовать команду программного прерыва­ния int. Сокращенно принято сами системные подпрограммы на­зывать «прерываниями», хотя это не очень правильно. Некоторые прерывания относятся к ROM BIOS (подсистеме управления вво­дом/выводом, находящейся в ПЗУ), другие прерывания обслужи­ваются подпрограммами MS-DOS, загружаемыми в ОЗУ. Особую роль играет прерывание с номером 21h. В зависимости от значе­ния, содержащегося при вызове прерывания в регистре AH, MS-DOS выполняет при этом одну из нескольких десятков подпро­грамм, которые принято называть функциями DOS.

Для каждого прерывания и каждой функции DOS в руково­дстве описан набор входных и выходных параметров, передавае­мых через регистры, а также перечень возможных ошибок.

В данной работе будут описаны прерывания и функции DOS, относящиеся к работе с клавиатурой и экраном ПЭВМ.

2.2. Функции DOS для ввода с клавиатуры

Функция 01h (т. е. прерывание 21h при значении AH=01h) вы­полняет ввод с клавиатуры одного символа. Если в момент вызова функции в буфере клавиатуры были символы (т. е. были нажатия клавиш до этого), то берется символ из буфера, в противном слу­чае система ждет, пока не будет нажата клавиша. Код введенного символа помещается в регистр AL. Введенный символ отобража­ется на экране (как говорят, выполняется эхо-отображение).

Например, пусть на клавиатуре была нажата клавиша «F». Тогда после вызова:

mov ah,01h
int 21h

в регистре AL будет содержаться число 46h, которое является кодом буквы F в коде ASCII.

Функция 01h проверяет также, не нажимал ли пользователь в ходе работы программы комбинацию клавиш Ctrl+C (или Ctrl+Break).

В этом случае управление передается на подпрограмму обра­ботки Ctrl+C, которая обычно прекращает выполнение программы пользователя.

Если на клавиатуре была нажата одна из клавиш, которым не соответствует никакой код ASCII (будем называть такие клавиши несимвольными; к ним относятся, например, Home, Ins, Page Up, F1, F10, стрелка) или комбинация из клавиши Alt, Ctrl, Shift с дру­гой клавишей, то функция 01h возвращает в регистре AL значение 0. В этих случаях следует еще раз вызвать ту же функцию, тогда будет выдан так называемый расширенный код данной клавиши или комбинации, согласно специальной таблице расширенных кодов.

Функция 08h работает аналогично 01h, за исключением того, что не выполняется эхо-отображение введенного символа.

Функция 07h работает аналогично 01h, за исключением того, что не выполняется эхо-отображение и не проверяется нажатие Ctrl+C.

Функция 06h может выполнять как ввод с клавиатуры, так и вывод на экран. Если в момент вызова регистр DL содержит зна­чение 0FFh, то данная функция выполняет ввод без ожидания. Это означает следующее. Если буфер клавиатуры содержит какие-либо символы (т. е. клавиши ранее нажимались), то флаг нуля ZF сбра­сывается в 0, а символ из буфера заносится в AL. Если же буфер пуст (нажатий не было), то устанавливается ZF=1, при этом значе­ние в AL не играет роли. Таким образом, эта функция не ждет, пока будет нажата клавиша, а сразу выдает какой-то результат.

Функция 06h не выполняет эхо-отображения и не проверяет нажатие Ctrl+C.

Функция 0Bh не выполняет ввод символа, а только проверяет, есть ли символы в буфере. Если есть, то устанавливается AL=0ffh, если нет, то – AL=00h. Выполняется также проверка на Ctrl+C.

Функция 0Ah выполняет буферизованный ввод строки с кла­виатуры. При этом символы вводятся один за другим, как при многократном применении функции 01h до тех пор, пока не будет введен код 0Dh (код клавиши Enter), завершающий строку. В ходе ввода строки пользователь может редактировать строку и, в част­ности, использовать забой. При вводе выполняется также про­верка на Ctrl+C.


При вызове функции 0Ah требуется, чтобы в регистре DX содер­жался адрес (в сегменте данных) области памяти (буфера), в кото­рую система поместит введенную строку. В первом байте этого буфера должна быть записана его длина, т. е. максимальное число символов (включая 0Dh), которое можно записать в буфер. Эта длина должна быть, по крайней мере, на 2 меньше, чем число зарезервированных байтов. После окончания ввода строки функ­ция помещает во второй байт буфера действительное число вве­денных символов (не считая 0Dh), а начиная с третьего байта буфера, раз­мещаются введенные символы. Последним всегда будет код 0Dh.

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

BUFFER db 11 ;Первый байт буфера
ENTERED db (?) ;Число введенных символов
STRING db 11 dup (?) ;Введенные символы

Сам же ввод выполняется командами:

lea DX, BUFFER ;Адрес буфера — в DX
mov AH,0Ah ;Номер функции — в AH
int 21h ;Вызов функции

Пусть при этом пользователь набрал 6 символов: «Hallo!» и нажал клавишу Enter. После вызова функции в байте entered будет число 6, в первых 6 байтах массива STRING будут коды введенных символов, в седьмом байте – код 0Dh, а оставшиеся 4 байта будут иметь неопределенные значения.

Функция 0Ch вначале очищает буфер клавиатуры (т. е. «забывает» предыдущие нажатия клавиш), а потом выполняет любую из функций 01h, 06h, 07h, 08h или 0Ah. Номер этой функ­ции задается в регистре AL. Если задано иное число, то выполня­ется только очистка буфера. Кроме того, всегда выполняется проверка на Ctrl+C.

2.3. Функции DOS для вывода на экран

Имеются две функции для вывода на экран: одна функция для вывода одного символа, а другая – для вывода строки символов.

Функция 02h выдает в текущую позицию экрана символ, код которого содержится в регистре DL. Известно, что для машин типа IBM PC почти каждому из 256 возможных кодов соответствует какое-то графическое изображение, однако при выводе по функ­ции 02h некоторые коды не выдаются на экран, а служат управ­ляющими. В частности:

    0Dh (CR) – перевод курсора в начало текущей строки; 0Ah (LF) – перевод курсора вниз на 1 строку; 08h (BS) – перевод курсора влево на 1 позицию; 07h (BEL) – звонок.

Функция 09h выдает, начиная с текущей позиции экрана, строку символов, адрес начала которой (в сегменте данных) содержится в регистре DX. Строка может содержать управляющие символы (CR, LF и т. п.) и, таким образом, на экране занимать несколько строк.

Концом выдаваемой строки служит символ «$» (код 24h).

Например. Чтобы вывести на экран с новой строки текст: «Привет! Вот как надо выдавать текст на экран!» – и затем пере­вести курсор в следующую строку, следует в сегменте данных описать строку:

PRIVET db 0Dh,0Ah
db «Привет! Вот как надо выдавать текст на экран!»
db 0Dh,0Ah,»$»

а в сегменте команд записать команды:

lea DX, PRIVET ; Адрес строки — в DX
mov AH,09h ; Номер функции — в AH
int 21h ; Вызов функции

3. ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ

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

AskCont db 0Ah,0Dh

db ‘Завершить работу — Esc, продолжить — ЛЮБАЯ КЛАВИША’

Ask db 0Ah,0Dh,’Введите строку:’,’$’

COUNT db 10 dup( ? ) ; счетчики количества цифр

CIFR db ‘0123456789ABCDEF’ ; таблица преобразования

; шестн.цифр для вывода

INPSTR db 80, ?, 82 dup( ? ) ; буфер ввода

OUTSTR db 0Dh,0Ah, ?, ‘ ‘, ?, ?, ‘$’ ; буфер вывода

lea BX, INPSTR+2 ;адрес начала введенной строки

mov CL, INPSTR+1 ;кол-во введенных символов строки

mov AL, [BX] ;очередной символ строки

cmp AL, ‘0’ ;код символа меньше, чем код нуля ?

jb NC ;да, т.е. не цифра

cmp AL, ‘9’ ;код символа больше, чем код девятки ?

ja NC ;да, т.е. не цифра

;символ — десятичная цифра

sub AL, ‘0’ ;получаем дв. значение цифры, т.е.

mov SI, AX ; индекс в массиве счетчиков COUNT

inc COUNT[SI] ;увеличиваем соответств. счетчик

NC: inc BX ;получить очередной символ строки

«Assembler IBM PC 7. Лабораторная работа № 2. Системные функции dos ввода-вывода информации. Обработка строковых переменных»

7.1. ЦЕЛЕВЫЕ УСТАНОВКИ

· Освоение стандартных способов ввода-вывода DOS.

· Разработка программ по обработке символьной информации с использованием строковых команд.

7.2. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ

7.2.1. ВЫЗОВЫ ФУНКЦИЙ MS-DOS ДЛЯ ВВОДА-ВЫВОДА СИМВОЛЬНОЙ ИНФОРМАЦИИ

Для того чтобы написать простую, но законченную программу, необходимо знать три вещи – как вводить данные, как выводить результат и как остановить выполнение программы. В языках высокого уровня имеются специальные операторы ввода/вывода, которые позволяют в удобной форме реализовать эти функции. В системе команд процессора ix86 также имеются команды ввода/вывода, но они реализуют эти операции на самом низком, физическом уровне, т.е. обеспечивают обращение к портам ввода/вывода по конкретным адресам. Для обеспечения ввода/вывода информации на этом уровне программист должен знать номера портов каждого устройства, а также протоколы или алгоритмы обслуживания этих устройств. Операционная система MS DOS реализует ряд сервисных функций ввода/вывода на логическом уровне, которые выступают как пронумерованные функции прерывания Int 21h. При этом прикладная программа пользователя должна сообщить необходимые для данной функции параметры и передать управление DOS, которая и осуществит все необходимые операции по управлению устройством на физическом уровне (где-то, возможно, обратится за помощью к BIOS), а затем вернёт управление прикладной задаче, сообщив, успешно ли завершилась операция или же была допущена ошибка.

Прерывания, в основном, можно разделить на два основных типа: аппаратные (hardware) и программные (software interrupt). Аппаратные прерывания вызываются сигналами от периферийных устройств, требующими обслуживания процессором, а программные, через посредство команды Int, вызывающей какую-либо сервисую функцию (процедуру) DOS или BIOS. Перечень функций, выполняемых операционной системой DOS, подробно изложен в п. 3.

Упрощенная схема обработки прерывания изображена на рис. 2.1. Процессор выполняет команду прерывания, используя таблицу векторов, где содержатся все адресные указатели обработчиков (аппаратных и программных) прерываний. Действия процессора при переходе на выполнение подпрограммы-обработчика (инициируемое командой Int n) и последующем возврате обратно (при встрече команды Iret) в точку выхода из основной программы показаны на рис. 2.1 цифрами в кружках. Одно и то же прерывание может выполнять несколько различных функций, код которых помещается в регистрah, а дополнительные параметры заносятся в другие регистры РОН. Возвращаемая обработчиком информация содержится в регистре al или ax, если флаг cf=0. Флаг cf устанавливается в 1, если произошла какая-либо ошибка, код которой заносится в регистр ax (так называемый код возврата ошибки). Возможные коды ошибок приводятся в руководствах по DOS [4, 10, 12].

Рис. 2.1. Упрощенная схема обработки программного прерывания Int n

Функции информационного обмена MS DOS в своём развитии изменялись от специализированных программ обмена для каждого типа устройства на основе блока управления файлами FCB (File ControlBlock) до унификации обмена на основе файловой системы через дескрипторы. Дескриптор или логический номер файла идентифицирует файл или устройство, с которым должна работать прикладная программа. Это упрощает программирование операций ввода/вывода, т.к. позволяет осуществлять обмен информации независимо от природы файла (устройства). Существует пять стандартных дескрипторов файлов, которые предоставляются прикладной программе:

· – стандартный ввод с консоли (обычно клавиатура);

· 1 – стандартный вывод на консоль (обычно экран дисплея);

· 2 – устройство вывода ошибок (всегда дисплей);

· 3 – внешнее устройство обмена AUX (асинхронный адаптер COM1);

· 4 – стандартный принтер (первый параллельный порт LPT1).

Стандартный ввод (как и стандартный вывод) можно перенаправить средствами DOS на любое устройство или в файл, а стандартная ошибка всегда связана с экраном (обычно дескриптор 2 используют для вывода диагностических сообщений). Перенаправление ввода или вывода программы осуществляет командный процессор Command.com. Если, допустим, в программе prog предусмотрен ввод данных через дескриптор стандартного ввода ²0², а вывод данных через дескриптор вывода ²1², то при обычном запуске программы командой prog.exe программа будет требовать входные данные с клавиатуры и выводить результаты своей работы на экран. Если, однако, при запуске программы использовать символ перенаправления

то система сама создаст файл file.txt, и весь вывод программы будет записан в этот файл. Ввод по-прежнему будет осуществляться с клавиатуры. Запуск программы командой

заставит программу выполняться в режиме ввода информации из файла file.dat и вывода в файл file.txt. Ни экран, ни клавиатура использоваться не будут. Сама программа ничего не знает об этих перенаправлениях – она во всех случаях обращается к стандартному устройству ввода данных и к стандартному устройству вывода данных. Просто DOS как бы подставляет ей на входе и выходе другие устройства.

7.2.2. ВВОД С КЛАВИАТУРЫ СИМВОЛЬНОЙ ИНФОРМАЦИИ

7.2.2.1. Буфер ввода данных с клавиатуры

Нажатие любой клавиши клавиатуры вызывает сигнал аппаратного прерывания (прерывания с типом 09h), заставляющий процессор прервать исполняемую программу и перейти на подпрограмму обработки прерывания от клавиатуры. Обработчик прерывания формирует двухбайтовый код с последующей засылкой его в кольцевой буфер ввода данных с клавиатуры, располагающийся по адресу 0040h:001Eh в системной области оперативной памяти. Для алфавитно-цифровых клавиш старший байт этого кода представляет scan-код клавиши (условный номер клавиши на клавиатуре), а младший – ASCII-код клавиши, т.е. 8-битовый код закреплённого за этой клавишей символа.

Заполнение буфера клавиатуры, рассчитанного на 15 слов или ударов по клавишам, происходит по мере нажатия клавиш и не связано с выполнением текущей программы. Если программе требуется ввести с клавиатуры определённый символ (или строку), она с помощью соответствующей системной функции DOS обращается к буферу ввода и, при наличии в нём данных, передаёт первый из поступивших в этот буфер символов в программу. Дело в том, что запись и считывание кодовых слов в буфер клавиатуры соответствует принципу FIFO (first in – first out, первым вошёл – первым вышел), поэтому считывание символа из буфера освобождает место для ввода последующих. Если к моменту вызова функции DOS буфер ввода оказывается пуст, DOS будет непрерывно опрашивать его состояние, ожидая появления в буфере очередного кода, а исполнение программы приостанавливается до нажатия клавиши.

7.2.2.2. Системные функции DOS ввода данных с клавиатуры

DOS предоставляет несколько способов ввода данных с клавиатуры [4, 5, 7, 11, 12, 13, 14]:

¨ использование группы функций Int 21h (01h, 06h, 07h, 08h, 0Ah¸0Ch), обеспечивающих посимвольный ввод с клавиатуры в разных режимах;

¨ обращение к клавиатуре, как к файлу, с помощью функции 3Fh.

Функции DOS, осуществляющие ввод с клавиатуры, различаются друг от друга некоторыми другими важными характеристиками, которые приведены в табл. 2.1.

Сравнительная характеристика функций DOS ввода с клавиатуры

Номер функции DOS

01h

06h

07h

08h

0Ah

0Bh

Ch

Реакция на Ctrl+C

Ожидание нажатия клавиши

Ввод расширенных кодов ASCII

Ввод кодов с помощью Alt/цифра

Эхо-символы. Отображение вводимого символа на экране.

Реакция на Ctrl+C. Аварийное завершение программы (ASCII-код 03h). Вызывается обработчик прерывания Int 23h, завершающий текущую программу с выходом в DOS.

Ожидание нажатия клавиши. Функция, при отсутствии символа в кольцевом буфере ожидает его ввода. Функции, обладающие этим свойством, являются синхронными, иначе – асинхронными.

Ввод расширенных кодов ASCII. Все функции DOS, считывающие данные с клавиатуры, передают в программу только ASCII-код (младший байт кодового слова клавиши), оставляя scan-код (старший байт) без внимания. Правда, это относится только к алфавитно-цифровым клавишам, т. е. клавишам, за которыми закреплены отображаемые на экране символы (94 символа со значениями ASCII-кода от 32 до 126). Особенности считывания информационных кодов с других, так называемых функциональных и управляющих клавиш, будут рассмотрены дальше в разделе ²Расширенные коды ASCII².

Очистка буфера. Процесс считывания кодов с буфера ввода может дать непредсказуемый эффект, если перед вызовом функции DOS этот буфер не был пуст. Программа, не желающая вводить набранные досрочно коды, должна очистить клавиатурный буфер с помощью специальной функции Ch прерывания 21h (при al = 0).

Ввод кодов с помощью комбинации Alt/цифра. Позволяет вводить в программу коды символов второй половины ASCII-таблицы, с использованием цифровой клавиатуры (правая часть консоли).

¨ Функция 01h. Ввод одиночного символа с эхом.

Вводит символ из стандартного устройства ввода и отображает его на устройстве стандартного вывода. Ввод каждого символа сопровождается перемещением курсора вправо на следующую позицию. При отсутствии символа ждёт ввода. При наборе строки обрабатываются управляющие клавиши: BS (шаг назад без удаления символа, AL = 08h), TAB (табуляция, AL = 09h), ENTER (переход на начало текущей строки, AL = 13h). Допустимо перенаправление ввода. Если ввод не перенаправлен, выполняет обработку . Для чтения расширенного кода ASCII требует повторного выполнения функции.

¨ Функция 06h. Ввод одиночных символов из стандартного устройства ввода и вывод одиночных символов на стандартное устройство вывода.

Режим работы определяется содержанием регистра DL в момент вызова функции: DL = FF – режим ввода, DL = <FFh – 00h > – режим вывода соответствующего этому коду символа. В режиме вывода коды ASCII: 07h – звонок, Dh – возврат каретки, Ah – перевод строки, рассматриваются как управляющие и выполняются соответствующие им действия.

Если вводимый символ в устройстве ввода присутствует, то он помещается в AL (без эха) с установкой флага ZF = 0, иначе ZF = 1. Отличительным качеством функции 06h является то обстоятельство, что она, просматривая устройство ввода, не останавливает программы (является асинхронной), если не обнаруживает в нём символа, а просто устанавливает флаг ZF = 1. Допускает перенаправление ввода-вывода. Для чтения расширенного кода ASCII требуется повторное выполнение функции.

Вызов: AH =06h, Int 21h.

ZF = 1 – устройство ввода пустое.

Вывод: DL = FE¸00. Код в регистре DL является одновременно и кодом выводимого символа.

¨ Функция 07h. Нефильтрованный ввод символа без эха.

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

¨ Функция 08h. Ввод символа без эха.

Вводит символ из стандартного устройства ввода. При отсутствии символа ждёт его ввода. Допустимо перенаправление ввода. Для чтения расширенного кода ASCII требует повторное выполнение функции. Если ввод не перенаправлен, чувствительна к (иначе надо предварительно включить режим Break). Как и функция 07h, используется для ввода пароля. Пример использования данной функции будет рассмотрен в одной из программ этой работы.

Вызов: AH = 08h, Int 21h.

Вывод: AL = код символа.

¨ Функция Ah. Буферизованный ввод с клавиатуры.

Вводит строку байт из устройства стандартного ввода в буфер пользователя по адресу DS:DX, с отображением на устройстве стандартного вывода. Допустимо перенаправление ввода. Если ввод не перенаправлен, выполняет отработку (иначе надо предварительно включить режим Break). Функция допускает редактирование данных при их вводе клавишами: Backspace (отмена последнего символа), Exc (отмена всего набранного текста), F5 (запоминает текущую строку как подсказку), F3 (восстанавливает подсказку для ввода). Ввод символов строки заканчивается нажатием клавиши , код которой (0Dh) вводится в качестве последнего символа в отведённый буфер.

Структура буфера (резервируется в сегменте данных): байт 0 – назначаемая пользователем максимальная длина строки (1-254) с учётом символа CR (код Dh), байт 1 – число реально введённых символов без учёта символа CR, байт 2 и далее – строка. В следующем примере приведена процедура In_string ввода строки в буфер, емкостью 50 символов. Она возвращает адрес первого символа строки в регистре DX, а число символов в регистре CX.

Buf DB 50. 50 DUP(?) ;Буфер пользователя

lea dx,[Buf] ;Адрес буфера пользователя

mov ah,0Ah ;Запрос функции 0Ah

int 21h ;Вызов DOS

mov cl,[Buf+1] ;Поместить счётчик символов в cx

add dx,2 ;Сделать dx указателем строки

¨ Функция 0Bh. Проверка состояния ввода.

Проверяет наличие символа в буфере клавиатуры. Допустимо перенаправление ввода. Если ввод не перенаправлен, выполняет отработку . Это даёт возможность организовать с её помощью аварийное завершение программы (нажатием комбинации ) с циклом, состоящим из чисто процессорных команд, включив предварительно в цикл вызов функции Bh.

Возврат: Если символа нет, то AL = 0, если символ ждет, то AL = FFH.

¨ Функция 0Ch. Вызов служебной функции DOS для ввода данных с предварительной очисткой буфера клавиатуры. Допускает переопределение ввода.


Вызов: AH = 0Ch, Int 21h,

AL = номер функции ввода: 01, 07, 08, 0Ah (если AL = 0, то только очистка), DS:DX = адрес буфера, если AL = 0Ah.

Выход: AL = байт входных данных (если при вызове Al = 0Ah, данные помещаются в буфер).

¨ Функция 3Fh. Ввод данных из файла или устройства.

Универсальная функция ввода данных в буфер с указателем DS:DX из источника, определённого дескриптором в регистре BX. Допускает переопределение ввода. В регистре CX указывается число байтов, которое необходимо ввести. Пример использования.

In_Area DB 20 DUP(?)

mov ah,3Fh ;Запрос функции 3Fh

mov bx,00h ;Дескриптор ввода (клавиатуры)

mov cx,20 ;Число пересылаемых байт

lea dx,[In_Area] ;Адрес буфера ввода

int 21h ;Вызов функции DOS

sub cx,2 ;Фактически введено

Команда Int 21h ожидает окончания ввода символов, которое фиксируется нажатием клавиши Enter. После ввода текста и нажатия клавиши Enter в буфер In_Aria автоматически вводятся два управляющих символа: CR (код 0Dh) и LF (код 0Ah). Вследствие данной особенности максимальное число символов и размер буфера ввода должны содержать место для двух дополнительных символов. При успешном завершении операции флаг CF = 0, а в регистре AX устанавливается число байтов, введённых с клавиатуры (плюс два дополнительных символа). Если CF = 1, то в регистре AX содержится возвратный код ошибки. Это либо 5 (отказ в доступе), либо 6 (неверный дескриптор).

К особенностям использования данной функции следует отнести автоматический переход на новую строку по окончании ввода данных.

7.2.3. ФУНКЦИИ DOS ВЫВОДА ДАННЫХ НА ЭКРАН

DOS предоставляет следующие способы вывода данных на экран:

использование функций Int 21h (02h, 06h, 09h), обеспечивающих посимвольный ввод с клавиатуры в разных режимах;

обращение к экрану, как к файлу, с помощью функции 40h.

¨ Функция 02h. Вывод одиночного символа.

Выводит символ, находящийся в регистре DL, на экран, после чего курсор сдвигается на одну позицию вправо. Для вывода строки функцию следует использовать в цикле. Допустимо перенаправление вывода. Выполняет обработку при вводе этой комбинации с клавиатуры перед выводом каждого 64-го символа. Эта функция выводит и управляющие ASCII-символы с кодами 07h, 08h, 09h, 0Ah, 0Dh. Символ с кодом 07h (bell, звонок) вызывает звуковой сигнал, с кодом 08h (backspace, забой) – возвращает курсор на одну позицию влево, с кодом 09h (tab, табуляция) – смещает курсор на одну позицию вправо, кратную 8. Действия управляющих клавиш с кодами Ah и Dh рассматривались ранее.

Вызов: AH = 02h, Int 21h.

Выход: DL = ASCII – код символа,

AL = код последнего записанного символа (кроме случая, когда DL = 09, тогда возвращается значение 20h).

Использование данной функции рассмотрим на примере процедуры перехода на новую строку.

mov ah,2 ;Запрос функции 02h

mov dl,13 ;Возврат каретки

int 21h ;Вызов DOS

mov dl,10 ;перевод строки

int 21h ;Второй вызов DOS

¨ Функция 09h. Вывод строки.

Выводит строку символов на устройство стандартного вывода (используется в системных программах для вывода на экран информационных сообщений). Строка должна заканчиваться символом $ (код24h), который служит признаком конца строки, и сам не выводится. Допустимо перенаправление вывода. В сообщение могут быть включены и управляющие коды (07h, 08h, 09h, 0Ah, 0Dh), которые вызывают соответствующие им действия (см. функцию 02h). Допустимо использование Exc-последовательностей. Функция выполняет обработку при вводе этой комбинации с клавиатуры перед выводом каждого 64-го символа.

lea dx,[Promt] ;Адрес строки Promt: DS:DX

mov ah,09h ;Запрос функции 09h

int 21h ;Вызов DOS

¨ Функция 40h. Вывод данных в файл или в устройство.

Универсальная функция вывода данных из буфера пользователя в сегменте данных в файл или на устройство, дескриптор которого указывается в регистре BX. Дескриптор 1, закреплённый за стандартным устройством вывода, обеспечивает перенаправление вывода. Значение регистра CX определяет число байтов, которые должны быть выведены, а пара регистров DS:DX указывает адрес выводимых данных. Управляющие коды 08h, 0Ah, 0Dh и некоторые другие приводят к выполнению соответствующих им действий. После завершения вывода при CF = 0 регистр AX содержит число действительно выведенных байтов, а при CF =1 – возвратный код ошибки. Как и при использовании функции 3Fh, это коды ошибок 5 или 6. Пример использования.

Out_Area DB 20 DUP(?)

mov ah,40h ;Запрос функции 40h

mov bx,01 ;Дескриптор дисплея

mov cx,20 ;Число пересылаемых байт

lea dx,[Out_Area] ;Адрес буфера для выводимого сообщения

int 21h ;Вызов DOS

7.2.4. РАСШИРЕННЫЕ КОДЫ ASCII И УПРАВЛЕНИЕ ПРОГРАММОЙ С КЛАВИАТУРЫ

Как уже отмечалось в п 7.2.2, рассмотренный процесс считывания ASCII-кодов клавиш клавиатуры с помощью системных функций DOS относится к алфавитно-цифровым клавишам, за которыми закреплены ASCII-таблицей отображаемые символы (буквы, цифры, знаки препинания и др.). Кроме них, на клавиатуре персонального компьютера имеется ряд клавиш, которым не назначены какие-либо отображаемые символы. Это, например, функциональные клавиши . , клавиши управления курсором , , . , , , специальные клавиши , , а также использующие на практике различные сочетания клавиш с , и . В этом случае, в качестве scan-кода клавиши или какой-либо комбинации из них выступает также старший байт кодового слова, но уже при нулевом младшем байте (нулевом коде ASCII). Например, при нажатии клавиши в кольцевой буфер ввода клавиатуры поступает код 3B00h, а клавиши – 4700h.

Двухбайтовые коды клавиш, содержащие на месте кода ASCII – ноль, называются расширенными кодами ASCII. Эти коды (и соответствующие им клавиши) широко используются для управления программами. Для доказательства этого утверждения достаточно указать на популярную оболочку DOS – Norton Commander. Широкое использование в компьютерах интерактивных средств требовало расширение возможностей ввода с клавиатуры управляющей информации, которую программа должна отличать от вводимого текста. Поэтому расширенные коды ASCII генерируются и всеми алфавитно-цифровыми клавишами, если они нажимаются совместно с клавишей . В табл. 2.2 приведены значения расширенных ASCII-кодов для одиночных клавиш.

Расширенные коды для функциональных клавиш

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

Правая часть клавиатуры.

«Num Lock-выкл»

В составе комбинации Alt+

Рассмотренные выше функции DOS, предназначенные для посимвольного ввода данных с клавиатуры, позволяют работать и с расширенными кодами ASCII. Однако программа при этом должна вызывать функцию DOS дважды. Первый вызов всегда возвращает младший байт и, если он равен нулю, то необходимо повторить вызов этой же функции для вывода старшего байта. Это и будет информационный байт расширенного кода ASCII, который можно использовать для управления программой.

Обратим здесь внимание на важный момент! Расширенный код ASCII можно считать, если программа будет настроена на проверку нулевого значения младшего байта для каждого нажатия клавиши. Пример использования функциональных клавиш для управления программой показан в листинге 2.1.

Листинг 2.1. Фрагмент программы, демонстрирующий выполнение альтернативных действий на основе анализа расширенных кодов ASCII

mes1 DB 13,10,’Сообщение $’

mes2 DB 13,10,’Сообщение $’

mes3 DB 13,10,’Сообщение $’

;Ожидаем нажатия клавиши

again: mov ah,08h ;Функция ввода одиночного символа без эха

int 21h ;Первый вызов DOS

cmp al,0 ;Расширенный ASCII код?

mov ah,08h ;Да, введём старший байт

int 21h ;Повторный вызов DOS

cmp al,3B ;Нажата F1?

cmp al,54h ;Нажата ?

cmp al,1Eh ;Нажата ?

jmp again ;Нажато незапланированное

F1: ;Вывод сообщения mes1

Shift_F1: ;Вывод сообщения mes2

Alt_A: ;Вывод сообщения mes3

Exit: ;Завершение программы

7.2.5. СТРОКОВЫЕ КОМАНДЫ. ОБЩАЯ ХАРАКТЕРИСТИКА

Строкой или литералом в языке ассемблера называется последовательность букв, цифр и других символов, заключённых в кавычки или апострофы (двойные кавычки). Следует отметить, что иногда понятие строки трактуется в расширительном смысле, а именно, как последовательность байтов, которые могут либо представлять, либо не представлять ASCII-символы.

Строковые команды, несмотря на синонимичное название со строковыми переменными, предназначены для обработки не только ASCII-строк, но и вообще блоков байтов, одинарных или двойных слов, каждое из которых хранится в памяти в двоичном коде.

Строковые команды представлены в табл. 3.1 и по своему назначению делятся на две группы:

— команды для поиска и сравнения данных (Scas, Cmps).

Любая строковая команда может оперировать как байтами, так и словами, что отражается в мнемокоде команды (например: movsb, movsw, movsd). Все строковые команды, в отличие от других команд процессора ix86, используют для выполнения своих функций одни и те же регистры:

Команды обработки строк

Название команды и её мнемокод

Действие

Тип исполь-зуемого префикса

Влияние на флаги

Lods src – Загрузка Acc из строки

src=byte ds:si Lodsb

src=word ds:si Lodsw

src=dword ds:si Lodsd

_

Stos dst – Сохранение Acc в строке

dst=byte es:di Stosb

dst=word es:di Stosw

dst=dword es:di Stosd

Movs dst,src Пересылка элемента строки

dst=byte es:di, src=byte ds:si Movsb

dst=word es:di, src=word ds:si Movsw

dst=dword es:di, src=dword ds:si Movsd

Scas dst – Поиск элемента в строке

dst=byte es:di Scasb

dst=word es:di Scasw

dst=dword es:di Scasd

Все флаги операции сравнения

Cmps dst, src Сравнение элементов строк

src=byte ds:si, dst=byte es:di Cmpsb

src=word ds:si, dst=word es:di Cmpsw

src=dword ds:si, dst=dword es:di Cmpsd

srcdst .

Все флаги операции сравнения

При этом индексные регистры si(esi) и di(edi) определяют смещения элементов строк в сегментах данных, определяемых регистрами ds и es соответственно. Установите es = ds, если это не противоречит другим условиям реализации программы, что позволит вам не беспокоиться о корректной адресации сегментов памяти. Необходимо помнить, что в строковых инструкциях приёмник – строка es:di(edi) не допускает переопределение, а источник – строка ds:si(esi), допускает переопределение на es:si(esi).

Каждая из строковых команд выполняет операцию только над парой элементов двух строк (или над одним для команд Lods, Stos, Scas) и автоматически настраивается на обработку соседних элементов, обеспечивая продвижение по строке в нужном направлении, а именно:


Здесь величина d определяется согласно правилу:

Тип операнда Флаг направления

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

rep (repeat) – повторять, пока cx ¹ 0;

Префиксы используют регистр CX как счётчик числа циклов (беззнаковое число), которое должно быть записано в CX до начала выполнения строковой команды. Счётчик CX декрементируется на 1 после выполнения строковой команды, но проверяется перед её выполнением. Если CX = 0, то строковая команда не выполняется ни разу. Префиксы repe и repne дополнительно выставляют флаг нуля ZF после выполнения строковой операции.

В листинге 2.2. рассматривается использование строковой команды сравнения cmpsb на примере программы с паролем. Идея простейшей защиты программы от несанкционированного запуска заключается в том, что где-то в программе записывается ключевое слово-пароль, и программа, начав работать, требует ввода этого слова с клавиатуры. Если пользователь ввёл пароль правильно, программа продолжит свою работу, иначе попросит ввести его заново или завершится. Ввод пароля обычно осуществляется функцией DOS, не отображающей вводимые символы на экране (обычно 07h или 08h) и заканчивается нажатием клавиши .

Листинг 2.2. Фрагмент программы с паролем.

password DB ‘camel’ ;Пароль

string DB 80 DUP(?)

promt DB 13,10,’Введите пароль: $’

OK DB 13,10,’Работаем!$’

start: mov ax,@data

begin: mov ah,09h ;Вывод запроса на ввод пароля

mov dx,offset promt ;Адрес запроса

mov bx,0 ;Инициализация индексирования ввода

pass: mov ah,08h ;Функция ввода символа в AL без эха

je compare ;Да, на сравнение

mov [string+bx],al ;Нет, сохраним символ

mov dl,’*’ ;Запишем на экран *

jmp pass ;Повторять

;Сравнение введённого пароля с действительным (сравнение строк)

compare: push ds ;Установить ES на сегмент данных

mov si,offset string ;DS:SI- начало string

mov di,jffset password ;ES:DI- начало password

cld ;DF=0- просмотр вперёд

mov cx,pass_len ;Установить счётчик сравнения

repe cmpsb ;Сравнивать, пока (или повторять

;пока символы двух строк совпадают, но не более CX раз)

jne err ;Строки не равны

Вывод сообщения ОК, подтверждающего правильность пароля

mov dx,offset OK

exit: mov ax,4C00h ;Ввод функции 4С для завершения программы

err: jmp begin ;Повторить ввод пароля

Логика построения программы поясняется подробными комментариями. В программе ввод пароля выполняется в бесконечном цикле, поэтому пользователь, не знающий пароля и запустивший программу, для выхода из неё вынужден будет нажать комбинацию клавиш .

7.3. ЗАДАНИЯ К РАБОТЕ. ПОДГОТОВКА И ВЫПОЛНЕНИЕ

¨ Задания к работе

1) Ввести строку из произвольных ASCII-символов и произвести её сортировку под управлением функциональных клавиш: – по возрастанию; – по убыванию; – завершение программы. Работу программы отобразить на экране.

2) Ввести строку из произвольного числа символов и произвести в ней поиск подстроки SYMBOL. Если подстрока найдена, то её необходимо удалить. Вновь полученную строку вывести на экран. Если подстрока не найдена, вывести сообщение NOT_FOUND. Программу защитить паролем.

3) Ввести строку из произвольного числа символов. Выполнить преобразование символьной строки в её цифровой аналог на основе ASCII-кодов, после чего произвести поиск максимального кода. Работу программы отобразить на экране и защитить паролем.

4) Ввести строку из произвольных ASCII-символов и произвести её сортировку к виду, включающему четыре части разделённые пробелами: цифры, буквы прописные, буквы строчные, все другие символы. Работу программы отобразить на экране и защитить паролем.

5) Ввести строку из нескольких слов, разделённых пробелами. Слова включают в произвольном порядке цифры, строчные и прописные латинские буквы. Отредактированная строка включает слова, начинающиеся с прописной буквы (остальные строчные). Цифры из слов должны быть удалены. Программу защитить паролем.

6) Ввести строку из произвольных ASCII-символов и выполнить с ней преобразования, задаваемые нажатием функциональных клавиш: изменение порядка следования символов исходной строки на обратный, – замена строчной буквы на прописную и обратно, завершение программы.

7) Ввести строку из произвольного числа символов и произвести в ней поиск подстроки COMPUTER. Если такой подстроки нет, то данную подстроку ввести в начало исходной строки и вывести на экран. В противном случае дать сообщение There is. Программу защитить паролем.

8) Добавление и удаление элементов из неупорядоченного массива. Элементы последовательно один за другим вводятся с клавиатуры. При этом, если такой элемент отсутствует в массиве (первоначально он пуст), то он вводится в конец списка, в противном случае, он удаляется из него, а оставшиеся элементы сдвигаются влево (в сторону младших адресов) на одну позицию. Список элементов постоянно отображается на экране. Выход из программы осуществляется с помощью клавиши .

9) Ввести строку из произвольного числа символов. Выполнить преобразование символьной строки в её цифровой аналог на основе ASCII-кодов, после чего произвести поиск минимального кода. Работу программы отобразить на экране и защитить паролем.

10) Ввод с клавиатуры на экран произвольного текста с одновременной записью в буфер. Реализовать элементы редактирования: стирание последних символов клавишей Backspace, контроль над прописной буквой первого слова нового предложения (ввести признак начала предложения). При ошибке строчная буква заменяется прописной. Переход на новую строку осуществляется клавишей . Управление: – вывод копии отредактированного текста из буфера, – выход из программы.

11) Ввод с клавиатуры на экран произвольного текста с одновременной записью в буфер. Программа демонстрирует переход на новую строку одним из двух способов:

– нажатие клавиши , если последнее введённое слово пересекло границу в 40 символов. В этом случае на новую строку автоматически переносится всё последнее слово. После перехода на новую строку вывод текста может быть продолжен в обычном порядке. Выход из программы с помощью клавиши .

12) Ввести строку из произвольного числа символов и произвести в ней поиск подстроки AUTOMATON. Если такой подстроки нет, то в начало исходной строки поместить символ @, а в её конец дописать подстроку и вывести на экран. В противном случае дать сообщение There is. Программу защитить паролем.

13) Программа проверки работоспособности ОЗУ для заданной области памяти данных с использованием шахматного теста. Тест предусматривает запись в ячейки с чётными адресами числа 0AAh, а в нечётные – 55h. В результате последующего считывания осуществляется проверка записанной информации. При обнаружении сбоя запоминается адрес данной ячейки (для проверки выполнения последнего требования использовать прогон программы в отладчике TD).

14) Программа проверки работоспособности ОЗУ для заданной области памяти с использованием сканирующего теста. Тест предусматривает запись байта 00h с последующим считыванием и проверкой, затем те же действия выполняются с числом 0FFh. По результатам теста формируется массив из адресов ячеек, в которых обнаружен сбой (для проверки выполнения последнего требования использовать прогон программы в отладчике TD). Программу оформить как com-файл.

15) Разработать программу, преобразующую все символы введённой строки (в строке представлены произвольные алфавитно-цифровые символы) из нижнего регистра клавиатуры в верхний.

¨ Подготовка и выполнение:

a) ознакомиться с методическими рекомендациями к лабораторной работе и соответствующими тематическими разделами в рекомендуемой литературе;

б) разработать и отладить программу в соответствии с индивидуальным заданием;

в) программа, по возможности, должна обеспечивать удобный экранный интерфейс с пользователем при её демонстрации;

г) отчёт о выплненной работе представляет собой:

– индивидуальное задание на разработку программы;

– листинг программы с подробными комментариями и описанием её работы.

7.4. КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Что такое дескриптор? Сколько дескрипторов определено в DOS и как ими пользоваться?

2. Какие функции DOS можно использовать для ввода символов с клавиатуры в регистр AL процессора?

3. Назовите функции DOS, осуществляющие ввод строки символов с клавиатуры в память данных.

4. Какие функции DOS осуществляют операцию вывода на экран:

– одиночных символов из регистра DL процессора;

– строки символов из памяти данных?

5. Напишите процедуру перевода курсора на новую строку с помощью функции 02h DOS.

6. Что такое скан-код клавиши и чем он отличается от расширенного кода ASCII? Как нужно организовать вызовы соответствующей функции DOS для получения расширенного ASCII-кода?

7. Каким сегментным регистрам должен адресоваться сегмент данных, в котором располагается:

8. Какие строковые команды влияют на флаги, а какие нет?

9. Перечислите префиксы повторения строковых команд и их возможные сочетания друг с другом.

10. В какой фазе исполнения команды происходит проверка счётчика на равенство нулю при выполнении:

– строковой команды с префиксом повторения;

– команды управления циклом Loop ?

Что происходит с исполнением этих команд, если счётчик СХ инициализирован нулём?

DOS Fn 40H: писать в файл через описатель

Читайте также:

  1. DOS Fn 28H: писать произвольный блок файла
  2. DOS Fn 45H: Дублировать описатель файла — DUP
  3. IV этап (через 18-24 час от начала исследования)
  4. V этап (через 24-36 час от начала исследования)
  5. Аминокислоты надо переносить через мембраны
  6. Анализ эффективности использования материальных ресурсов через материалоемкость
  7. Безопасный спуск скребка в скважину через лубрикатор
  8. Большая пятерка». Свойства индивидуальности бренда. Черты свойств индивидуальности брендов и их описательные названия (признаки).
  9. В 1905 г. указы, ограничивающие автономию, отменяются, в 1906 г. вводятся всеобщие выборы. Но через несколько лет они все равно уходят от империи.
  10. В мир книг через книгу
  11. В. Розрахунки через Інтернет

Выход

Вход

DOS Fn 3fH: читать файл через описатель

Выход

Вход

DOS Fn 3eH: Закрыть описатель файла

Выход

Вход

DOS Fn 3dH: открыть описатель файла

Выход

Вход

  • AH = 3cH
  • DS:DX = адрес строки ASCIIZ с именем файла
  • CX = атрибут файла
  • AX = код ошибки если CF установлен и описатель файла если ошибки нет

Описание:

DS:DX указывает на строку ASCIIZ в формате: «d:путьимяфайла»,0. если диск и/или путь опущены, они принимаются по умолчанию.

  • файл создается в указанном (или умалчиваемом) оглавлении
  • файл открывается в режиме доступа чтение/запись
  • вы должны созранить описатель (handle) для последующих операций
  • если файл уже существует:
  • при открытии файл усекается до нулевой длины
  • если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут)
  • CONFIG.SYS специфицирует число доступных описателей в системе
  • используйте функцию 5bH создать Новый файл, если вы не хотите перекрывать (усекать) существующий файл.
  • AH = 3dH
  • DS:DX = адрес строки ASCIIZ с именем файла
  • AL = режим открытия
  • AX = код ошибки если CF установлен и описатель файла если нет ошибки.

Описание:

DS:DX указывает на строку ASCIIZ в формате: «d:путьимяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию.

  • файл должен существовать. См. функцию 3cH (создать файл).
  • файл открывается в выбранном режиме доступа / режиме открытия для совместимости с DOS 2.x и избежания сетевых режимов, задавайте:
    • AL = 0 чтобы открыть для чтения
    • AL = 1 чтобы открыть для записи
    • AL = 2 чтобы открыть для чтения и записи
  • указатель чтения/записи устанавливается в 0. См. 42H (LSEEK)
  • вы должны сохранить описатель (handle) для последующих операций
  • разделение файлов должно быть активизировано (команда DOS SHARE), если запрашивается открытие в одном из режимов разделения.

  • CONFIG.SYS специфицирует число доступных описателей файлов.
  • AH = 3eH
  • BX = описатель файла
  • AX = код ошибки если CF установлен

Описание:

BX содержит описатель файла (handle), возвращенный при открытии. файл, представленный этим описателем, закрывается, его буфера сбрасываются, и оглавление обновляется корректными размером, временем и датой.

Из-за нехватки описателей файлов (максимум 20, по умолчанию 8), вам может понадобиться закрыть часть умалчиваемых описателей, как, например, описатель 3 (стандартный AUX).

  • AH = 3fH
  • BX = описатель файла
  • DS:DX = адрес буфера для чтения данных
  • CX = число считываемых байт
  • AX = код ошибки если CF установлен или число действительно прочитанных байт

Описание:

CX байт данных считываются из файла или устройства с описателем, указанным в BX. данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX.

Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Модифицирует указатель чтения/записи файла, подготавливая его к последующим операциям чтения или записи.

Вы должны всегда сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):

  • если AX = CX, (и CF сброшен) — чтение было корректным без ошибок
  • если AX = 0, достигнут конец файла (EOF)
  • если AX

Дата добавления: 2014-01-20 ; Просмотров: 476 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Dos fn 09h: выдать строку на дисплей

Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: нет
Всего: 15

Код
mov ah,009
mov dx,0010D
int 021
mov ah,010
int 016
int 020
; Дальше сразу идет «Privet!$»

С этим кодом все норм — т.е. строка выводится на консоль и ждет клавишу.

Но вот я изменил его.

Код
mov ah,00A
mov dx,00114
int 021
mov ah,009
mov dx,00114
int 021
mov ah,010
int 016
int 020
; Дальше сразу идет «Privet!$»

Я хочу, чтобы я ввел текст, он занимал бы место вот этого «Привета», и тут же выводился вместо него.
Но это почему-то не происходит. Точнее происходит — но если введено больше 1 символа и меньше 5 и причем выводится вместе с какими-то др. символами (непонятно откуда).

Кто знает — поясните, пожалуйста, что тут не так.

Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158

dumb
Дата 7.2.2009, 13:55 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10

Лишние символы оттого, что после ввода строки функцией 0a int 21h ты не ставишь признак конца строки для функции 09 int 21h — ‘$’, а кроме того почитай о формате буфера ввода строки функции 0a int 21h.
Вот пример работы этих функций в паре

ФедосеевПавел
Дата 7.2.2009, 14:05 (ссылка) | (нет голосов) Загрузка .
Код
.MODEL TINY
.CODE
ORG 100h
Main:
jmp @@Start

asCR_LF db 0dh, 0ah, ‘$’

kbMax db 8
kbLen db ?
asStr db ‘Privet!$’

@@Start:
;Печать строки ‘Privet!’
mov ah, 09h
mov dx, offset asStr
int 21h
;Ожидание любой клавиши
mov ah, 10h
int 16h
;Переход к новой строке
mov ah, 09h
mov dx, offset asCR_LF
int 21h

;Ввод строки
mov ah, 0ah
mov dx, offset kbMax
int 21h
;Переход к новой строке
mov ah, 09h
mov dx, offset asCR_LF
int 21h
;добавление в конец строки символа конца для функции 09 int 21h — ‘$’
mov si, offset asStr
mov bx, 0
mov bl, kbLen
mov BYTE PTR [si+bx], ‘$’

;Печать новой строки
mov ah, 09
mov dx, offset asStr
int 21h
;Ожидание любой клавиши
mov ah, 10h
int 16h

mov ax, 4c00h
int 21h
END Main

Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: нет
Всего: 15

I_Am_Rock
Дата 7.2.2009, 14:17 (ссылка) | (нет голосов) Загрузка .
Цитата(ФедосеевПавел @ 7.2.2009, 14:05 )
Привет
Цитата(dumb @ 7.2.2009, 13:55 )
функция 09h вывода строки конец строки определяет по байту со значением 24h(‘$’)

Я в курсе — я ж написал ; Дальше сразу идет «Privet!$» С этим норм.

Цитата(dumb @ 7.2.2009, 13:55 )
функция 0ah ввода строки использует специальный формат данных. (найти пример работы можно найти в соседних темах)
Цитата(ФедосеевПавел @ 7.2.2009, 14:05 )
Вот пример работы этих функций в паре

Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: нет
Всего: 15

Вобщем, я почти разобрался. Только не могу понять одного — как определить размер строки, введенной с помощью 0A int 21h? (с тем, чтоб добавить после строки знак $).

Чтобы лучше понять принцип — программир-ую, редактируя пустой com-файл в HVIEW’е. Как там это сделать?

Это сообщение отредактировал(а) I_Am_Rock — 7.2.2009, 16:38

I_Am_Rock
Дата 7.2.2009, 16:02 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10

ФедосеевПавел
Дата 7.2.2009, 22:46 (ссылка) | (нет голосов) Загрузка .
Цитата
как определить размер строки, введенной с помощью 0A int 21h? (с тем, чтоб добавить после строки знак $).
Код
kbMax db 8 ; максимальная длина вводимой строки
kbLen db ? ; после выполнения прерывания здесь будет реальная длина введенной строки
asStr db ‘Privet!$’ ; место для строки — буфер длиной kbMax плюс один — для символа 0dh

После вызова Fn 0ah int 21h нужно заменить символ 0dh на ‘$’

Код
mov si, offset asStr
mov bx, 0
mov bl, kbLen
mov BYTE PTR [si+bx], ‘$’

Ну а в Hiew’е — сам балуйся

Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: нет
Всего: 15

Спасибо за ответ. Но как программа понимает, что в kbLen находится длина? В представленном тобой коде (большом) есть

I_Am_Rock
Дата 8.2.2009, 01:30 (ссылка) | (нет голосов) Загрузка .
Код
mov bl, kbLen

,т.е. содержимое kbLen записывается в bl. Но я не понимаю — как оно, содержимое, вообще изначально попадает в kbLen? Ведь во всей программе больше нет ни одного упоминания kbLen.

Наверное, для знающего асм это кажется смешным.

Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10

Подпрограмма обработки прерывания (Fn 0ah int 21h) записывает туда значение (одновременно с символами вводимой строкои asStr).

Т.е. вызывая эту функцию, программа передаёт ей в ds:dx адрес структуры, в которой заполнен только один байт — kbMax. После нажатия на Enter, функция заполняет другие поля структуры — kbLen и asStr — и возвращает управление программе. Так программа приобретает введённую с клавиатуры строку и длину этой строки (как в рекламе — купите левый ботинок и правый получите бесплатно).

ФедосеевПавел
Дата 8.2.2009, 02:21 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: нет
Всего: 15

А если я во всех (абсолютно во всех) местах программы kbLen заменю на bkLen, она туда запишит то, что нужно? И как программа догадывается что именно сюда надо записать длину? Почему, например, не наоборот — в kbMax реальную длину, а в kbLen максимальную? А если у меня еще 10 переменных.

Это сообщение отредактировал(а) I_Am_Rock — 8.2.2009, 12:59

I_Am_Rock
Дата 8.2.2009, 12:58 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10

ФедосеевПавел
Дата 8.2.2009, 23:42 (ссылка) | (голосов:1) Загрузка .
Цитата(I_Am_Rock @ 8.2.2009, 12:58 )
А если я во всех (абсолютно во всех) местах программы kbLen заменю на bkLen, она туда запишит то, что нужно? И как программа догадывается что именно сюда надо записать длину? Почему, например, не наоборот — в kbMax реальную длину, а в kbLen максимальную? А если у меня еще 10 переменных.

Прости, мне очень лень набирать ручками справку по функции ДОС из TechHelp’а или любой книги по Assembler’у. Но вкратце, для Fn 0ah требуется передать в ds:dx адрес буфера (структуры) со следующим форматом:
0-й байт — максимально возможная длина строки (1-254),
1-й байт — здесь после выполнения преравания будет находиться реальная длина введённой строки,
2-й байт — начало строки.
Поэтому переменные в программе определяются в строго определённом порядке

Код
kbMax db 8
kbLen db ?
asStr db ‘Privet!$'[/quote]
Код
;Ввод строки
mov ah, 0ah
mov dx, offset kbMax
int 21h
Код
;Печать новой строки
mov ah, 09
mov dx, offset asStr
int 21h

Твоё начальное желание

Цитата(I_Am_Rock @ 7.2.2009, 00:02 )
Я хочу, чтобы я ввел текст, он занимал бы место вот этого «Привета», и тут же выводился вместо него.

неосуществимо, по причине необходимости двух дополнительных байтов kbMax и kbLen.

Пожалуйста, для изучения языка, перейди на нормальные компиляторы TASM или MASM, также можно изучать Assembler, встроенный в компиляторы других языков (Delphi, Pascal, C/C++).
Так ты сможешь избежать неразберихи в адресах переменных.

Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: нет
Всего: 15

I_Am_Rock
Дата 9.2.2009, 14:53 (ссылка) | (нет голосов) Загрузка .
Цитата(ФедосеевПавел @ 8.2.2009, 23:42 )
0-й байт — максимально возможная длина строки (1-254),1-й байт — здесь после выполнения преравания будет находиться реальная длина введённой строки,2-й байт — начало строки.Поэтому переменные в программе определяются в строго определённом порядке

Ааа. Теперь я кажется понял.

Цитата(ФедосеевПавел @ 8.2.2009, 23:42 )
Пожалуйста, для изучения языка, перейди на нормальные компиляторы TASM или MASM, также можно изучать Assembler, встроенный в компиляторы других языков (Delphi, Pascal, C/C++).Так ты сможешь избежать неразберихи в адресах переменных.

У меня MASM. И так-то я в нем уже чуть научился работать — понял как использовать в нем API-функции (я их давно изучил еще на др. языках) и сделал свой калькулятор. Да и дальше в MASM собираюсь учиться. Просто чтобы быстрее понять суть на этом этапе поигрался с чистым ассемблером (где прямо при создании проги я вижу байты которые ввожу и кроме которых ничего не будет).

Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: нет
Всего: 15

Все, написал программку. Спасибо, Павел.

И даже получилось лучше, чем ожидал. Удивила меня одна вещь. Записав строку с помощью Fn 0ah, строка пошла не поверх имеющихся данных, а как бы сместив их вправо. Знак доллара находился на месте для строки, она его отодвинула и получается — строка оканчивается долларом, как и надо. Не ожидал такого «сервиса».

I_Am_Rock
Дата 9.2.2009, 15:25 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10


ФедосеевПавел
Дата 9.2.2009, 21:21 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: нет
Всего: 15

Скриншот в файле. А что именно не понятно?

У меня у самого тут сейчас вопрос возник.((( Я делал этот файл — он находился прямо на диске (т.е. E:\art1.com), скопировал на Рабочий стол — ведет себя по другому, не дает ввести больше 3 символов! Хотя во всем остальном как тот, что на прямо на диске. Вот уже вообще ничего не понимаю. (((

Присоединённый файл ( Кол-во скачиваний: 5 )
proga.rar 8,56 Kb

I_Am_Rock
Дата 9.2.2009, 23:42 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Dos fn 09h: выдать строку на дисплей

В предыдущем разделе мы выполняли с помощью Debug запись в ОП и последующее выполнение всего одной машинной команды, производящей над своими операндами какую-то арифметическую операцию. Теперь пришла пора заняться получением программы, состоящей из нескольких команд. Как и прежде, первая команда программы будет получать управление из Debug. Кроме того, последняя команда нашей программы должна возвращать управление обратно в Debug. В процессе своего выполнения программа будет обращаться за помощью к DOS с целью вывода на экран строки символов. Единственным способом вызова из прикладной программы системных подпрограмм DOS или BIOS является размещение в этой программе машинной команды программного прерывания. Термин «прерывание» означает, что выполнение нашей программы прерывается (приостанавливается) на время, необходимое для выполнения требуемой системной программы. Команда программного прерывания обозначается как int (от «Interrupt» – прерывание). Команда int для функций DOS имеет вид «int 21h«, в машинном коде 21CDh.

4.1. Вывод одного символа

Примером функции DOS, выполнение которой мы можем запросить из программы с помощью команды “ int 21h”, является вывод символа на экран. Для того чтобы различать функции DOS, которых много, используется регистр AH. При выводе одного символа в него помещается 02h. В регистр DL заносится код ASCII выводимого символа. В табл. 3 приведены отображаемые (видимые на экране) коды ASCII.

Таблица 3. Коды ASCII

Допустим, что мы хотим вывести символ А, тогда в регистр DL мы должны поместить число 41h. П о д г о т о в ь т е регистры и память для последующего выполнения команды int 21h”. Для этого в регистры AX и запишем с noмощью Debug числа 0200h и 0041h, а по адресу 0l00h в ОП запишем 21CDh. После этого можно перейти к выполнению машинной команды программного прерывания. Для этого не рекомендуем использовать команду Т Debug. Дело в том, что в результате выполнения int 21” начинает выполняться системная подпрограмма вывода символа, состоящая из многих машинных команд. Пошаговое выполнение этой подпрограммы вам скоро наскучит. Но если вы не доведете его до конца, то ваш компьютер «зависнет».

Но если вы все-таки, протрассируете несколько шагов, можно выйти из Debug с помощью команды Q, которая ликвидирует беспорядок. (При выполнении трассировки обратите внимание на то, что изменилось первое число, являющееся составляющей адреса. Это обусловлено тем, что единственная машинная команда нашей программы и подпрограмма DOS находятся в разных сегментах ОП.)

В этом случае намного удобнее использовать команду Debug G (от «GO«), после которой пишется адрес-смещение, на котором мы хотим остановиться:

АX=0241 BX=0000 CX=0000 DХ=0041 SP=FFEE BP=0000 SI=0000 DI=0000 DS=3970 ES=3970 SS=3970 CS=3970 IP=0102 NV UP DI PL NZ NA PO NC 3970:0102 BBE5 MOV SP,BP

DOS вывел на экран букву A и возвратил затем управление в нашу программу. (Машинная команда, размещенная по адресу 102h, осталась от другой программы, поэтому последняя строка вашего листинга может выглядеть по-другому.)

Dos fn 09h: выдать строку на дисплей

На примере первой программы на ассемблере мы уже познакомились с одним из способов вывода текста на экран — вызовом функции DOS 09h. Это далеко не единственный способ вывода текста — DOS предоставляет для этого несколько функций.

Функция DOS 02h — Записать символ в STDOUT с проверкой на Ctrl-Break

ФедосеевПавел
Дата 10.2.2009, 00:13 (ссылка) | (нет голосов) Загрузка .
Ввод: АН = 02h
DL = ASCII-код символа
Вывод: Никакого, согласно документации, но на самом деле: AL = код последнего записанного символа (равен DL, кроме случая, когда DL = 09h (табуляция), тогда в AL возвращается 20h).

Эта функция при выводе на экран обрабатывает некоторые управляющие символы — вывод символа BEL (07h) приводит к звуковому сигналу, символ BS (08h) приводит к движению курсора влево на одну позицию, символ НТ (09h) заменяется на несколько пробелов, символ LF (0Ah) опускает курсор на одну позицию вниз, и CR (0Dh) приводит к переходу на начало текущей строки.

Если в ходе работы этой функции была нажата комбинация клавиш Ctrl-Break, вызывается прерывание 23h, которое по умолчанию осуществляет выход из программы.

Например, напишем программу, выводящую на экран все ASCII-символы, 16 строк по 16 символов в строке.

Это программа типа СОМ, и компилироваться она должна точно так же, как hello-1.asm в разделе 4.1. Здесь с помощью команды LOOP оформляется цикл, выполняющийся 256 раз (значение регистра СХ в начале цикла). Регистр DL содержит код символа, который равен нулю в начале цикла и увеличивается каждый раз на 1 командой INC DL. Если значение DL сразу после увеличения на 1 кратно 16, оно временно сохраняется в стеке и на экран выводятся символы CR и LF, выполняющие переход на начало новой строки. Проверка выполняется командой TEST DL,0Fh — результат операции AND над DL и 0Fh будет нулем, только если младшие четыре бита DL равны нулю, что и соответствует кратности шестнадцати.

Все функции DOS вывода на экран используют устройство STDOUT, стандартный вывод. Это позволяет перенаправлять вывод программы в файл или на стандартный ввод другой программы. Например, если написать в командной строке

то на экран ничего выдано не будет, а в текущем каталоге появится файл hello-1.out, содержащий строку «Hello World!». Точно так же, если написать

то в файле dosout1.out окажутся все символы ASCII, причем символы BEL и BS не будут интерпретироваться и запишутся в файл как есть. Символы CR и LF тоже запишутся как есть, но так как они отмечают конец строки, редакторы и просмотрщики текстовых файлов будут разрывать первую строку символов.

Функция DOS 06h — Записать символ в STDOUT без проверки на Ctrl-Break

Ввод: АН = 06h
DL = ASCII-код символа (кроме FFh)
Вывод: Никакого, согласно документации, но на самом деле: AL = код записанного символа (копия DL)

Эта функция не обрабатывает управляющие символы (CR, LF, HT и BS выполняют свои функции при выводе на экран, но сохраняются при перенаправлении вывода в файл) и не проверяет нажатие Ctrl-Break. Можно заменить в программе dosoutl.asm команду MOV АН,2 на MOV АН,6 и перекомпилировать этот пример, чтобы получить более полную таблицу символов.

Функция DOS 09h — Записать строку в STDOUT с проверкой на Ctrl-Break

Ввод: АН = 09h
DS:DX = адрес строки, заканчивающейся символом $ (24h)
Вывод: Никакого, согласно документации, но на самом деле: AL = 24h (код последнего символа)

Действие этой функции полностью аналогично действию функции 02h, но выводится не один символ, а целая строка, как в программах hello-1.asm и hello-2.asm.

Функция DOS 40h — Записать в файл или устройство

Ввод: АН = 40h
ВХ = 1 для STDOUT или 2 для STDERR
DS:DX = адрес начала строки
СХ = длина строки
Вывод: CF = 0,
АХ = число записанных байт

Эта функция предназначена для записи в файл, но, если в регистр ВХ поместить число 1, функция 40h будет выводить данные на STDOUT, а если ВХ = 2 — на устройство STDERR. STDERR всегда выводит данные на экран и не перенаправляется в файлы. На этой функции основаны используемые в С функции стандартного вывода — фактически функция С fputs() просто вызывает это прерывание, помещая свой первый аргумент в ВХ, адрес строки (второй аргумент) — в DS:DX и длину — в СХ.

Если скомпилировать эту программу и запустить ее командой

то сообщение появится на экране, а файл dosout2.out окажется пустым.

И наконец, последняя функция DOS вывода на экран — недокументированное прерывание 29h.

INT 29h : Быстрый вывод символа на экран

Ввод: AL = ASCII-код символа

В большинстве случаев INT 29h просто немедленно вызывает функцию BIOS «вывод символа на экран в режиме телетайпа», так что никаких преимуществ, кроме экономии байт при написании как можно более коротких программ, она не имеет.

Прерывание int 10h. Видеофункции BIOS

Дата добавления: 2014-11-27 ; просмотров: 4249 ; Нарушение авторских прав

Функция 00h. Установка видеорежима (таблица 2) текущей видеостраницы с очисткой экрана (быстрая очистка экрана реализуется функцией 06h и 07h).

Al = видеорежим (код режима задаётся в младших 7 битах, установка в 1 старшего бита запрещает очистку экрана).

Вызов разрушает регистры AX, BP, SI, и DI.

Таблица 2 — Текстовые видеорежимы и страницы в стандарте VGA, поддерживаемые

Режим Тип Разрешение Цвет Размер знака Адрес Страницы
text 40×25 полутонов 9×16 B8000 0 – 7
text 40×25 16/8 9×16 B8000 0 – 7
text 80×25 полутонов 9×16 B8000 0 – 7
text 80×25 16/8 9×16 B8000 0 – 7
graphic 640×200 / 80×25 8×8 B8000
text 80×25 3 (Mono) 9×16 B0000
10h graphic 640×350 / 80×25 4 или 16 8×14 A0000 0 – 1
11h graphic 640×480 / 80×30 2 (Mono) 8×16 A0000
12h graphic 640×480 / 80×30 8×16 A0000
13h graphic 640×480 / 80×30 8×8 A0000

По умолчанию в DOS используется режим 3 (впрочем, корректно оформленная программа должна выполнять проверку или установку требуемого текстового режима с последующим восстановлением прежнего).

Функция 02h. Установка позиции курсора.

Задаёт положение курсора на экране в текстовых координатах, с которых в дальнейшем будет выводиться текст. Отсчёт номера строки и столбца ведётся от верхнего левого угла. Курсор можно установить как в текстовом, так и в графическом режиме, однако, в графическом режиме курсор не виден. BIOS поддерживает до восьми независимых курсоров – по одному на каждую страницу (см. табл. 2) независимо от того, какая страница является активной. Функцию 02h BIOS можно использовать в комбинации с функциями DOS для организации вывода на экран.

Вызов: AH = 02h; BH = номер страницы (0,1. 7),обычно 0;

DH = строка; DL = столбец.

Вызов разрушает регистры AX, BP, SI и DI.

Функция 03h. Считывание позиции и размера курсора.

Возвращает текущие координаты состояния курсора на выбранной странице. Это даёт возможность временно перейти для работы на другое место экрана, а затем вернуться на старое место. Функцию 03h BIOS можно использовать в комбинации с функциями DOS для организации вывода на экран.

Вызов: AH = 03h, BH = номер страницы (0,1. 7),обычно 0.

Возврат: DH, DL = строка и столбец текущей позиции курсора,

CH, CL = первая и последняя строки развёртки курсора.

Вызов разрушает регистры AX, BP, SI и DI.

Функция 05h. Установка видеостраницы.

Устанавливает активную видеостраницу (как текстовую, так и графическую).

Вызов: AH= 05h, AL= номер страницы (0. 7).

Вызов разрушает регистры AX, BP, SI и DI.

Программа, устанавливающая страницу, отличную от текущей, обязана по окончании работы восстанавливать исходную.

Функция 06h (07h). Инициализация или прокрутка окна вверх (вниз).

Инициализирует окно с указанными координатами, пробелами ASCII с заданным атрибутом (AL = 0), или прокручивает содержимое окна вверх (вниз) на заданное число строк (AL = число строк). При прокрутке появляющиеся снизу (сверху) строки заполняются пробелами ASCII с заданным атрибутом. Функцию удобно использовать для быстрой очистки экрана или некоторого прямоугольного окна.

Вызов: AH = 06h(07h);

AL = 0 – очистка, AL = N (N >0) – прокрутка на N строк;

BH = атрибут символов в окне;

CH, CL = координаты строки и столбца (Y,X) левого верхнего угла;

DH, DL = координаты строки и столбца (Y,X) правого нижнего угла.

Вызов разрушает регистры AX, BP, SI, и DI.

Функция 08h. Чтение символа и атрибута в текущей позиции курсора на выбранной странице.

Вызов: AH = 08h, BH = номер страницы (0. 7),обычно 0.

Возврат: AH = атрибут символа, AL = ASCII-код символа.

Вызов разрушает регистры BP, SI и DI.

Функция 09h. Запись символа с заданным атрибутом на экран в позицию курсора. Действует как в графическом, так и в текстовом режимах. В графическом режиме символы не должны переходить на следующую строку. Все коды в AL рассматриваются как символьные и не управляют положением курсора. После вывода символа курсор смещается к следующей позиции функцией 02h. Коэффициент повторения позволяет выводить строки одинаковых символов. В текстовом режиме символ выводится с указанным в BL атрибутом. В графическом – содержимое BL влияет только на цвет символа, но не на фон под ним. Графическое изображение под знакоместом затирается.

Вызов: AH =09h, AL = ASCII-код символа,

BL = атрибут символа (текстовый режим) или только цвет символа (графический режим),

BH = номер страницы (0,1. 7), CX = коэффициент повторения.

Вызов разрушает регистры AX, BP, SI и DI.

Функция 0Ah. Запись символа с текущим атрибутом на экран в позицию курсора. Функция действует как в графическом, так и в текстовом режимах. Символ принимает атрибут, установленный ранее для этой позиции. Все ASCII-коды в AL рассматриваются как символьные и не управляют положением курсора (также как и в функции 09h). После вывода символа курсор смещается к следующей позиции функцией 02h.

Вызов: AH = 0Ah, AL = ASCII-код символа,

BH = номер страницы (0,1. 7), CX = коэффициент повторения.

Вызов разрушает регистры AX, BP, SI и DI.

Функция 0Eh. Запись символа с текущим атрибутом в режиме телетайпа.

Записывает символ ASCII в позицию курсора (предварительно установленную функцией 02h) на активной странице и смещает курсор к следующей позиции. Коды ASCII: 07h – звонок (BEL), 08h – шаг назад (BS), 0Dh – возврат каретки (CR), 0Ah – перевод строки (LF), рассматриваются как управляющие и выполняются соответствующие им действия. Остальные управляющие коды рассматриваются как символы и выводятся на экран. Действует автоматический перевод курсора на следующую строку после завершения предыдущей, а также прокрутка экрана вверх на 1 строку после заполнения самой нижней.

Вызов: AH = 0Eh, AL = ASCII-код символа,

BL = цвет символа (только для графического режима),

BH = номер страницы (0,1. 7), по умолчанию действует активная страница.

Функция 0Fh. Получить режим дисплея и номер текущей страницы.

Возврат: AL = режим дисплея, AH = ширина экрана в текстовом формате

BH = номер активной страницы.

Вызов разрушает регистры BP, SI и DI.

Пример.Процедура установки позиции курсора на текущей странице.

Вход: dh = строка (0 – 25), dl = столбец (0 – 79)

. ;Сохранить регистры (по необходимости)

. ;Восстановить регистры

Функция 10h. Подфункция 03h. Переключение бита «мерцание/яркость».

Определяет назначение старшего бита 7 атрибута символа: мерцание символа или повышенная яркость фона.

Вызов: AX = 1003h, BL = назначение 7-го бита атрибута:

0 – повышенная яркость, 1 – мерцание (устанавливается по умолчанию).

Функция воздействует сразу на все символы экрана, у которых установлен старший бит атрибута фона.

Функция 13h. Запись строки символов с заданными атрибутами.

Записывает строку в текущую страницу видеобуфера, начиная с указанной позиции. Коды ASCII: 07h – звонок, 08h – шаг назад, 0Ah – перевод строки,
0Dh – возврат каретки, рассматриваются как управляющие, остальные – как символьные.

Вызов: AH = 13h, AL = режим записи:

0 – атрибут символа в BL, строка содержит только коды символов, после записи курсор принимает исходное положение (т.е. вывод следующей строки, если не изменить позицию курсора, начинается с изначально установленной позиции);

1 – отличается от режима 0 тем, что после записи курсор остаётся в конце строки;

2 – строка содержит попеременно коды символов и атрибутов (т.е. каждый символ описывается 2 байтами – ASCII-кодом и атрибутом), после записи курсор принимает исходное положение;

3 – отличается от режима 2 тем, что по окончании вывода курсор остаётся в конце строки.


BH = номер страницы (0,1. 7), BL = атрибут для режимов 0 и 1,

CX = длина символьной строки (в длину входят только коды символов, но не байты атрибутов),

DX = DH.DL = координаты курсора (строка, столбец) в исходной точке вывода строки на экране,

ES:BP = адрес начала строки в памяти.

Обратите внимание на особенность задания адреса!

Основные команды операционной системы MS DOS

COMMAND.COM содержит следующие три вида команд, представленные в табл. 2.3.

Виды команд в MS DOS

Вид команды Расширение имени Примеры
1. Внутренняя DIR, REN, TYPE и т.д.
2. Внешняя .COM или .EXE lex.com, debug.exe, format.com и др.
3. Пакетная .BAT Файлы, содержащие мно-жества перечисленных выше команд.

Все файлы, содержащие расширение «.COM» или «.EXE«, можно использовать как внешние, при этом допускается имена файлов указывать в сокращенной форме, без расширения «.COM» или «.EXE«.

В операционной системе MS DOS можно выполнить последовательность команд, используя для этого режим пакетной обработки.

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

Каждый пакетный (или командный) файл должен иметь расширение «.BAT«

Пакетный файл можно создать командой COPY или любым текстовым редактором. Каким образом это осуществляется, будет изложено в последующих темах.

Команда смены текущего дисковода

Команда смены текущего (активного) дисковода (устройства, или накопителя) содержит имя требуемого дисковода с последующим двоеточием:

После набора команды должна быть нажата клавиша «Enter».

C>A: Enter

В этом примере дисковод C: (НЖД, или винчестер) сменен на дисковод A: для гибких магнитных дисков.

Ниже представлены основные команды операционной системы MS DOS, которые рассматриваются в данной лабораторной работе.

VER – выводится на экран дисплея номер версии операционной системы, которая загружается при запуске компьютера.

DIR – выводит на дисплей список файлов каталога.

TYPE – выводит на экран дисплея содержимое текстового файла.

TIME – выводит на экран дисплея текущее системное время.

DATE – отображает используемую MS DOS текущую системную дату.

MD (MKDIR) – создает новые каталоги (или подкаталоги).

CD – позволяет сменить текущий каталог.

RD – позволяет удалять подкаталог.

COPY – позволяет копировать файлы или группы файлов.

REN (RENAME) – позволяет переименовывать отдельные файлы или группы файлов.

DEL (ERASE) – позволяет удалять файлы.

TREE – выводит на экран дисплея все каталоги или их иерархическую структуру.

Рассмотрим более подробно каждую из приведенных выше команд.

VER

Тип команды: внутренняя.

Функции: выводится на экран дисплея номер версии операционной системы, которая загружена при запуске компьютера.

На экран выводится сообщение вида

MS-DOS Version 5.00

DIR

Тип команды: внутренняя.

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

Формат использования команды:

/z – комбинация из дополнительных параметров (ключей).

Если не задан дисковод (disk:) или путь (path\), то подразумевается текущий дисковод или текущий каталог. Если не задано имя файла (filename), то выводится все содержимое каталога. При задании имени файла допускается использование шаблона.

В качестве комбинации /z могут использоваться следующие параметры или ключи:

/P – (Pause или Page) приостанавливает вывод списка файлов каждый раз, когда заполняется экран дисплея. После нажатия любой клавиши вывод продолжается;

/W – (Wide Display или Width) обеспечивает вывод в уплотненной форме, т. е. пять имен в одной строке, при этом указываются только имена файлов и каталогов;

/A:атрибуты – выводит только те файлы, которые имеют указанные атрибуты. Возможны следующие сокращения для требуемых атрибутов:

A (archive – архивировать);

R (read-only – защищенный от записи);

Поставив перед каталогом знак минус («-«, черточку), можно изменить значение атрибута на противоположное.

обеспечивает вывод списка всех нескрытых файлов.

Двоеточие («:«) перед перечислением требуемых атрибутов можно опускать.

/O:критерий – (Order) обеспечивает упорядочение выводимого на экран списка файлов в соответствии с заданным критерием. Допускаются следующие сокращения для критериев сортировки:

N – в алфавитном порядке имен (Name);

E – в алфавитном порядке расширений (Extension);

T – по времени создания (Time).

Перед сокращением в каждом случае можно ставить знак минус, чем обеспечивается сортировка по противоположному критерию.

Двоеточие («:«) перед перечислением требуемых критериев можно опускать!

/S – вывод на экран списка файлов не только из указанного каталога, но и из всех подчиненных подкаталогов (Subdirectories):

/B – вывод на экран только имен файлов без дополнительной информации. Для каждого файла используется отдельная строка на экране дисплея;

/L – вывод на экран имен осуществляется строчными буквами.

Параметры (ключи) /A:, /O:, /S, /B и /L реализованы только в версии MS DOS 5.00 и выше. В более ранних версиях использовались ключи /P и /W.

На экран дисплея выводится список имен всех файлов, имеющихся в корневом каталоге диска A:.

При этом отображается следующая информация:

– метка тома (имя носителя данных, если оно задано);

– имя файла с расширением и размер файла или имя подкаталога с пометкой ;

– дата и время последнего изменения файла;

– количество файлов в текущем каталоге;

– размер свободного пространства на дискете.

Выводится список всех файлов, находящихся в каталоге D:\TP и имеющих расширение .PAS.

Выводит список всех файлов текущего каталога дисковода B:. В каждой строке экрана помещается информация для пяти файлов в порядке их следования. Размер файлов, дата и время их создания не указываются.

Выводит список всех файлов текущего каталога дисковода A: с указанием: имен файлов, даты их создания, длины файлов в байтах, размера свободного пространства на диске.

После заполнения экрана будет выведено сообщение:

Strike a key when ready

(Нажмите любую клавишу, когда будете готовы)

Для вывода следующей страницы необходимо нажать любую клавишу.

Выводит список файлов корневого каталога (Root) текущего дисковода (за исключением скрытых файлов).

Выводит список всех файлов с расширением .PAS, которые расположены в каталоге, верхнем (родительском) подкаталоге по отношению к текущему.

Выводится список всех скрытых и не защищенных от записи файлов корневого каталога текущего дисковода.

Выводит на экран только те файлы из каталога DOS диска C:, имена которых начинаются с буквы F и содержат не более пяти символов при любых расширениях.

TYPE

Тип команды: внутренняя.

Назначение: просмотр информации, содержащейся в файле, на экране дисплея.

Если disk: или path\ не указаны, то при выполнении команды будет подразумеваться текущий диск или каталог.

1. Внутри имени файла символы маски (* ?) не допускаются. Для определения имени файла используется команда DIR.

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

3. Вывод на экран можно приостановить нажатием Ctrl+S и продолжить их повторным нажатием (либо нажатием какой-либо клавиши).

Выводит на экран дисплея содержимое текстового файла HS.txt, который находится в подкаталоге MD1 диска A:.

Выводит содержимое текстового файла lex.doc, который находится в текущем каталоге и на текущем диске.

TIME

Тип команды: внутренняя.

Назначение: вывод на экран текущего времени и установка нового времени.

Формат использования команды:

hh – часы (24-часовой цикл), число, состоящее из одной или двух цифр (0-23);

mm – минуты, число, состоящее из одной или двух цифр (0-59);

ss – секунды, число, состоящее из одной или двух цифр (0-59);

cc – сотые доли секунды, число, состоящее из одной или двух цифр (0-99);

a|p – при использовании 12-часового формата времени указывает на то, о каком времени идет речь: о дополуденном (A.M.) или послеполуденном (P.M.).

Если параметр P.M. не задается, то MS DOS считает, что речь идет о дополуденном времени A.M.

Правильными разделителями являются двоеточие («:«) и точка («.»). Возможно использование в качестве разделителей только точки («.»). Если пользователь вводит неправильное время или неверные разделители, то система MS DOS повторяет запрос времени. Иногда в некоторых версиях MS DOS для разделения отдельных элементов вместо двоеточия необходимо использовать другие символы, например, черточку.

На экран будет выведено сообщение:

Current time is 8:12:00.64a

(Текущее время 8:12:00.64a)

Enter new time:_

(Введите новое время:_)

Если время изменяться не будет, то необходимо нажать клавишу Enter. Если необходимо ввести новое время, то следует ввести цифрами текущее время, например:

и нажать клавишу Enter.

Если задание времени произведено неверно или задан неправильный разделитель, то выводится сообщение:

(Введите новое время:)

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

DATE

Тип команды: внутренняя.

Назначение: установка или вывод на экран текущей даты.


Формат использования команды:

mm – число, состоящее из одной или двух цифр 1-12 (обозначающее месяц);

dd – число, состоящее из одной или двух цифр 1-31 (обозначающее день месяца);

yy – число, состоящее из двух цифр 80-99 (обозначающее год 1980-1999, предполагается, что первые две цифры 19) либо число, состоящее из четырех цифр 1980-2099.

Выше представлен американский стандарт формата команды DATE.

Кроме этого, существует европейский ( — — ) и восточноазиатский ( — — ) стандарты.

Вид представления даты определяется установкой кода страны в файле CONFIG.SYS командой COUNTRY, которые в данной работе не рассматриваются.

Разделителями могут служить знаки:

На экране появится сообщение:

Current date is sun 01-26-1994

Enter new date (mm-dd-yy):

(Введите новую дату (mm-dd-yy):)

Если нажать клавишу Enter, то эта дата останется неизменной.

Если же необходимо ввести новую дату, то следует ввести цифрами новую дату, например:

и нажать клавишу Enter.

Если задание времени произведено неверно или задан неправильный разделитель, то выводится сообщение:

Enter new date (mm-dd-yy):

(Введите новую дату (mm-dd-yy):)

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

MD (илиMKDIR)

Тип команды: внутренняя.

Назначение: команда MD (Make Directory) создает новый подкаталог в указанном каталоге.

Формат использования команды:

MD [disk:][path\] dirname

dirname – имя создаваемого каталога.

Каталоги используются для того, чтобы разделить жесткий диск или дискету на более мелкие логические области .

Если не указано имя диска disk:, то подразумевается текущий диск.

Если не указан путь path\, каталог создается в текущем каталоге текущего или указанного диска.

В текущем каталоге создается подкаталог TL1.

В корневом каталоге дискеты A: создается подкаталог DOS.

Создает на дискете A: в каталоге DOS подкаталог BATCH.

CD (илиCHDIR)

Тип команды: внутренняя.

Назначение: (Change Directory – сменить каталог) изменяет текущий каталог, отображает на экране дисплея имя текущего (рабочего) каталога.

Формат использования команды:

disk: – определяет дисковод, для которого необходимо изменить или вывести текущую директорию;

path\ – определяет путь, по которому можно достичь того каталога, в который необходимо перейти.

1. Если указан disk:, то путь path\ задается от корневого каталога заданного диска.

2. Если требуемый каталог находится на текущем диске, то путь может быть задан либо от корневого, либо от текущего каталога.

3. При переходе от текущего каталога в подчиненный достаточно указать его имя.

4. Для перехода в каталог предыдущего уровня (ро­ди­тель­ский каталог) используются символы «..» (две точки).

5. Описание пути к нужному каталогу от корневого каталога начинается с символа «\».

Левая косая черта («\»Backslash), расположенная в начале пути, символически воплощает корневой каталог, для которого не существует собственного имени .

6. Если, находясь в главном (корневом) каталоге Root, выполнить команду

появится сообщение об ошибке:

так как для корневого каталога это невозможно.

Осуществляется переход из текущего каталога в подкаталог TL1. Каталог TL1 становится текущим каталогом.

Выводит имя текущего каталога на текущем диске.

Вывод имени текущего каталога на диске F:, который не является текущим.

Переход в каталог, расположенный на 1 уровень выше, т. е. в родительский каталог.

Переход в корневой каталог текущего дисковода (первая косая черта «\» обозначает корневой каталог).

Переход на дисковод A: в корневой каталог (Root), т.е. активным является корневой каталог дисковода A:.

Переход от текущего корневого каталога диска A: через «дочерний» каталог BOOKS к каталогу-«внуку» FICTION, который и становится текущим.

Переход на два каталога «вверх».

RDилиRMDIR

Тип команды: внутренняя.

Назначение: (Remove Directory) уничтожение (удале-ние) каталога.

Формат использования команды:

RD [disk:][path\] dirname,

disk: – имя дисковода, на котором находится удаляемый каталог;

path\ – путь к удаляемому каталогу;

dirname – имя удаляемого каталога.

Внимание! Удалять можно только пустой каталог, т. е. каталог, не содержащий файлов и подкаталогов (Subdirectories).

1. Если на первом месте в обозначении пути поиска стоит обратная (левая) косая черта (Backslash«\»), то удаляемый каталог надо искать, начиная с корневого.

Если этот символ опущен, то MS DOS будет искать удаляемый каталог, начиная с текущего каталога.

Другими словами, первым способом задается “абсолютный» путь, а вторым – «относительный«.

2. Корневой каталог (Root) нельзя удалить командой RD.

3. Нельзя уничтожить текущий каталог!

Из текущего каталога удаляется подкаталог TEST.

Удаляется подкаталог VS из каталога PROGS диска A:.

COPY

Тип команды: внутренняя.

Назначение: копирует один или несколько файлов на другое дисковое устройство и присваивает скопированному файлу другое имя в том случае, когда это имя задано в команде COPY.

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

При выполнении команды COPY может быть выполнена конкатенация (объединение) файлов.

Команда COPY позволяет также осуществлять передачу данных между любыми системными устройствами.

Форматы использования команды:

COPY pathname1 [switches] [pathname2] [switches]

pathname1 – задает источник копирования: имя файла (или файлов – при этом допускается использование шаблона) или имя каталога, если необходимо скопировать все файлы каталога;

pathname2 – задает назначение копирования (цель). Если pathname2 не задано, то файлы копируются в текущий каталог с сохранением имени.

Если pathname2 – имя каталога, то файлы копируются в указанный каталог также с сохранением имен.

Если pathname2 – имя файла, то источник копируется в файл с указанным именем.

switches – ключи, допускаемые при выполнении команды COPY:

/A –файл обрабатывается как текстовой в кодах ASCII;

/B – файл обрабатывается как двоичный файл;

/V – (Verify – проверить) проверяет, правильно ли записаны данные в целевой файл (назначение).

При копировании допускается использование логических устройств, например, CON – консоль (клавиатура – при вводе, дисплей – при выводе), PRN – принтер (только как выходной файл).

Использование этих устройств будет рассмотрено в последующем материале.

Формат использования команды COPY для конкатенации файлов имеет следующий вид:

COPY pathname1[+pathname2+. ] [pathname]

Источник представляет собой перечень файлов, соединенных знаком «+» (плюс), при этом допускается использование шаблона.

Не следует использовать имена файлов источника (кроме первого имени) в качестве имени файла назначения: это приведет к потере информации.

Если файл назначения не указан, то его имя совпадет с именем первого файла источника.

Примечания к операциям копирования с указанием входных и выходных спецификаций файлов.

1. В команде сначала указывается входная спецификация, затем – выходная.

2. Если не указано имя диска, подразумевается текущий диск (это относится как к диску-источнику, так и к диску-приемнику).

3. Если не указан путь, подразумевается текущий каталог (как на диске-источнике, так и на диске-приемнике).

4. Во входной спецификации допустимо использование шаблонов групповых операций. Если во входной спецификации указан путь, но опущено имя файла вместе с расширением, подразумевается спецификация *.*.

5. В качестве входной или выходной спецификаций допустимо использовать имена устройств.

6. Если в выходной спецификации отсутствует имя файла, выходные файлы принимают имена входных.

7. При копировании с диска на диск файлы рассматриваются как двоичные (т. е. по умолчанию действует ключ /B).

8. При копировании с или на устройство файлы рассматриваются как текстовые (т. е. по умолчанию действует ключ /A).

Примечания к операциям копирования с указанием одной спецификации.

1. Указывается входная спецификация.

2. Выходной спецификацией считается текущий диск или текущий каталог; копируемым файлам даются имена входных.

3. Во входной спецификации либо диск, либо путь, либо то и другое должны отличаться от текущих (файл нельзя копировать «на себя»).

4. Выходная спецификация не может описывать устройство.

5. Копируемые файлы рассматриваются как двоичные (т. е. по умолчанию действует ключ /B).

Примечания к операциям объединения.

1. Символ «,,» (две запятые), вводимый после знака «+», указывает MS DOS, что список входных файлов исчерпан.

2. Объединяемые файлы считаются текстовыми. При объединении двоичных файлов необходимо указывать ключ /B.

COPY TS1.PAS TS2.PAS /V

В текущем каталоге создается копия файла под другим именем (с целью, например, последующей модификации). Копирование сопровождается проверкой правильности записи (ключ /V).

Файл LIB.txt из текущего каталога диска F: копируется на дискету, не имеющую древовидного каталога, либо в текущий каталог дискеты A:.

Файл с дисковода A: копируется на дисковод B: под тем же именем. На компьютере с одним дисководом DOS перед копированием запросит установку дискеты для копии.

F:>COPY \DOSDOC\BOOK\ch1.txt \WORDS\ch2.doc

Копирование файла ch1.txt из каталога \DOSDOC\BOOK в каталог \WORDS с изменением имени на ch2.doc. Оба каталога находятся на текущем диске F:.

Копирование всех файлов с расширением C из текущего каталога диска F: в текущий каталог диска A: под тем же именем.

Копирование всех файлов из текущего каталога диска A: в текущий каталог текущего диска F: под теми же именами.

Входной файл VP.PAS копируется «сам в себя» с изменением даты и времени создания на текущие.

Файл DTA.C копируется в текущий каталог текущего диска. Имя файла назначения (целевого файла) не задано, поэтому в текущем каталоге создается копия этого файла под тем же именем. Если активным будет дисковод A:, будет выдано сообщение:

File cannot be copied onto itself

(Файл не может быть скопирован сам на себя).

Копируются данные, которые вводятся через клавиатуру в файл h1.bat. После ввода этой команды можно набирать текст через клавиатуру. Чтобы записать этот файл в память, необходимо нажать клавишу F6 или одновременно клавиши Ctrl+Z, а вслед за этим – Enter. При этом на экране дисплея появляются символы ^Z, и этот файл записывается на дискету или жесткий диск.

С помощью этой команды текст, набираемый на клавиатуре, будет печататься на принтере, т. е. компьютер превращается в пишущую машинку! После набора текста и нажатия клавиш Ctrl+Z, а затем Enter, весь текст будет отпечатан на принтере.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Как то на паре, один преподаватель сказал, когда лекция заканчивалась — это был конец пары: «Что-то тут концом пахнет». 8377 — | 8007 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Илон Маск рекомендует:  Приложение а пример таблицы стилей для html 4 0
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL