Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 6610
∙ повысить рейтинг »
Асмик Гаряка
Статус: Советник
Рейтинг: 259
∙ повысить рейтинг »
Куликов Роман Евгеньевич
Статус: 1-й класс
Рейтинг: 0
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1581
Дата выхода:02.01.2016, 18:51
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:16 / 7
Вопросов / ответов:1 / 1

Консультация # 188568: Здравствуйте! У меня возникли сложности с таким вопросом: в программе создается каталог, в нем файл и записывается любая символьная строка. не записывает первый символ строки и в конце добавляет некий не читаемый символ.Хотелось бы узнать причину и способ ее устранения. также интересовал вопрос: полное значение строки BUF DD 255,0,255 DUP (0)...

Консультация # 188568:

Здравствуйте! У меня возникли сложности с таким вопросом: в программе создается каталог, в нем файл и записывается любая символьная строка. не записывает первый символ строки и в конце добавляет некий не читаемый символ.Хотелось бы узнать причину и способ ее устранения. также интересовал вопрос: полное значение строки BUF DD 255,0,255 DUP (0), для чего нужны цифры и почему ноль в скобках.

Код (Assembler):
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

Дата отправки: 28.12.2015, 18:39
Вопрос задал: aznabayevramil (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, aznabayevramil!
Ваши вопросы - об одном и том же smile
"Неправильная" строка - результат непонимания строки-параметра для функции запроса строки
Ошибка в том, что было выделение памяти в двойных словах (DD), а требуется в байтах (DB)
Формат строки следующий:
Первый байт - максимальный размер буфера в байтах, с учетом последнего кода odh, который добавляется автоматически
Второй байт = реальная длина введенной строки (без последнего 0dh). Вначале - неважно что. Обычно пишут 0
Начиная с третьего - сама строка
Теперь о конструкции N dup(M)
Это оператор языка Ассемблера, указывающий о повторении N раз кода в скобках. Этот код (M) может быть задан любым способом:
числом, символом в кавычках или знаком вопроса.
Если использовано число или символ, что по сути тоже число, то данное число прописывается по всему буферу.
Если использован знак вопроса, то фактически ничего не прописывается, а только резервируется место.
Это относится и к другим выделениям памяти (типа handle dw ?)
Это значит, что код программы не будет содержать этих буферов и переменных.
Но! Если после таких выделений памяти будет стоять что-то конкретное (типа x dw 0), то все буфера и переменные со знаком вопроса
окажутся в теле программы, заполненные нулями. Поэтому желательно области со знаками вопроса располагать в конце всей программы.
Небольшое замечание по тексту программы: нежелательно использовать в качестве меток и имен переменных зарезервированные слова.
Типа SIZE, ENTER и другие.

Код (Assembler):
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

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 29.12.2015, 00:18
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное