Консультация № 188882
03.03.2016, 17:30
0.00 руб.
0 2 1
Здравствуйте! У меня возникли сложности с таким вопросом: какие числа он вычитает в этом фрагменте "$-begin" и что означает $, для чего нужен ноль в "0Ah", для чего нужен ноль в конце этих строк "NAMECATALOG DB '\SP',0
FILENAME DB '\SP\KURS_SP.txt',0", что такое дескриптор ( handle) и чем он отличается от индекса



Приложение:
title RAM (COM)
.MODEL TINY
.CODE
org 100h

begin:

MOV AH,02
MOV BH,00
MOV DH,02
MOV DL,1Eh
INT 10h
MOV AH,09
LEA DX,STRING1
INT 21h

MOV AH,02
MOV BH,00
MOV DH,03
MOV DL,18h
INT 10h
MOV AH,09
LEA DX,STRING2
INT 21h

MOV AH,02
MOV BH,00
MOV DH,04
MOV DL,1Ah
INT 10h
MOV AH,09
LEA DX,STRING3
INT 21h

MOV AH,02
MOV BH,00
MOV DH,05
MOV DL,17h
INT 10h
MOV AH,09
LEA DX,STRING4
INT 21h

MOV AH,02
MOV BH,00
MOV DH,06
MOV DL,20h
INT 10h
MOV AH,09
LEA DX,STRING5
INT 21h

MOV AH,02
MOV BH,00
MOV DH,08
MOV DL,00
INT 10h

MOV AH,09h
LEA DX,SIZEMES
INT 21h

MOV AX,SIZE1
MOV BX,10
XOR CX, CX

point1:
XOR DX, DX
DIV BX
PUSH DX
INC CX
OR AX, AX
JNZ point1

point2:
POP AX
OR AL,30h
INT 29h
LOOP point2

MOV AH,09h
LEA DX,BAIT
INT 21h

MOV AH,09h
LEA DX,ENTER1
INT 21h

target:
MOV AH,08h
INT 21h

CMP AL,0Dh
JNE target

MOV AH,39h
LEA DX,NAMECATALOG
INT 21h

JC error1

MOV AH,09h
LEA DX,CATALOG
INT 21h

MOV AH,09h
LEA DX,ENTER1
INT 21h

target1:
MOV AH,08h
INT 21h

CMP AL,0Dh
JNE target1

MOV AH,3Ch
MOV CX,00h
LEA DX,FILENAME
INT 21h

MOV HANDLE,AX

JC error2

MOV AH,09
LEA DX,FILE
INT 21h

MOV AH,09h
LEA DX,ENTER1
INT 21h

target2:
MOV AH,08h
INT 21h

CMP AL,0Dh
JNE target2

MOV AH,09
LEA DX,STRING
INT 21h

MOV AH,0Ah
LEA DX,BUF
INT 21h

MOV AH,40h
MOV BX,HANDLE
mov Cl,buf+1
LEA DX,BUF[2]
INT 21h

MOV AH,3Eh
MOV BX,HANDLE
INT 21h

JC error3

mov ah,09h
lea dx,MESS
int 21h
mov ah,08h
int 21h
mov ax,4C00h
int 21h

error1: mov ah,09h
lea dx,ERRORMES1
int 21h
mov ah,09h
lea dx,MESS
int 21h
mov ah,08h
int 21h
mov ax,4C00h
int 21h

error2: mov ah,09h
lea dx,ERRORMES2
int 21h
mov ah,09h
lea dx,MESS
int 21h
mov ah,08h
int 21h
mov ax,4C00h
int 21h

error3: mov ah,09h
lea dx,ERRORMES3
int 21h
mov ah,09h
lea dx,MESS
int 21h
mov ah,08h
int 21h
mov ax,4C00h
int 21h

SIZEMES DB 'Razmer programmi: $'
STRING1 DB 'KURSOVAYA RABOTA$'
STRING2 DB 'Sistemnoe Programmirovanie$'
STRING3 DB 'Student gruppi EAS 304$'
STRING4 DB 'Aznabayev Ramil Rayatovich$'
STRING5 DB 'Variant 1.1$'
MESS DB 0Ah,'Press any key...$'
ENTER1 DB 0Ah,0Dh,'Press ENTER...$'
NAMECATALOG DB '\SP',0
FILENAME DB '\SP\KURS_SP.txt',0
CATALOG DB 0Dh,'Sozdan katalog C:\SP',0Ah,'$'
FILE DB 0Dh,'Sozdan fail C:\SP\KURS_SP.txt',0Ah,'$'
STRING DB 0Dh,'Vvedite stroku simvolov dlya zaneseniya v fail: $'
ERRORMES1 DB 0Dh,'Ne udalos sozdat katalog!',0Ah,0Dh,'$'
ERRORMES2 DB 0Dh,'Ne udalos otkrit fail!',0Ah,0Dh,'$'
ERRORMES3 DB 0Dh,'Oshibka pri zakritii faila!',0Ah,0Dh,'$'
BAIT DB ' bait',0Ah,0Dh,'$'
HANDLE DW ?
BUF DB 255,0,255 DUP (0) ;
SIZE1 = $-begin
END begin

Обсуждение

давно
Старший Модератор
312929
1973
03.03.2016, 20:40
общий
это ответ
Здравствуйте, aznabayevramil!

1) begin и $ - это метки. Метка begin стоит в самом начале программы в виде begin: и, следовательно, содержит адрес начала программы. Метка $ всегда содержит текущий адрес - в данном случае это адрес конца программы. Следовательно, выражение $-begin равно разности этих адресов, то есть длине программы.

2) По правилам ассемблера шестнадцатиричные числа (состоящие из цифр 0-9 и букв a-f), должны заканчиваться буквой h; если же такое число начинается с буквы (a-f), то перед ним ещё дописывается ведущий ноль.

3) Строки NAMECATALOG и FILENAME содержат имена файлов (каталогов), используемых файловыми функциями DOS (прерывание 21h, функции 39h, 3ah, 3bh, 3ch, 41h, 43h, 4bh, 56h и некоторые другие). По правилам DOS эти строки должны задаваться в формате ASCIIZ, то есть содержать последовательность символов ASCII, заканчивающуюся нулевым байтом (Zero byte).

4) Дескриптор (описатель, handle) файла - некоторый номер, присваиваемый файлу при его создании/открытии (с помощью функций 3сh, 3dh, 5bh прерывания 21h) и используемый вместо имени файла при дальнейших операциях с ним (функциями 3eh, 3fh, 41h, 57h, 5bh и некоторыми другими).
давно
Посетитель
7438
7205
03.03.2016, 21:17
общий
Адресаты:
По поводу handle можно добавить следующее:
По сути это индекс, но индекс в специальных структурах ОСи.
Когда происходит открытие файла, то для этого файла создается специальная структура,
в которой хранится вся необходимая информация. И индекс этой структуры и возвращается, как handle.
Разумеется, прямого доступа к данным этих структур нет. Только с помощью соответствующих функций,
параметром обязательно передается handle. Так что, что-то общее с индексом есть.
Отличием будет то, что этим handle нельзя воспользоваться, как индексом в обычном понимании.
Поэтому и говорят, что handle - это некоторое число, которое "описывает" файл, т.е. связано с открытым файлом,
является его "описателем".
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа