Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция ввода на Асме, анолог ReadLn в Паскале 
:(
    Опции темы
var
  Дата 25.5.2005, 13:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как написать функцию на ассемблере для ввода текста, аналогично функции ReadLn в Паскале?

Должно быть что-то типо:
Код

   lea ax,string
   call input

...

input:
   ...
   int 16h
   ret

Помогите, плз.
  Вверх
Akina
Дата 25.5.2005, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Код

BufferLength EQU 0FEh

Buffer db BufferLength+1 DUP (?)

input:
lea dx,Buffer
mov byte ptr [dx],BufferLength 
mov ah,0Ah
int 21h
; в Buffer - байт длины введенной строки, потом сама CR-terminated строка.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Chingachguk
Дата 26.5.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



Код

READ_STRING PROC NEAR
; X,Y=[BP+4], ADDR_STR=[BP+6]
    PUSH BP
    MOV  BP,SP
    PUSH BX 
    MOV  DX,WORD PTR [BP+4]        ; DL=Y, DH=X
    MOV  BX,[BP+6]
    XOR  DI,DI
@REPEAT:PUSH BX
    PUSH 1+16+32
    PUSH WORD PTR [BP+4]
    CALL GOTOXY
    CALL OUT_STR
        call Stop
    CMP  AL,27
    JZ   @D_READ
    CMP  AH,72
    JZ   @D_READ
    CMP  AH,80
    JZ   @D_READ
    CMP  AL,13
    JZ   @D_READ
    CMP  AH,75
    JNZ  @N_L_T
    CALL LEFT_CURSOR
@N_L_T: CMP  AH,77
    JNZ  @N_RGH
    CALL RIGHT_CURSOR
@N_RGH:    CMP  AL,8
    JNZ  @N_BKSP
    CALL BACKSPACE
@N_BKSP:CMP  AH,'S'
    JNZ  @N_DLT
    CALL DELETE
@N_DLT:    CMP  AH,'O'
    JNZ  @N_END
    CALL END_POS
@N_END: CMP  AH,'G'
    JNZ  @N_HOME
    CALL HOME
@N_HOME:TEST AL,AL
    JZ   @REPEAT
    CALL PUT_SYMBOL    
    JMP  @REPEAT
@D_READ:POP  BX
    POP  BP
    RET  4
READ_STRING ENDP
HOME    PROC NEAR
    MOV  CX,80
@HOME:    CALL LEFT_CURSOR
    LOOP @HOME    
    XOR  AX,AX
    RET
HOME    ENDP
END_POS PROC NEAR
    MOV  CX,80
@STAY_END:    CALL  RIGHT_CURSOR
        LOOP  @STAY_END
    CMP  BYTE PTR [BX+DI+1],' '
    JNZ  @D_END
@NXT_L:    CMP  BYTE PTR [BX+DI],' '
    JNZ  @D_END
    TEST DI,DI
    JZ   @D_END
    CALL LEFT_CURSOR
    JMP  @NXT_L    
@D_END:    XOR  AX,AX
    RET
END_POS ENDP
DELETE    PROC NEAR
    MOV  BYTE PTR [BX+DI+1],' '
    CALL DEL_RIGHT    
    XOR  AX,AX
    RET
DELETE ENDP
DEL_RIGHT PROC NEAR
    MOV  CL,[BX]            ; CL=TOTAL BYTES IN STR
    XOR  CH,CH
    DEC  CX                
    SUB  CX,DI
    TEST CX,CX
    JZ   @LAST
    PUSH DI
    PUSH ES
    PUSH DS
    POP  ES
    LEA  DI,[BX+DI+1]
    LEA  SI,[DI+1]
    REP  MOVSB
    MOV  BYTE PTR [DI],' '
    POP  ES
    POP  DI
@LAST:    RET
DEL_RIGHT ENDP
BACKSPACE PROC NEAR
    MOV  SI,DI
    CALL LEFT_CURSOR
    CMP  SI,DI
    JZ   @N_BACK
    MOV  CL,[BX]            ; CL=TOTAL BYTES IN STR
    CALL DEL_RIGHT
@N_BACK:XOR  AX,AX
        RET
BACKSPACE ENDP
PUT_SYMBOL PROC NEAR
    PUSH DI
    PUSH DX
    PUSH AX
    CALL END_POS            ; STAY AT THE END
    CMP  BYTE PTR [BX+DI+1],' '    ; IS THERE FREE PLACE ?
    POP  AX
    POP  DX
    POP  DI
    JNZ  @N_PUT
    PUSH DI
    PUSH ES
    PUSH DS
    POP  ES
    MOV  CL,[BX]
    XOR  CH,CH
    DEC  CX
    MOV  SI,CX
    SUB  CX,DI
    TEST CX,CX
    JZ   @N_MVI
    LEA  SI,[BX+SI+1]
    MOV  DI,SI
    DEC  SI
    STD
    REP  MOVSB
    CLD
@N_MVI:    POP  ES
    POP  DI
    MOV  [BX+DI+1],AL
    CALL RIGHT_CURSOR
@N_PUT:    RET
PUT_SYMBOL ENDP
LEFT_CURSOR PROC NEAR
    PUSH AX
    TEST DI,DI        ; LEFT-END POSITION ?
    JZ   @Y_L
    DEC  DH            ; CURSOR MOVED LEFT
    DEC  DI            ; POS IN STR
@Y_L:    POP  AX
    RET
LEFT_CURSOR ENDP
RIGHT_CURSOR PROC NEAR
    PUSH AX
    MOV  AL,[BX]
    CBW            ; AX=LENGHT OF STR
    DEC  AX            ; FROM ZIRO
    CMP  AX,DI
    JZ   @Y_R
    INC  DI
    INC  DH    
@Y_R:    POP  AX
    RET
RIGHT_CURSOR ENDP



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Coder
Дата 28.5.2005, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Если нужно прочитать с консоли, можно воспользоваться API- шной функцией ReadConsole


PM MAIL   Вверх
var
Дата 31.5.2005, 16:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2 Chingachguk:
Спасибо за помошь, только я одного не понял, а где функции: stop, out_str и gotoxy?

И еще перед вызовом процедуры, как надо передавть параметры?

mov bp+4,x
inc bp
mov bp,y
inc bp
mov bp,string
call read_line

Так?

Я в ассемблере не силен, так что извините если вопросы глупые...
Заранее спасибо.
  Вверх
Chingachguk
Дата 31.5.2005, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



Смотри тогда весь исходник. Это отдельная программа.

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  Find3str.asm


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
var
Дата 1.6.2005, 12:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо.
Сразу бы выложил!
  Вверх
ASPolyakov
Дата 24.9.2005, 13:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Люди!, скажите как выводить значения переменныйх как число.
  Вверх
Mysterio
Дата 25.9.2005, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Планирующий
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 28.12.2004

Репутация: нет
Всего: нет



Хе,это уже отдельная тема.Лично я делал так: делил на 10,пока есть целая часть, по ходу деления каждый символ(остаток) заносил в свой байт и добавлял 48(для ASCII). Может ,конечно, и есть алгоритм попроще.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.