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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2018, 05:44   #11
temsku2
Пользователь
 
Регистрация: 29.11.2018
Сообщений: 12
По умолчанию

Здравствуйте, подскажите, пожалуйста ,а как сделать проверку на пустую строку, а так же , чтобы программа выполнялась повторно?
temsku2 вне форума Ответить с цитированием
Старый 11.12.2018, 22:33   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от temsku2 Посмотреть сообщение
Здравствуйте, подскажите, пожалуйста ,а как сделать проверку на пустую строку
Цитата:
Сообщение от R71MT Посмотреть сообщение
Цитата:
Код:
mov ah,4ch
int 21h
и ещё, почитай про буфер функции AH=0Ah (ввод строки в буфер).
там в первом байте задаётся макс.возможное кол-во символов,
во-втором байте будет реальное кол-во символов, после ввода
а с третьего байта начинается сам буфер..
если счётчик во втором байте равен нулю - то ничего не ввели.
Вот только надо проверить, пишется ли в буфер нажатый Enter. Если пишется, то счётчик будет не ноль.
Введите пустую строку и постмотрите в отладчике, что получилось в буфере.


Цитата:
Сообщение от temsku2 Посмотреть сообщение
а так же , чтобы программа выполнялась повторно?
jmp на начало программы
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.12.2018, 23:32   #13
temsku2
Пользователь
 
Регистрация: 29.11.2018
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
jmp на начало программы
Извиняюсь, а куда конкретно сделать jmp? не могу понять, мне надо чтобы я снова вводил строку с клавиатуры
Код:
.model small
    .data
    da db "there is a space char$" 
    net db "there isn't$"
    null db "null$"
    sor db 254,0,254 dup ('$')
    .code
    mov ax, @data
    mov ds, ax
    mov ah, 0ah
    lea dx, sor+2
    int 21h
    mov di,dx
compare:
    inc di
    cmp byte ptr [di], 0
    je outp1
    cmp byte ptr [di], 20h
    je outp
    cmp byte ptr [di], "$"
    je outnet
    jmp compare

outp1:
    lea dx, null
    mov ah, 09h
    int 21h
    mov ah, 4ch
    int 21h
    
outp:
    lea dx, da
    mov ah, 09h
    int 21h
    mov ah, 4ch
    int 21h

outnet:
    lea dx, net
    mov ah, 09h
    int 21h
    mov ah, 4ch
    int 21h
 

end
temsku2 вне форума Ответить с цитированием
Старый 12.12.2018, 10:10   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а по какому условию перезапускать программу с начала?

Цитата:
Сообщение от temsku2 Посмотреть сообщение
Извиняюсь, а куда конкретно сделать jmp?
в начало программы, там, где идёт подготовка к вызову функции ввода:
Код:
....
    .code
    mov ax, @data
    mov ds, ax
mystart:
    mov ah, 0ah
    lea dx, sor+2
    int 21h
    mov di,dx

.....

   jmp mystart
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2018, 11:11   #15
temsku2
Пользователь
 
Регистрация: 29.11.2018
Сообщений: 12
По умолчанию

Благодарю. Только возникла проблема, что ввод текста , вывод сообщения и повтор, все идет на одной строке. Как сделать чтобы строка очищалась или был переход на новую?
temsku2 вне форума Ответить с цитированием
Старый 12.12.2018, 11:41   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от temsku2 Посмотреть сообщение
что ввод текста , вывод сообщения и повтор, все идет на одной строке. Как сделать чтобы строка очищалась или был переход на новую?
для перевода на новую строку используйте символы 0Dh, OAh (или, если Вам удобнее, то в десятичной записи 13, 10):
10-возврат кaретки
13-переход на новую строку

проще всего добавить эти символы в конце необходимых строк:
Цитата:
Сообщение от temsku2 Посмотреть сообщение
Код:
da db "there is a space char",0Dh, 0Ah,"$" 
    net db "there isn't",0Dh, 0Ah,"$"
    null db "null",0Dh, 0Ah,"$"
или
Код:
da db "there is a space char",13,10,"$"
но можно и выводить эти символы (возврат каретки/перевод на новую строку == ВК/ПС) и кодом, в нужных местах написав вывод этих символов или вывод строки с этими символами.

почитайте стать по ссылке - возможно, что многие вопросы отпадут - http://www.mini-soft.ru/document/assembler-ibm-pc-7
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2018, 11:49   #17
temsku2
Пользователь
 
Регистрация: 29.11.2018
Сообщений: 12
По умолчанию

Спасибо
temsku2 вне форума Ответить с цитированием
Старый 12.12.2018, 16:48   #18
temsku2
Пользователь
 
Регистрация: 29.11.2018
Сообщений: 12
По умолчанию

Программа работает и все бы хорошо, только вот после нескольких вводов строк , начинает выдавать "there is a space char", даже если была строка без пробела. При пустой строке выдает то, что нужно. С чем это может быть связано?
Код:
.model small
    .data
    da db "there is a space char",0Dh, 0Ah,"$" 
    net db "there isn't",0Dh, 0Ah,"$"
    null db "null",0Dh, 0Ah,"$"
    sor db 254,0,254 dup ('$')
    .code
    mov ax, @data
    mov ds, ax
start:
    mov ah, 0ah
    lea dx, sor+2
    int 21h
    mov di,dx
compare:
    inc di
    cmp byte ptr [di], 0
    je outp1
    cmp byte ptr [di], 20h
    je outp
    cmp byte ptr [di], "$"
    je outnet
    jmp compare

outp1:
    lea dx, null
    mov ah, 09h
    int 21h
    jmp start
    
outp:
    lea dx, da
    mov ah, 09h
    int 21h
    mov ah, 4ch
    jmp start

outnet:
    lea dx, net
    mov ah, 09h
    int 21h
    mov ah, 4ch
    jmp start
 

end
temsku2 вне форума Ответить с цитированием
Старый 12.12.2018, 22:52   #19
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от temsku2 Посмотреть сообщение
С чем это может быть связано?
Ввод строки неправильно организован. Зачем там sor+2 ? И определение конца введённой строки - тоже. Конец старой строки остаётся в буфере и портит результат, если введена более короткая строка. Нужно брать из второго байта буфера реальную длину считанных данных и, например, писать символ '$' по адресу конца строки. Или, как более тупой вариант, каждый раз заново расписывать буфер символами '$'
Black Fregat вне форума Ответить с цитированием
Старый 12.12.2018, 22:53   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

в буфере остаются остатки прошлой строки. А Вы цикл крутите, пока не встретите '$'
так нельзя. Можно вставлять в нужное место строки символ '$', но в данном случае в этом нет необходимости. Ведь у нас уже есть байт, в котором находится количество символов в строке. Достаточно использовать его в качестве счётчика цикла (см. loop), чтобы получить решение:
Код:
.model small
    .data
    promtmsg db 0Dh, 0Ah,"Enter your string (empty line to exit):$"
    da db 0Dh, 0Ah,"there is a space char$" 
    net db 0Dh, 0Ah,"there isn't space char$"
    null db 0Dh, 0Ah,"Your string is empty! Good Bye!",0Dh, 0Ah,"$"
    sor db 254,0,254 dup ("?")
    .code
    mov ax, @data
    mov ds, ax
start:
    ; Вывод приглашения
    lea dx, promtmsg
    mov ah, 09h
    int 21h

    ; ввод строки в буфер
    mov ah, 0ah
    lea dx, sor
    int 21h
    mov di,dx

    ; проверим длину введённой строки
    inc di
    cmp byte ptr [di], 0
    je emptyline

    ; если строка не пустая, организуем цикл
    mov ch,0
    mov cl,byte ptr [di]
compare:
    inc di
    cmp byte ptr [di], 20h
    je findspace
    loop compare

    ; если цикл закончился, то мы не нашли пробел
    lea dx, net
    mov ah, 09h
    int 21h
    jmp start

   
findspace:
    lea dx, da
    mov ah, 09h
    int 21h
    jmp start


emptyline:
    lea dx, null
    mov ah, 09h
    int 21h
    ;завершение программы
    mov     ax,4c00h
    int 21h

end

Последний раз редактировалось Serge_Bliznykov; 12.12.2018 в 22:58. Причина: исправил вызов функции ввода строки, убрал +2 (нужно lea dx, sor )
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код выдает ошибку при вводе 9 строки Николай4434 Помощь студентам 2 10.10.2017 01:17
Предусмотреть соответствующее сообщение при делении на ноль. deconi JavaScript, Ajax 2 09.12.2015 09:30
Как сделать так,что бы при введение,например 0;0 выдавалось сообщение,что точка находится на границе? TEIROP Visual C++ 4 08.11.2015 20:19
С++, подскажите что не так в коде Dima-91 Помощь студентам 13 16.07.2015 13:11
проверяет пароль при открытие формы, движение рисунка Делфи 7 (есть код программы. нужен другой вариант) программирование Помощь студентам 3 29.09.2013 15:47