Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Assembler _ Как вводить строку?

Автор: trminator 3.05.2003 18:14

Объясните, пожалуйста, как правильно вводить строку, пользуясь функцией 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 3.05.2003 21:13

надеюсь драйвер под русскую клаву в 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 4.05.2003 3:59

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 4.05.2003 9:31

Так... крыша едет не спеша. По ходу, выяснилось что я не умею работать в TD и из-за этого развожу панику  :-[ Ввел в TD во 2-й проге в watches отслеживать не MyStr а MyStr[0] - все показывает (хотя опять же какая разница?). До этого я решил, что не работает, т. к. в watches не показывало введенной строки.

Автор: GLuk 4.05.2003 10:02

Плохо, когда крыша протекает... smile.gif
А для вывода, кстати, пользуйся лучше функцией 13h, 16-го прерывания.
Возможности: вывода атрибутов (статичных/переменных), сдвига курсора, поддержка вывода типа PChar (ASCIIZ строки)...

Кого читаешь?

Автор: trminator 4.05.2003 10:16

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

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