powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / ввод на Ассемблере
11 сообщений из 11, страница 1 из 1
ввод на Ассемблере
    #34205889
Фотография WINNER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как сделать ввод строки с клавиатуры и сохранить то что ввел в переменную типа DB?

ввод делаю так:

data segment para public 'data'
msg_1 db '',10,13,'$' ; переменнаЯ
data ends

main proc
mov ah,0Ah ; ввод
int 21h

main endp
code ends
end main


мне надо чтобы то чо я ввел сохранилось в переменной msg_1.

что нужно добавить?

спасибо.
...
Рейтинг: 0 / 0
ввод на Ассемблере
    #34205896
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подробнее опишите. Возврат по нажатию Enter или же просто по нажатию клавиши? С эхо или без?
...
Рейтинг: 0 / 0
ввод на Ассемблере
    #34205900
Фотография WINNER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по нажатию Ентер.

Я не знаю как лучше, с эхо или без. Если можно, то оба варианта. спасибо.
...
Рейтинг: 0 / 0
ввод на Ассемблере
    #34205903
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WINNERпо нажатию Ентер.

Я не знаю как лучше, с эхо или без. Если можно, то оба варианта. спасибо.

Увы я сейчас не имею возможности проверить, попробуйте так (с эхо)

Код: plaintext
1.
2.
3.
mov ah, 01h
int 21h
mov msg_1, al
...
Рейтинг: 0 / 0
ввод на Ассемблере
    #34205907
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или же так:

Код: plaintext
1.
2.
3.
4.
5.
mov ah, 3fh ; Функция ввода
mov bx,  0  ; Дескриптор клавиатуры (можно еще с RS232C или файла)
mov cx,  1  ; Число вводимых символов
mov dx, offset msg_1
int 21h

Результат: ax - число введенных символов
...
Рейтинг: 0 / 0
ввод на Ассемблере
    #34205913
Фотография WINNER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
;prg_13_2.asm
init_ds macro
;макрос настройки ds на сегмент данных
        mov     ax,data
        mov     ds,ax
        xor     ax,ax
        endm
out_str macro   str1
;макрос вывода строки на экран.
;На входе - выводимая строка.
;На выходе - сообщение на экране.
        push    ax
        mov     ah,09h
        mov     dx,offset str1
        int     21h
        pop     ax
        endm
exit    macro
;макрос конца программы
        mov     ax,4c00h
        int     21h
        endm
num_char        macro   message
local m1,elem,num,err_mes,find,num_exit
;макрос подсчета количества символов в строке.
;Длина строки - не более  99  символов.
;Вход: message - адрес строки символов, ограниченной '$'
;Выход: в al - количество символов в строке message и вывод сообщения
        jmp     m1
elem    db      'Число содержит '
num     db       2  dup ( 0 ) ;число символов в строке message в коде ASCII
        db      ' цифр', 10 , 13 ,'$'   ;конец строки для вывода функцией 09h
err_mes db      'Строка &message не содержит символа конца строки', 10 , 13 ,'$'
m1:
;сохраняем используемые в макросе регистры
        push    es
        push    cx
        push    ax
        push    di
        push    ds
        pop     es      ;настройка es на ds
        mov     al,'$'  ;символ для поиска - `$`
        cld             ;сброс флага df
        lea     di,message      ;загрузка в es:di смещения строки message
        push    di      ;запомним di - адрес начала строки
        mov     cx, 99    ;для префикса repne - максимальная длина строки
;поиск в строке (пока нужный символ и символ в строке не равны)
;выход - при первом совпавшем
repne   scasb
        je      find    ;если символ найден - переход на обработку
;вывод сообщения о том, что символ не найден
        push    ds
;подставляем cs вместо ds для функции 09h (int21h)
        push    cs
        pop     ds
        out_str err_mes
        pop     ds
        jmp     num_exit        ;выход из макроса
find:   ;совпали
;считаем количество символов в строке:
        pop     ax      ;восстановим адрес начала строки
        sub     di,ax   ;(di)=(di)-(ax)
        xchg    di,ax   ;(di) <-> (ax)
        sub     al, 3     ;корректировка на служебные символы -  10 ,  13 , '$'
        aam             ;в al две упакованные BCD-цифры результата подсчета
        or      ax,3030h        ;преобразование результата в код ASCII
        mov     cs:num,ah
        mov     cs:num+ 1 ,al
