Здравствуйте, aznabayevramil!
Ваши вопросы - об одном и том же
"Неправильная" строка - результат непонимания строки-параметра для функции запроса строки
Ошибка в том, что было выделение памяти в двойных словах (DD), а требуется в байтах (DB)
Формат строки следующий:
Первый байт - максимальный размер буфера в байтах, с учетом последнего кода odh, который добавляется автоматически
Второй байт = реальная длина введенной строки (без последнего 0dh). Вначале - неважно что. Обычно пишут 0
Начиная с третьего - сама строка
Теперь о конструкции N dup(M)
Это оператор языка Ассемблера, указывающий о повторении N раз кода в скобках. Этот код (M) может быть задан любым способом:
числом, символом в кавычках или знаком вопроса.
Если использовано число или символ, что по сути тоже число, то данное число прописывается по всему буферу.
Если использован знак вопроса, то фактически ничего не прописывается, а только резервируется место.
Это относится и к другим выделениям памяти (типа handle dw ?)
Это значит, что код программы не будет содержать этих буферов и переменных.
Но! Если после таких выделений памяти будет стоять что-то конкретное (типа x dw 0), то все буфера и переменные со знаком вопроса
окажутся в теле программы, заполненные нулями. Поэтому желательно области со знаками вопроса располагать в конце всей программы.
Небольшое замечание по тексту программы: нежелательно использовать в качестве меток и имен переменных зарезервированные слова.
Типа SIZE, ENTER и другие.
[code lang=asm h=200]
title KURS (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,SIZEPRG
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,WAITENTER
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,WAITENTER
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,WAITENTER
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
XOR CX,CX
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...$'
WAITENTER DB 0Ah,0Dh,'Press ENTER...$'
NAMECATALOG DB '\SPO',0
FILENAME DB '\SPO\KURS_SPO.txt',0
CATALOG DB 0Dh,'Sozdan katalog C:\SPO',0Ah,'$'
FILE DB 0Dh,'Sozdan fail C:\SPO\KURS_SPO.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) ;
SIZEPRG = $-begin
END begin
[/code]