Консультация № 188568
28.12.2015, 18:39
0.00 руб.
29.12.2015, 00:20
0 1 1
Здравствуйте! У меня возникли сложности с таким вопросом: в программе создается каталог, в нем файл и записывается любая символьная строка. не записывает первый символ строки и в конце добавляет некий не читаемый символ.Хотелось бы узнать причину и способ ее устранения. также интересовал вопрос: полное значение строки BUF DD 255,0,255 DUP (0), для чего нужны цифры и почему ноль в скобках.
[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,SIZE
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,ENTER
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,ENTER
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,ENTER
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
LEA CX,BUF[2]
LEA DX,BUF[3]
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...$'
ENTER 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 DD 255,0,255 DUP (0) ;
SIZE = $-begin

END begin
[/code]

Обсуждение

давно
Посетитель
7438
7205
29.12.2015, 00:18
общий
это ответ
Здравствуйте, 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]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа