Объясните, пожалуйста, как правильно вводить строку, пользуясь функцией 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
надеюсь драйвер под русскую клаву в 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
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
Так... крыша едет не спеша. По ходу, выяснилось что я не умею работать в TD и из-за этого развожу панику :-[ Ввел в TD во 2-й проге в watches отслеживать не MyStr а MyStr[0] - все показывает (хотя опять же какая разница?). До этого я решил, что не работает, т. к. в watches не показывало введенной строки.
Плохо, когда крыша протекает...
А для вывода, кстати, пользуйся лучше функцией 13h, 16-го прерывания.
Возможности: вывода атрибутов (статичных/переменных), сдвига курсора, поддержка вывода типа PChar (ASCIIZ строки)...
Кого читаешь?
В. Юров, "Ассемблер учебник". Не рекомендую для самостоятельного изучения. Приходится еще в NortonGuides лезть, благо под рукой.
А так еще в универе читают, но там ма-а-ло, хочется большего. Намример, ту же строку там вводим по символам