Помощь - Поиск - Пользователи - Календарь
Полная версия: Как вводить строку?
Форум «Всё о Паскале» > 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 лезть, благо под рукой.

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