Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2008, 19:07   #1
XATAB
Пользователь
 
Аватар для XATAB
 
Регистрация: 30.01.2007
Сообщений: 49
По умолчанию Считать строку

Всем здрасте, ассемблер изучаю недавно. Необходимо считать с клавиатуры строку, а потом вывести ее на экран.
Пишу следующее:
Код:
.model small
.stack 100h

.code

start:
	mov ax, dgroup
	mov ds, ax

	mov ah, 0ah
	mov dx, offset stroka
	int 21h

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

	mov ax, 4c00h
	int 21h

.data
	stroka db ""

end start
он мне выдает какие-то непонятные символы(много) и вот такую строчку DOS SETBLOCK (4Ah) error.
Заранее всем спасибо
XATAB вне форума Ответить с цитированием
Старый 27.03.2008, 22:09   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Читаем внимательно описание int 21,0A

До вызова должен быть подготовлен буфер
max ??????
после вызова буфер содержит строку. Формат буфера
max, len, text, 0Dh

объяви строку хотя-бы так

stroka db 10,'$','$','$','$','$','$','$','$', '$','$','$','$'

Читаем дальше. Int 21,09 требует смещения на начало строки, заканчивающейся символом '$'. Символ окончания уже есть, т.к. мы сами объявили буфер. При указании смещения нужно пропустить 2 байта.
alexBlack вне форума Ответить с цитированием
Старый 28.03.2008, 06:10   #3
XATAB
Пользователь
 
Аватар для XATAB
 
Регистрация: 30.01.2007
Сообщений: 49
По умолчанию

Попробовал объявить строку как ты предложил - все отлично. Ток перед строкой выдает ромбик. А вот если мне нужно будет ввести строку больше чем 10 байт например 100, я так понял это надо писать так
Код:
stroka db 100, "$"
.
А вообще как-нить можно объявить сроку ну типо как в паскале чтоб длина была 255
Цитата:
Сообщение от alexBlack Посмотреть сообщение
При указании смещения нужно пропустить 2 байта.
Как это сделать, чет я не догоняю.
XATAB вне форума Ответить с цитированием
Старый 28.03.2008, 08:42   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Первый байт - max количество вводимых символов.
После вызова функции второй байт - количество введенных символов.
С третьего символа - сама строка

Первые два байта пропускаем:

Код:
    mov ah, 09h   
    mov dx, offset stroka   
    add dx, 2
    int 21h
alexBlack вне форума Ответить с цитированием
Старый 28.03.2008, 16:28   #5
XATAB
Пользователь
 
Аватар для XATAB
 
Регистрация: 30.01.2007
Сообщений: 49
По умолчанию

сделал я так, токо теперь он у меня ваще ничего не выводит
XATAB вне форума Ответить с цитированием
Старый 28.03.2008, 16:39   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от XATAB Посмотреть сообщение
сделал я так, токо теперь он у меня ваще ничего не выводит
Это кажется. После того как нажимаем <enter> курсор не перемещается на следующую строку и вывод идет по введенному тексту.

объяви еще одну строку

stroka1 db 'gfhjksghjfdhgjfkdlshgjfldhgjkfdhgj l','$'

и измени

mov ah, 09h
mov dx, offset stroka1
;add dx, 2
int 21h

увидишь.

Вывод - после ввода нужно перемещать курсор.

Перед выводом введенной строки сначала выведи db 0Dh, 0Ah, '$'

Последний раз редактировалось alexBlack; 28.03.2008 в 16:44.
alexBlack вне форума Ответить с цитированием
Старый 01.04.2008, 17:52   #7
XATAB
Пользователь
 
Аватар для XATAB
 
Регистрация: 30.01.2007
Сообщений: 49
По умолчанию

Спасиб, понял. Буду пробовать
XATAB вне форума Ответить с цитированием
Старый 05.04.2008, 18:16   #8
ёжик
Пользователь
 
Регистрация: 18.11.2007
Сообщений: 13
По умолчанию

вот программа написана на masm32

Код:
.386
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
ClassName db "SimpleWinClass",0
AppName  db "vivod",0
MenuName db "FirstMenu",0
ButtonClassName db "button",0
ButtonText db "start programm",0
EditClassName db "edit",0
TestString db "Wow! I'm in an edit box now",0
caption  db "vivod",0

.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hwndButton HWND ?
hwndEdit HWND ?
buffer db 512 dup(?)

.const
ButtonID equ 1
EditID equ 2
IDM_HELLO equ 1
IDM_CLEAR equ 2
IDM_GETTEXT equ 3
IDM_EXIT equ 4

.code
start:
invoke GetModuleHandle, NULL
mov    hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov   wc.cbSize,SIZEOF WNDCLASSEX
mov   wc.style, CS_HREDRAW or CS_VREDRAW
mov   wc.lpfnWndProc, OFFSET WndProc
mov   wc.cbClsExtra,NULL
mov   wc.cbWndExtra,NULL
push  hInst
pop   wc.hInstance
mov   wc.hbrBackground,COLOR_BTNFACE+1
mov   wc.lpszMenuName,OFFSET MenuName
mov   wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov   wc.hIcon,eax
mov   wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov   wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,300,200,NULL,NULL,\
hInst,NULL
mov   hwnd,eax
INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
INVOKE UpdateWindow, hwnd
.WHILE TRUE
INVOKE GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
.ENDW
mov     eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
ES_AUTOHSCROLL,\
50,35,200,25,hWnd,EditID,hInstance,NULL
mov  hwndEdit,eax
invoke SetFocus, hwndEdit
invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
75,70,140,25,hWnd,ButtonID,hInstance,NULL
mov  hwndButton,eax
.ELSEIF uMsg==WM_COMMAND
mov eax,wParam
.IF lParam==0
.IF ax==IDM_HELLO
invoke SetWindowText,hwndEdit,ADDR TestString
invoke SendMessage,hwndEdit,WM_KEYDOWN,VK_END,NULL
.ELSEIF ax==IDM_CLEAR
invoke SetWindowText,hwndEdit,NULL
.ELSEIF  ax==IDM_GETTEXT
invoke GetWindowText,hwndEdit,ADDR buffer,512
invoke     MessageBox,0,addr buffer,addr caption ,MB_OK

.ELSE
invoke DestroyWindow,hWnd
.ENDIF
.ELSE
.IF ax==ButtonID
shr eax,16
.IF ax==BN_CLICKED
invoke SendMessage,hWnd,WM_COMMAND,IDM_GETTEXT,0
.ENDIF
.ENDIF
.ENDIF
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor    eax,eax
ret
WndProc endp
end start

Последний раз редактировалось rpy3uH; 06.04.2008 в 15:40.
ёжик вне форума Ответить с цитированием
Старый 10.04.2008, 16:37   #9
XATAB
Пользователь
 
Аватар для XATAB
 
Регистрация: 30.01.2007
Сообщений: 49
По умолчанию

за masm32 спс, но мне пока до него далеко. хочу понять простое
XATAB вне форума Ответить с цитированием
Старый 10.04.2008, 16:52   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ёжик
А где тут считывание с клавиатуры?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как считать строки? Черничный Общие вопросы Delphi 14 01.09.2008 14:56
Как из .BMP считать попиксельно OrdJONY Мультимедиа в Delphi 7 17.08.2008 15:46
Считать определенную строку из файла DimkinStd Работа с сетью в Delphi 4 15.02.2007 22:30
Как считать данные из Edit? Svop Компоненты Delphi 11 20.11.2006 16:45
как считать данные с Txt файла? Alar Общие вопросы Delphi 0 29.10.2006 20:12