IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> Как вводить строку?
trminator
сообщение 3.05.2003 18:14
Сообщение #1


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Shadow
сообщение 3.05.2003 21:13
Сообщение #2


Lonely_Raven
****

Группа: Пользователи
Сообщений: 640
Пол: Мужской

Репутация: -  1  +


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



--------------------
Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ
---------------------
RTFM - Read the fucking manual
---------------------
http://www.livejournal.com/users/lonley_raven/
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 4.05.2003 3:59
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
trminator
сообщение 4.05.2003 9:31
Сообщение #4


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 4.05.2003 10:02
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


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

Кого читаешь?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
trminator
сообщение 4.05.2003 10:16
Сообщение #6


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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

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


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.04.2024 17:40
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"