Страница 1 из 1
TASM - вертикальная линия
Добавлено: 03.01.2014, 22:00
kinders666
Друзья, знающие Ассемблер, прошу помощи! Есть программа, которая рисует
горизонтальную линию, надо её переделать так, чтоб она рисовала
вертикальную линию (по центру, но это я и сам могу сделать). Может кто знает как реализовать? Заранее благодарю!
Код: Выделить всё
cseg segment 'code'
assume cs: cseg, ds:dseg
org 100h
main proc
mov cx, dseg
mov ds, ax
mov ah, 0; графический режим
mov al, 12h; 640*480*16
int 10h
mov col, 04; цвет
mov x0, 0; координата начала линии по горизонтали
mov y0, 240; координата начала линии по вертикали
mov len, 640; длина линии
call draw_vline
mov ah, 8
int 21h
mov ax, 3; восстановление текстового режима
int 10h
mov ax, 4c00h
int 21h
main endp
draw_vline proc
mov cx, x0
push cx
add cx, len
mov x1, cx
pop cx
mov dx, y0
mov ah, 0ch; вывод пикселя на экран
mov al, col
again:
int 10h
inc cx
cmp cx, x1
jb again
ret
draw_vline endp
cseg ends
dseg segment
x0 dw ?
x1 dw ?
y0 dw ?
col db ?
len dw ?
dseg ends
stck segment stack
dw 256 dup(0)
stck ends
end main
Re: TASM - вертикальная линия
Добавлено: 03.01.2014, 22:56
DarkHaze
kinders666
в лс отправил
Re: TASM - вертикальная линия
Добавлено: 03.01.2014, 22:59
kinders666
DarkHaze
Что-то как-то всё очень сложно там :(
Re: TASM - вертикальная линия
Добавлено: 04.01.2014, 00:08
DarkHaze
kinders666
еще такой откопал
Скрытый текст
Код: Выделить всё
.model small
.stack 256 ;устанавливаем размер стека
.code ;сегмент кода
LINE_VERT PROC
PUSHA ;
MOV CX, DX ;значение x
SHL AX,4 ; y<<4
ADD BX,AX ; adr+=y<<4
SHL AX,2 ; (y<<4)<<2
ADD BX,AX ; adr+=(y<<4)<<2
SHR DX,3 ; х>>3
ADD BX,DX ; adr+=x>>3
MOV AH, 10000000B ;маскa
AND CL, 00000111B ;получаем остаток от деления x на 8
SHR AH, CL ;сдвигаем маску на удвоенный остаток
MOV CX,SI ;длина линии
CYCLE:
;---маскируем нужный бит
MOV DX, 03CEH ;указываем на адресный регистр
MOV AL, 8 ;номер регистра
OUT DX, AL ;посылаем его
INC DX ;указываем на регистр данных
MOV AL, AH ;маска
OUT DX, AL ;посылаем данные
;---установка регистра маски карты для
MOV DX,03C4H ;указываем на адресный регистр
MOV AL,2 ;индекс регистра маски карты
OUT DX,AL ;установка адреса
INC DX ;указываем на регистр данных
MOV AL,1111B ;код цвета
OUT DX,AL ;посылаем код цвета
;---чистим текущее содержимое задвижки
MOV AL,ES:[BX] ;читаем содержимое в задвижку
MOV AL,0 ;готовимся к очистке
MOV ES:[BX],AL ;чистим задвижку
;---установка регистра маски карты для цвета
MOV DX,03C4H ;указываем на адресный регистр
MOV AL,2 ;индекс регистра маски карты
OUT DX,AL ;установка адреса
INC DX ;указываем на регистр данных
xor al,al ;
OR AX,DI ;код цвета
OUT DX,AL ;посылаем код цвета
;---рисуем точку
MOV AL,0FFH ;значение со всеми установленными битами
MOV ES:[BX],AL ;выводим точки
ADD BX, 80 ;переходим на следующую
LOOP CYCLE ;строку
EXIT1:
POPA;
RET;
LINE_VERT ENDP;
;--ТЕЛО ОСНОВНОЙ ПРОГРАММЫ
START:
MOV AH,00H ;инициализация графического
MOV AL,010H ;режима
INT 10H ;устанавливаем режим
;магия
MOV DX,3CEH ;указываем на регистр адреса
MOV AL,5 ;инедксируем регистр 5
OUT DX,AL ;посылаем индекс
INC DX ;указываем на регистр режима
MOV AL,0 ;выбираем режим записи 0
OUT DX,AL ;устанавливаем режим
MOV AX,0A000H ;указываем на видеобуфер
MOV ES,AX ;
XOR BX, BX ; обнуляем регистр адреса
MOV AX,200 ; значение координаты y
MOV DX,303 ; значение координаты x
MOV DI,1011 ; значение цвета
MOV SI, 10 ; значение длины
CALL LINE_VERT ;
XOR AX,AX ;ожидание нажатия клавиши
INT 16h
MOV AX,04C00H ;выход из графики с возвратом
INT 21H ;в предыдущий режим
END START
Добавлено спустя 2 минуты 31 секунду:
и такой %)
Скрытый текст
Код: Выделить всё
.model small
.data
table db 128,64,32,16,8,4,2,1
var_x equ 320 ;x
var_y equ 200 ;y
var_color equ 00000110b ;color
var_heigth equ 40
var_width equ 20
var_string_length equ 80
.code
start:
mov ax,@data
mov ds,ax
mov ax,12h ;инициализация графического
int 10h ;режима VGA: 640x480
MOV AX,0A000H ;указываем на видеобуфер
MOV ES,AX ;
MOV BX,0 ;смещение
; сбросим маску
MOV DX,3CEH ;указываем на адресный регистр
MOV AL,8 ;номер регистра
OUT DX,AL ;посылаем его
INC DX ;указываем на регистр данных
MOV AL,0FFH ;маска
OUT DX,AL ;посылаем данные
; чистим текущее содержимое задвижки
MOV AL,0
MOV ES:[BX],AL ;чистим задвижку
; установка регистра маски карты для желтого цвета
MOV DX,3C4H ;указываем на адресный регистр
MOV AL,2 ;индекс регистра маски карты
OUT DX,AL ;установка адреса
INC DX ;указываем на регистр данных
MOV AL,var_color ;код цвета
OUT DX,AL ;посылаем код цвета
; рисуем
mov ax,var_y ; y
mov bx,var_x ; x
mov dx,bx ;
mov cl,3
shr bx,cl ; bx = x/8
and dx,03h ; в dx - битовое смещение
mov cl,4
sal ax,cl ; ax = y*16
add bx,ax ; bx = x/8 + y*16
mov cl,2
sal ax,cl ; ax = y*64
add bx,ax ; в bx = x/8 + y*16 + y*64 = x/8 + y*80 - байтовое смещение
mov si,dx
mov al,table+[si] ; в al - маска
MOV ES:[BX],AL ;выводим точку
;---маскируем все биты, кроме восьмого
MOV DX,3CEH ;указываем на адресный регистр
MOV AL,8 ;номер регистра
OUT DX,AL ;посылаем его
INC DX ;указываем на регистр данных
MOV AL,80H ;маска
OUT DX,AL ;посылаем данные
MOV CX,var_heigth
;-------------------------------------------------
lbl_vertical_lines:
MOV ES:[BX],AL
ADD BX,var_string_length ;переводим на следующую строку (+80 байт)
loop lbl_vertical_lines
;------------------------------------------------
xor ax,ax ;ожидание нажатия клавиши
int 16h
mov ax,4c00h ;выход из графики с возвратом
int 21h ;в предыдущий режим
end start
Re: TASM - вертикальная линия
Добавлено: 05.01.2014, 20:10
kinders666
DarkHaze
Благодарю, последний вариант идеально подошёл!
Можно закрывать тему ^^