TASM - вертикальная линия

Для тех, кто хочет сделать мир лучше.
Ответить
Сообщение
Автор
Аватара пользователя
kinders666
Модератор
Модератор
Сообщения: 4163
Зарегистрирован: 25.10.2006
Откуда: Москва
Благодарил (а): 537 раз
Поблагодарили: 191 раз

#1 Сообщение 03.01.2014, 22:00

Друзья, знающие Ассемблер, прошу помощи! Есть программа, которая рисует горизонтальную линию, надо её переделать так, чтоб она рисовала вертикальную линию (по центру, но это я и сам могу сделать). Может кто знает как реализовать? Заранее благодарю!

Код: Выделить всё

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
Изображение
Изображение

Аватара пользователя
DarkHaze
Полковник
Полковник
Сообщения: 5555
Зарегистрирован: 10.02.2009
Благодарил (а): 16 раз
Поблагодарили: 518 раз
Контактная информация:

#2 Сообщение 03.01.2014, 22:56

kinders666
в лс отправил

Аватара пользователя
kinders666
Модератор
Модератор
Сообщения: 4163
Зарегистрирован: 25.10.2006
Откуда: Москва
Благодарил (а): 537 раз
Поблагодарили: 191 раз

#3 Сообщение 03.01.2014, 22:59

DarkHaze
Что-то как-то всё очень сложно там :(
Изображение
Изображение

Аватара пользователя
DarkHaze
Полковник
Полковник
Сообщения: 5555
Зарегистрирован: 10.02.2009
Благодарил (а): 16 раз
Поблагодарили: 518 раз
Контактная информация:

#4 Сообщение 04.01.2014, 00:08

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

Аватара пользователя
kinders666
Модератор
Модератор
Сообщения: 4163
Зарегистрирован: 25.10.2006
Откуда: Москва
Благодарил (а): 537 раз
Поблагодарили: 191 раз

#5 Сообщение 05.01.2014, 20:10

DarkHaze
Благодарю, последний вариант идеально подошёл!
Можно закрывать тему ^^
Изображение
Изображение

Ответить