Помощь - Поиск - Пользователи - Календарь
Полная версия: Как вводить строку?
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Assembler
trminator
Объясните, пожалуйста, как правильно вводить строку, пользуясь функцией 0Ah DOS.
Есть две программы, вроде обе должны работать, но работает только первая, хотя по идее они должны одинаково работать...

Вот программы:
Первая

============================
DOSSEG
.MODEL small
.STACK 200h
.DATA
        max     db      0FFh          ;max длина
        len2    db      0              ;Реальная длина
        str1    db      255 dup (' ')  ;Собственно строка
        endl    db      13,10,'$'      ;Переход на новую строку
.CODE
start:
        mov     ax, @data
        mov     ds, ax

        mov     dx, OFFSET max        ;Если верить NortonGuides,
; в DX нужно писАть  смещение строки, причем 1-й байт должен означать
; макс. длину строки, во 2-й байт ДОС выдаст длину введенной строки,
; а дальше будет сама строка
        mov     ah, 0Ah
        int     21h

        mov     bl, len2
        xor     bh, bh
        mov     str1[bx],'$'; чтобы потом напечатать - признак конца

        mov     dx, OFFSET endl;На новую строку
        mov     ah, 09h
        int     21h

        mov     dx, OFFSET str1;Печатать введенную строку
        mov     ah, 09h
        int     21h

        mov     ah, 4Ch
        int     21h
END start


===============================
Вторая:

dosseg
.model  small
.stack 100h
.data
        MyStr   db      0FFh,0, 0FFh dup (' '),'$'; а тут я хочу то же самое,
; но работая с 1 переменной, а не с тремя. Потом хотел сдвинуть,
; но заметил, что у меня вообще ничего не вводит
.code
start:
        mov     ax,@data
        mov     ds, ax

        mov     dx, offset MyStr
        mov     ah, 0Ah
        int     21h

        mov     ah, 4ch
        int     21h
end     start

Shadow
надеюсь драйвер под русскую клаву в DOS есть
-----


.MODEL SMALL
.STACK 100H
.DATA

buff	db 254(?)      
; первый байт содержит реальное число символов для ввода с учетом
; символа 0dh завершающего процесс ввода
; второй байт содержит реальную длину строки
; но уже без учета завершающего символа
; начиная с третего байта идет именно сумма строк введенных
; символов
;

.CODE
START:
	mov ax,3
	int 10h
	mov ax,@data
	mov ds,ax

	mov dx,offset buff
	mov ah,0ah
	int 21h
      
	lea di,buff		; DS:DI адрес строки
	inc di			; второй байт содержит реальую длину введенной строки
	mov bl,[di]		; содержит длину введенной строки
	lea di,buff		;
	mov di,bx		; пихаем в DI реальую длину строки 
	inc di			; смещаем на один
	inc di			; еще на один
	mov ds:[di],'$'		; пихаем признак конца строки в конец строки

; тут можно обработать
; строку зашифровать
; перевести 
	mov ah,02		; функция GotoXY
	mov bh,0		; screen number
	mov dh,10		; x-posit
	mov dl,10		; y-posit
	int 10h			; BIOS INIT

	lea dx,buff		; смещение DS:DX
	inc dx			; пропускаем информационные
	inc dx			; байты первый об общей возможной длине и реальной длине
	mov ah,09h		; функция вывода на экран
	int 21h			;

	mov ah,0		; wait
	int 16h			; key

exit:
	mov ah,4ch		;|
	mov al,0		;| -EXIT to DOS;
	int 21h			;|

END START

GLuk
2trminator: Я трейсил вторую прогу, все нормально...типа буфер наполняется данными.

2Shadow: Я тут маленько над кодом поизвращался... типа мой вариант:


.8086
.MODEL TINY
.CODE
ORG 100h
START:
	mov ax,3
	int 10h
; Буферизированный ввод с устройства STDIN
	lea dx,MaxSize
	mov ah,0ah
	int 21h
; Помещаем признак конца строки
	inc dx
	mov si,dx
	mov ah,0
	lodsb
	add si,ax
	mov byte ptr [si],'$'
	inc dx
	push dx; Сохраняем смещение, чтоб потом не инициализировать
; Позиционируем курсор в координаты 10:10
	mov ah,02
	mov bh,0
	mov dx,0A0Ah
	int 10h
; Выводим сформированную строку
	pop dx
	mov ah,09h
	int 21h
; Ждем нажатия клавиши и завершаем программу
	mov ah,0
	int 16h
	mov ax,4C00h
	int 21h

MaxSize	db 0F0h
Buff	db 253(?)
END START

trminator
Так... крыша едет не спеша. По ходу, выяснилось что я не умею работать в TD и из-за этого развожу панику  :-[ Ввел в TD во 2-й проге в watches отслеживать не MyStr а MyStr[0] - все показывает (хотя опять же какая разница?). До этого я решил, что не работает, т. к. в watches не показывало введенной строки.
GLuk
Плохо, когда крыша протекает... smile.gif
А для вывода, кстати, пользуйся лучше функцией 13h, 16-го прерывания.
Возможности: вывода атрибутов (статичных/переменных), сдвига курсора, поддержка вывода типа PChar (ASCIIZ строки)...

Кого читаешь?
trminator
В. Юров, "Ассемблер учебник". Не рекомендую для самостоятельного изучения. Приходится еще в NortonGuides лезть, благо под рукой.

А так еще в универе читают, но там ма-а-ло, хочется большего. Намример, ту же строку там вводим по символам
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.