· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Ввод и вывод строки

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июн 11, 2004 19:59:23 · Поправил: atos

Я вот не пойму никак, начал изучать асм недавно, тащусь просто, но есть множество моментов, на которые немогу найти ответы. Вот например надо ввести строку и сразу ее вывести:
CSEG segment
org 100h
assume CS:CSEG,DS:CSEG,SS:CSEG,
;-------------------------------------
start:

	mov dx,offset mess1
	mov ah,09h
	int 21h                          ; приглашение
	
	mov dx,offset buf1
	mov ah,0Ah
	int 21h                          ; считываем строку в буфер
	
	mov dx,offset buf1
	mov ah,09h
	int 21h                          ; выводим введенную строку
;-------------------------------------
	mov dx,offset mess2
	mov ah,09h
	int 21h                          ; выводим mess2
	
	mov ax,10h
	int 16h                          ; ждем нажатия любой клавиши

	mov ah,4ch
	int 21h                          ; выход из программы
;-------------------------------------
mess1	db 'Enter string: ',24h
mess2	db 'Press any key to continue...',24h
buf1	db 128 dup ('$')

CSEG ends
end start


Но чувствуется, что-то здесь не так. :(
Подскажите плз.
Спасибо.


Дата: Июн 11, 2004 20:19:25

Не так - разве что ввести могут больше 127 символов. Больше багов нет - почти идеальная программа :)


Дата: Июн 11, 2004 20:21:46

hGoblin

Не бывает программ без багов - бывает плохо искали :)
А если написал программу без багов - зови системного программиста - он поправит баг в компиляторе :)


Дата: Июн 11, 2004 20:30:00

Вроде функция 0A принимает указатель на буфур первым байтом которого является его размер.


Дата: Июн 11, 2004 21:14:21

Не так - разве что ввести могут больше 127 символов. Больше багов нет - почти идеальная программа :)

Вот именно, что почти :)
Ну неработает она! :(

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

Вроде функция 0A принимает указатель на буфур первым байтом которого является его размер.

А как же тогда надо?

Полдня сижу туплю... хоть бы примерчик кто чирканул как с функцией етой (0Ah т.е.) работать...


Дата: Июн 11, 2004 22:38:17


mov dx,offset buf1 + 2 
mov ah,09h
int 21h                          ; выводим введенную строку
;-------------------------------------


просто первый байт буфера, нга скока я помню, -- это максимальный размер строки, которую ты будешь вводить,
второй байт заполняется системой уже после ввода, он показывает размер введенной строки -- а дальше уже сама строка


Дата: Июн 12, 2004 00:12:14

И все равно не помогает :((
Вываливается мусор.


Дата: Июн 12, 2004 00:25:33

atos
>Вываливается мусор.
а на какой стадии? )
Когда выводишь предварительно введенную строку?
Или раньше?


Дата: Июн 12, 2004 06:31:45

atos
все равно не помогает
Покажи, какие изменения ты внес.


Дата: Июн 12, 2004 07:26:39

atos
поробуй после распечатки введенной строки переводить строку (распечатать
db 13, 10, '$'
например)
у меня без этого строки записываются поверх друг друга


Дата: Июн 12, 2004 09:54:18

попробуй считать строку так
xor bx,bx
mov cx,127
lea dx,buf1
mov ah,3fh
int 21h

и ожидание нажатия клавиши
mov ah,7h
int 21h


Дата: Июн 13, 2004 15:35:20

Спасибо, функция 3Fh помогла!
Значить дело было так:
Вводил строку, нажимал интер - строка пропадала и вываливался мусор одновременно с писком спикера.
Spiteful, ксорить bx вроде ненадо. А в cx зачем пересылать 127? Пробовал и так и так - ничего неизменилось. Объясни плз.
Значит получился вот такой окончательный листинг:
CSEG segment
org 100h
assume CS:CSEG,DS:CSEG,SS:CSEG,
;-------------------------------------
start:

	mov dx,offset mess1
	mov ah,09h
	int 21h                          ; приглашение

	lea dx,buf1
	mov ah,3fh
	int 21h                          ; считываем строку в буфер
	
	mov dx,offset buf1
	mov ah,09h
	int 21h                          ; выводим введенную строку
;-------------------------------------
	mov dx,offset mess2
	mov ah,09h
	int 21h                          ; выводим mess2
	
	mov ax,10h
	int 16h                          ; ждем нажатия любой клавиши

	mov ah,4ch
	int 21h                          ; выход из программы
;-------------------------------------
mess1	db 'Enter string: ',24h
mess2	db 'Press any key to continue...',24h
buf1	db 128 dup('$')

CSEG ends
end start


Кстати, еще вопрос: чем отличается lea от mov dx,offset buf1 ? Пробовал и так и так - ничего неизменилось - .com файлы ни на байт неотличаются.


Дата: Июн 13, 2004 18:27:34

3fh - функция чтения из файла;просто в bx может быть некий мусор и функия может запросто проглючить.
В cx - сколько байт надо прочитать, попробуй обнулить cx.
Кстати, еще вопрос: чем отличается lea от mov dx,offset buf1 ?
Писать короче :))


Дата: Июн 14, 2004 16:25:35

А 3Fh - чтение из файла, а почему она работает на ввод строки???


Дата: Июн 14, 2004 16:46:54 · Поправил: Spiteful

А 3Fh - чтение из файла, а почему она работает на ввод строки???
потому как если в bx(дескриптор файла) 0, то функция читает с клавиатуры.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.051