;вывести elem на экран
        push    ds
;подставляем cs вместо ds для функции 09h (int21h)
        push    cs
        pop     ds
        out_str elem
        pop     ds
num_exit:
        push    di
        push    ax
        push    cx
        push    es
        endm

data    segment para public 'data'
msg_1   db      '', 10 , 13 ,'$'
data ends

stk     segment stack
        db       256  dup('?')
stk     ends

code    segment para public 'code'
        assume  cs:code,ds:data,ss:stk
main    proc
	
	mov ah,0Ah
	int 21h
	mov msg_1,al
	
	
	init_ds ; инициализация стоки
        out_str msg_1
        num_char msg_1
        exit
main    endp
code    ends
end     main

вот мой исходник - подсчета кол-ва символов в строке. надо сделать чтобы я мог вводить эту строку. не получаеться. 00 выводит. не хочет изменять как будто переменную msg_1
...
Рейтинг: 0 / 0
ввод на Ассемблере
    #34205918
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WINNER

Так извините, у вас объявлен байт, а не строка!

сделайте так:

Код: plaintext
1.
msg_1 db  128  dup ('*')

Затем, вводите так:

Код: plaintext
1.
2.
3.
4.
5.
mov ah, 3fh    ; Функция ввода
mov bx,  0        ; Дескриптор клавиатуры (можно еще с RS232C или файла)
mov cx,  128     ; Число вводимых символов. Ограничте объемом зарезервированной области памяти
mov dx, offset msg_1
int 21h
...
Рейтинг: 0 / 0
ввод на Ассемблере
    #34205919
Фотография WINNER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.IsbarovИли же так:

Код: plaintext
1.
2.
3.
4.
5.
mov ah, 3fh ; Функция ввода
mov bx,  0  ; Дескриптор клавиатуры (можно еще с RS232C или файла)
mov cx,  1  ; Число вводимых символов
mov dx, offset msg_1
int 21h

Результат: ax - число введенных символов

не работает. ( кракозябры выводит. (
...
Рейтинг: 0 / 0
ввод на Ассемблере
    #34205928
Фотография WINNER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.Isbarov WINNER

Так извините, у вас объявлен байт, а не строка!

сделайте так:

Код: plaintext
1.
msg_1 db  128  dup ('*')

Затем, вводите так:

Код: plaintext
1.
2.
3.
4.
5.
mov ah, 3fh    ; Функция ввода
mov bx,  0        ; Дескриптор клавиатуры (можно еще с RS232C или файла)
mov cx,  128     ; Число вводимых символов. Ограничте объемом зарезервированной области памяти
mov dx, offset msg_1
int 21h


чета вылетает с ошибкой. ((
...
Рейтинг: 0 / 0
ввод на Ассемблере
    #34205933
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, проверил тока что

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
	. 286 
	.model small
	.stack  256 


	.code

	mov	ah, 02h
	mov	dl, '>'	
	int 	21h

	mov	ah, 3fh
	xor	bx, bx
	mov	cx,  128 
	mov	dx, offset in_buf
	int	21h 	

	mov	bx, offset in_buf
	add	bx, ax
	mov	byte ptr [bx], '$'

	mov	ah, 09h
	mov	dx, offset in_buf
	int	21h

	mov	ax, 4c00h
	int	21h	


	.data
in_buf 	db  128  dup('*')

	end
...
Рейтинг: 0 / 0
ввод на Ассемблере
    #34206014
Фотография WINNER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.IsbarovВот, проверил тока что

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
	. 286 
	.model small
	.stack  256 


	.code

	mov	ah, 02h
	mov	dl, '>'	
	int 	21h

	mov	ah, 3fh
	xor	bx, bx
	mov	cx,  128 
	mov	dx, offset in_buf
	int	21h 	

	mov	bx, offset in_buf
	add	bx, ax
	mov	byte ptr [bx], '$'

	mov	ah, 09h
	mov	dx, offset in_buf
	int	21h

	mov	ax, 4c00h
	int	21h	


	.data
in_buf 	db  128  dup('*')

	end


Спасибо огромное! все получилось! прога работает так как надо!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / ввод на Ассемблере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]