Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Вывод строки на экран 2 способами

Автор: Neon6868 9.03.2008 7:19

Задание: Написать на ассемблере 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

Автор: xds 9.03.2008 10:58

Программа №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


Автор: xds 9.03.2008 11:42

Второй вариант я переделал:

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

Автор: Neon6868 12.03.2008 20:43

Спасибо за помощь! А нельзя мне сказать где во 2 программе ошибки и помочь их исправить? Просто я хочу понять что я делал не так, да и твою программу еще понять надо, а я в ассемблере пока не очень разбираюсь.

Автор: xds 12.03.2008 23:36

Основные ошибки:
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.


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

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

Автор: Jil 1.04.2010 18:46

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

Автор: Федосеев Павел 2.02.2015 22:07

Покажи, что ты делаешь.