Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите начинающим!  (Прочитано 22831 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 06-05-2007 10:37 » 

насчёт правильности вызова прерываний ничего толком не подскажу... А вот попробовать вместо апострофов кавычки можно -

var1 db "Введите А=$",0;
var2 db "Введите В=$",0;
Записан

Lazar
Гость
« Ответ #2 : 06-05-2007 11:07 » 

Эх... с ковычками та же история. Почему-то не выводит на экран строки var1 и var2... грустно... Жаль
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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...

Какую смысловую нагрузку несёт эта строка?

Ещё раз, спасибо.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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

Теперь стало жутко интересно. Каким образом покрасить в какой-либо отличный от белого цвет строки?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 08-05-2007 15:30 » 

а можно вопрос (автору топика)?
$ зачем в строке?
а ответив на этот вопрос автор поймет как изменить цвет Улыбаюсь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 08-05-2007 16:14 » 

Sla, екскейп последовательности что ли какие то ? )
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 08-05-2007 19:40 » 

Алексей1153++, значок "$" используется в MSDOS как терминатор строки для функции вывода строки (ф-ия 09h int 21h).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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++ Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #18 : 09-05-2007 11:42 » 

Lazar, Тут проблема такая, а как ты интерпретируеш данные в регистре? Это может быть целочисленное число, дробное число, символ и т.д.

Насколько я помню,  в 16h прерывании есть вывод одного символа, который записан в регистр AL
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Lazar
Гость
« Ответ #19 : 09-05-2007 12:11 » 

Мда, действительно.
Похоже придётся писать отдельный алгоритм интерпретации данных...

Ночь длинная... Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 09-05-2007 20:21 » 

Рекомендую зайти >сюда< и скачать "Tech Help! 4.0". Я всегда в таких вопросах прибегаю к этому мануалу.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Starech
Гость
« Ответ #21 : 11-02-2008 23:02 » 

А почему б не воспользоваться прямым выводом на экран?
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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???
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines