IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> Вывод строки на экран 2 способами, Не правильно работает программа.
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Задание: Написать на ассемблере IBM PC 2 программы вывода строки на экран:
1)прямой записью в видеопамять
2)с использованием функций BIOS.
Направление строки снизу вверх, в цветности задать цвет фона, символы вывести разными цветами.

Проверьте плиз правильно работают программы или нет? Я сам проверить не могу. У меня на виндусе вообще ничего не выводится, могу проверить только на линуксе в универе. У меня есть сомнения, что вторая программа не правильно работает! Заранее спасибо! smile.gif

Программа №1.

 model small
  stack 100h
  .data
  message db 'Operacionnaya sistema'
  .code
  main:
  mov ax,@data
  mov ds,ax
  mov ax,0B800h
  mov es,ax
  mov di,0C8Ah
  mov si,0
  mov ah,00010000b
  mov cx,21
m1:
  mov ax,es:[di]
  mov al,message[si]
  add ah,00000001b
  inc si
  mov es:[di],ax
  sub di,160
  loop m1
  mov ax,4c00h
  int 21h
  end main


Программа №2.

 model small
  .stack 100h
  .data
  message db 'Operacionnaya sistema'
  .code
main:
  mov ax,@data
  mov ds,ax
  mov cx,1
  mov si,1
  mov dh,21
  mov dl,5
  mov bh,0
m1:
  mov ah,02h
  int 10h
  mov ah,09h
  mov al,message[si]
  add bl,00000001b
  int 10h 
  inc si
  dec dh
  inc bl
  loop m1
  mov ax,4c00h
  int 21h
  end main
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Программа №1 работает в Windows после небольших дополнений (под словом "линукс" имелся в виду DosBox? smile.gif) :
 model small
  stack 100h
  .data
  message db 'Operacionnaya sistema'
  .code
  main:

  mov ax,3		;! установка видеорежима 80 x 25
  int 10h		;!

  mov ax,@data
  mov ds,ax
  mov ax,0B800h
  mov es,ax
  mov di,0C8Ah
  mov si,0
  mov ah,00010000b
  mov cx,21
m1:
  mov ax,es:[di]
  mov al,message[si]
  mov ah,70h
  inc si
  mov es:[di],ax
  sub di,160
  loop m1

  mov ah,8		;! задежка перед выходом до нажатия любой клавиши
  int 21h		;!

  mov ax,4c00h
  int 21h
  end main



--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Второй вариант я переделал:
model small
.186

.stack 2048

.const
msg	db 'Operating system',0

.code
start:
	mov ax,@data
	mov ds,ax

	lea si,msg	;ds:si -> msg
	cld		;lodsb будет увеличивать si

	mov dh,22	;начальная строка
	mov dl,5	;начальная колонка
	mov bl,1	;начальный цвет

put_char:
	cmp byte ptr [si],0	;провека на конец строки
	je exit

	mov ah,2	;установка положения курсора
	int 10h

	xor bh,bh	;ah = аттрибут на экране в позиции курсора
	mov ah,8	
	int 10h
	
	shr ah,4	;ah = цвет фона

	cmp bl,ah	;не допускаем слияния символа с фоном
	jne load_char
	inc bl

load_char:
	lodsb		;очередной символ: al = ds:[si], si = si + 1

	mov bh,ah	;вывод символа
	mov cx,1
	mov ah,9
	int 10h

	dec dh		;следующая строка
	inc bl		;следующий цвет
	and bl,0Fh
	jmp put_char

exit:
	mov ah,8	;ждем нажатия любой клавиши
	int 21h
	mov ax,4C00h	;выход
	int 21h

end start


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Спасибо за помощь! А нельзя мне сказать где во 2 программе ошибки и помочь их исправить? Просто я хочу понять что я делал не так, да и твою программу еще понять надо, а я в ассемблере пока не очень разбираюсь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Основные ошибки:
1. cx одновременно используется и как счетчик цикла, и как параметр функции вывода символа (int 10h, ah = 2); в итоге, сделали cx = 1 - выводить один экземпляр символа, а про loop забыли.
2. Забыли сохранять цвет фона (по условию). Перед выводом символа надо узнать атрибут в позиции вывода - функция int 10h, ah = 8.

В моем варианте для чтения строки используются команда lodsb, которая делает следующее:
al = ds:[si], если df = 0, то si = si + 1 иначе si = si - 1.

Значение флага направления df задается командами cld и std:
cld: df = 0;
std: df = 1.


В моем варианте признаком конца строки является нулевой байт.

Вообще, достаточно подробно откомментировано - читай по порядку и разбирайся.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






А можете если не трудно.сказать что и где нужно исправить что бы как в видео режиме так и в биосе что бы цвет фона был цветом символов???=)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


Покажи, что ты делаешь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 6.04.2025 4:31
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name