Lazar
Гость
|
|
« : 06-05-2007 07:19 » |
|
Добрый день, господа программисты.
Искренняя просьба помочь: при выполнении программы не происходит вывода строк var1 и var2 (приглашение ввода переменных). Среда пишет лишь Press enter to exit и завершает работу.
.model small .stack 100h .data
.code start: mov ax,@data mov ds,ax xor ax,ax ;-----------------------------------------------
Data segment
var1 db 'Введите А=$' var2 db 'Введите В=$'
A dw ? B dw ?
Data ends
Code segment
;Вводим данные ;Вводим переменную A lea dx,var1 mov ah,09h int 21h ;Вводим переменную B lea dx,var2 mov ah,09h int 21h
Code ends
;-----------------------------------------------
mov ax,4c00h int 21h end start
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 06-05-2007 10:37 » |
|
насчёт правильности вызова прерываний ничего толком не подскажу... А вот попробовать вместо апострофов кавычки можно -
var1 db "Введите А=$",0; var2 db "Введите В=$",0;
|
|
|
Записан
|
|
|
|
Lazar
Гость
|
|
« Ответ #2 : 06-05-2007 11:07 » |
|
Эх... с ковычками та же история. Почему-то не выводит на экран строки var1 и var2... грустно...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 06-05-2007 11:32 » |
|
Lazar, достал я умную книгу и , насколько я понял, надо делать так
var1 db 'Введите А=$' var2 db 'Введите В=$'
bufA_Beg: bufA_size db 10; размер буфера ввода (bufA_str) bufA_entered db 0; количество введённых символов bufA_str bufA_size dup(0)
bufB_Beg: bufB_size db 10; размер буфера ввода (bufB_str) bufB_entered db 0; количество введённых символов bufb_str bufB_size dup(0)
Code segment
;Вводим данные ;Вводим переменную A lea dx,var1 mov ah,09h int 21h
lea dx,bufA_Beg mov ah,0ah int 21h
;Вводим переменную B lea dx,var2 mov ah,09h int 21h
lea dx,bufB_Beg mov ah,0ah int 21h
Code ends
Код не тестировал...
|
|
|
Записан
|
|
|
|
Lazar
Гость
|
|
« Ответ #4 : 06-05-2007 14:44 » |
|
Спасибо за помощь.
При попытке компилирования текста, ругается на строку bufA_str bufA_size dup(0), говорит: illegal instructions...
Какую смысловую нагрузку несёт эта строка?
Ещё раз, спасибо.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 07-05-2007 12:36 » |
|
Lazar, блин , это я туплю )))
так попробуй:
bufA_size_const equ 10
bufA_Beg: bufA_size db bufA_size_const; размер буфера ввода (bufA_str) bufA_entered db 0; количество введённых символов bufA_str bufA_size_const dup(0)
Смысловая нагрузка - bufA_size_const - это размер буфера для приёма введённой строки , размер указывается в ячейке bufA_size , а также при резервации массива bufA_str
|
|
|
Записан
|
|
|
|
Lazar
Гость
|
|
« Ответ #6 : 08-05-2007 13:48 » |
|
Вновь здравствуйте, Алексей 1153++. Проблему с лабораторной после долгих изысканий ликвидировал-таки. Однако, их ещё много. Вот листинг написанной мной проги: SEGMENT .text org 100h start: ;------------------------------- ;Vyviod pervogo soobsheniya mov ah,40h mov bx,1 mov cx,26 mov dx,titl1 int 21h ;Vvod pervoy stroki mov ah,3fh mov bx,0 mov cx,80 mov dx,buffer1 int 21h add ax,9 mov cx,ax ;------------------------------- ;Vyvod vtorogo soobsheniya mov ah,40h mov bx,1 mov cx,27 mov dx,titl2 int 21h ;Vvod vtoroy stroki mov ah,3fh mov bx,0 mov cx,80 mov dx,buffer2 add ax,9 mov cx,ax int 21h ;-------------------------------- ;Sravneniye pyatih simvolov mov dx,[buffer1+4] cmp dx,[buffer2+4] je equal mov ah,40h mov bx,1 mov cx,19 mov dx,titl4 int 21h int 20h equal: mov ah,40h mov bx,1 mov cx,15 mov dx,titl3 int 21h int 20h ;------------------------------- SEGMENT .data titl1 db 'Enter the first string: ',13,10 titl2 db 'Enter the second string: ',13,10 titl3 db 'Symbols equal',13,10 ;15 bayt titl4 db 'Symbols not equal',13,10 ;19 bayt buffer1 TIMES 20 db 0 buffer2 TIMES 20 db 0 Теперь стало жутко интересно. Каким образом покрасить в какой-либо отличный от белого цвет строки?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 08-05-2007 15:20 » |
|
Lazar, да мы тут на "ты" все ))
Вижу, что подсказал я фигню, а ты сам разобрался ) Молодец.
а по цвету я нашёл только функцию 09h прерывания 10h
вход: AH =09h BH = номер видеостраницы AL = ASCII-код символа BL = байт-атрибут CX = число повторений
байт-атрибут- бит 7 = мигающий символ биты 6..4 = цвет фона бит 3 = символ яркого цвета биты 2..0 = цвет символа
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #8 : 08-05-2007 15:30 » |
|
а можно вопрос (автору топика)? $ зачем в строке? а ответив на этот вопрос автор поймет как изменить цвет
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 08-05-2007 16:14 » |
|
Sla, екскейп последовательности что ли какие то ? )
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #10 : 08-05-2007 19:40 » |
|
Алексей1153++, значок "$" используется в MSDOS как терминатор строки для функции вывода строки (ф-ия 09h int 21h).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 08-05-2007 20:01 » |
|
это я уже понял... а с цветом как всё таки ? ) Что то 09h of 10h как-то неудобно выглядит, или так кажется ?
|
|
|
Записан
|
|
|
|
Lazar
Гость
|
|
« Ответ #12 : 09-05-2007 05:04 » |
|
Доброго времени суток, господа. Всех с праздником Великой Победы.
Успел сегодня уже поэксперементировать с цветом и вот, что получил: Программа выводит сообщение 'Hello' синим цветом. Получил посредством занесения в bl двухразрядной константы. А как добиться мигания строки?
SEGMENT .text org 100h start:
mov ah,09h mov bx,1 mov bl,01 mov cx,11 mov dx,titl1 int 10h
int 21h int 20h
SEGMENT .data titl1 db 'Hello$',13,10
|
|
|
Записан
|
|
|
|
Lazar
Гость
|
|
« Ответ #13 : 09-05-2007 05:08 » |
|
И ещё такой вопрос: каким образом в программе по вводу строк реализовать вывод пятых символов строк? Это необходимо сделать, если эти символы не совпадают. Сравнить-то я их, конечно, сравнил... Слышал, что возможно получить доступ к отдельному байту регистра... Вот листинг:
SEGMENT .text org 100h
start: ;------------------------------- ;Vyviod pervogo soobsheniya mov ah,40h mov bx,1 mov cx,26 mov dx,titl1 int 21h
;Vvod pervoy stroki mov ah,3fh mov bx,0 mov cx,80 mov dx,buffer1 int 21h
cmp ax,7 jl egog
;------------------------------- ;Vyvod vtorogo soobsheniya mov ah,40h mov bx,1 mov cx,27 mov dx,titl2 int 21h
;Vvod vtoroy stroki mov ah,3fh mov bx,0 mov cx,80 mov dx,buffer2
int 21h
cmp ax,7 jl egog
;--------------------------------
;Sravneniye pyatih simvolov mov dx,[buffer1+4] cmp dx,[buffer2+4] je equal
mov ah,40h mov bx,1 mov cx,19 mov dx,titl4
int 21h int 20h
equal: mov ah,40h mov bx,1 mov cx,15 mov dx,titl3
int 21h int 20h
egog: mov ah,40h mov bx,1 mov cx,55 mov dx,titlegog int 21h int 20h ;------------------------------- SEGMENT .data titl1 db 'Enter the first string: ',13,10 titl2 db 'Enter the second string: ',13,10 titl3 db 'Symbols equal',13,10 ;15 bayt titl4 db 'Symbols not equal',13,10 ;19 bayt titlegog db 'Operation failed. You need entered more than 4 symbols.',13,10 ;55 byte buffer1 TIMES 20 db 0 buffer2 TIMES 20 db 0 lengthbuffer1 equ $-buffer1 lengthbuffer2 equ $-buffer2
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 09-05-2007 07:36 » |
|
Lazar, и тебя с праздником )
>>Слышал, что возможно получить доступ к отдельному байту регистра...
- конечно можно, только ты про какой регистр то говоришь ? Может 5-й символ в строке ? Ну в этом случае адрес его (символа) ты так и получай
[buffer1+4]
______________ кстати, тут у тебя такая косячина -
buffer1 TIMES 20 db 0 buffer2 TIMES 20 db 0 lengthbuffer1 equ $-buffer1; == 2*sizeof(buffer1) lengthbuffer2 equ $-buffer2; == sizeof(buffer2)
надо так:
buffer1 TIMES 20 db 0 lengthbuffer1 equ $-buffer1
buffer2 TIMES 20 db 0 lengthbuffer2 equ $-buffer2
buffer1 TIMES lengthbuffer1 db 0 buffer2 TIMES lengthbuffer2 db 0
|
|
« Последнее редактирование: 09-05-2007 07:44 от Алексей1153++ »
|
Записан
|
|
|
|
Lazar
Гость
|
|
« Ответ #15 : 09-05-2007 10:13 » |
|
Получить доступ к каждому в отдельности и сравнить символы получилось, а вот как их вывести... Мда... А за окном День Победы... Теперь маюсь с выводом цифр из регистров. Скучаю по C++
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 09-05-2007 11:01 » |
|
а вот как их вывести...
точно так же, как и до этого ) . Побысраму можно сделать вот что: к примеру ты хочешь вывести 5-й символ. 1) запоминаешь где нибудь значение 6-го символа буфера. 2) заменяешь 6-й символ на "$" 3) печатаешь строку , начиная с 5-го символа 4) возвращаешь 6-й символ на место
|
|
|
Записан
|
|
|
|
Lazar
Гость
|
|
« Ответ #17 : 09-05-2007 11:29 » |
|
Алексей, а существует ли какая-либо стандартная процедура вывода содержимого регистра? Ведь в каждой более или менее серьёзной программе это обязательно понадобится... Битый час мучаю nasm...
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #18 : 09-05-2007 11:42 » |
|
Lazar, Тут проблема такая, а как ты интерпретируеш данные в регистре? Это может быть целочисленное число, дробное число, символ и т.д.
Насколько я помню, в 16h прерывании есть вывод одного символа, который записан в регистр AL
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Lazar
Гость
|
|
« Ответ #19 : 09-05-2007 12:11 » |
|
Мда, действительно. Похоже придётся писать отдельный алгоритм интерпретации данных... Ночь длинная...
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #20 : 09-05-2007 20:21 » |
|
Рекомендую зайти > сюда< и скачать "Tech Help! 4.0". Я всегда в таких вопросах прибегаю к этому мануалу.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Starech
Гость
|
|
« Ответ #21 : 11-02-2008 23:02 » |
|
А почему б не воспользоваться прямым выводом на экран?
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #22 : 14-02-2008 05:04 » |
|
А почему б не воспользоваться прямым выводом на экран?
Вы уважаемый думайте что прямой вывод в видеопамять самый лучший способ, тогда ответте мне, кто будет за Вас курсор передвигать.
|
|
|
Записан
|
|
|
|
Starech
Гость
|
|
« Ответ #23 : 15-02-2008 03:16 » |
|
Посмотрим, ответ дам позже. Кстати не забудте что есть и функции передвигающие этот курсор... В конце программы просто передвенуть в нужное место экрана! [ главное не промазать ]
|
|
|
Записан
|
|
|
|
Starech
Гость
|
|
« Ответ #24 : 25-02-2008 09:51 » |
|
процедура вывода пятых символов на экран (извиняюсь не тестировал, поэтому могут быть маленькие ошибки!)
... mov ax,0B800h mov es,ax xor di,di ; ES:DI начало видеобуфера mov ah,3 mov bh,3 ; чтение положения курсора в видеорежиме 3 (BH) int 10h
mov al,dh ; берём строку mov bl,80 ; умножаем на кол-во символов в строке mul bl add al,dl ; прибавляем столбец xor ah,ah add ax,ax ; при прямом выводе на экран каждый второй байт это атрибут mov di,ax
mov al,byte ptr [buffer1+4] mov ah,0Fh ; атрибут символа stosw ; выводим add di,160 ; берём строку ниже mov al,byte ptr [buffer2+4] stosw ; выводим второй символ... inc dh inc dl mov ah,2 int 10h ; устанавливаем курсор на позиции после выводимого символа ...
|
|
|
Записан
|
|
|
|
ZапятАЯ
Гость
|
|
« Ответ #25 : 16-04-2008 18:20 » |
|
Привет! Я недавно начала изучать Ассемблер, и пишем мы программки в CompModel. И вот, что обидно - знаю, как решать задачу, а записать не могу((( Кто-нибудь знает этот CompModel???
|
|
|
Записан
|
|
|
|
|