Консультация № 173804
28.10.2009, 20:42
0.00 руб.
0 8 1
Срочно нужна помощь! В ассемблере пока новичок, н пока получилось только нарисовать вертикальную линию. Нужно нарисовать домик.

Обсуждение

давно
Старший Модератор
31795
6196
28.10.2009, 20:50
общий
rammsteinkwic:
Памятку внимательно прочитайте и добавьте нужную информацию.
Особенно такой пункт.
На что еще нужно обратить внимание:
Эксперты с большим удовольствием помогут Вам, если Вы покажете результаты своих проб. Не переживайте насчет ошибок. Подправим.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
28.10.2009, 20:50
общий
Ну, ребяты, Вы ведь видели страницу вопроса, на которой показано как задавать вопросы здесь!
В каком ассемблере? Для какой ОС? В каком режиме (текстовый, графический)?
Неизвестный
28.10.2009, 21:42
общий
Boriss:
Простите, совсем забыл.
Tasm; для x86; Windows, Граф.
вот прога. http://dump.ru/file/3665063
Неизвестный
28.10.2009, 21:53
общий
Видет вопрос похожий на др. форуме, рисовать наклонные прямые это посложнее горизонтальных и вертикальных будет. Рисование линий в некоторых ВУЗах на курсовую работу тянет. Вообще если очень захотеть, алгоритм можно найти в книге Зубкова, только комментариев там не очень много.
Откуда тут виндовс это ДОС
Код:
        mov  AX,11h   
int 10h ; видеорежим 640x480
Неизвестный
28.10.2009, 23:20
общий
Посмотрел. А что не понятно? - считать надо. Что Вам не понятно? Не понятно в том, как сделать?
Неизвестный
28.10.2009, 23:30
общий
Airyashov:
Зачем пугаете? Тут не требуется, по все видимости, особых мер и алгоритмов, тем более, что 45 градусов будет вполне достаточно
Неизвестный
29.10.2009, 01:09
общий
Можно хотя бы пример как нарисовать квадрат?
давно
Посетитель
7438
7205
29.10.2009, 10:13
общий
это ответ
Здравствуйте, rammsteinkwic.
Вот Вам домик с окошком
При рисовании линии задаем начальную точку, смещение по X и Y (таким образом, задаем направление), а также количество точек.
Программа с синтаксисом TASM
Удачи!

Приложение:
.model tiny, C

.code
org 100h
.186

start: mov ax,11h ;640х480х2
int 10h

;Сам дом
call line, 200, 450, 1, 0, 240
call line, 440, 450, 0, -1, 240
call line, 440, 210, -1, 0, 240
call line, 200, 210, 0, 1, 240
;Крыша
call line, 200, 210, 1, -1, 120
call line, 320, 90, 1, 1, 120
;Окно
call line, 280, 370, 1, 0, 80
call line, 360, 370, 0, -1, 80
call line, 360, 290, -1, 0, 80
call line, 280, 290, 0, 1, 80
;Внутри окна
call line, 280, 310, 1, 0, 80
call line, 320, 310, 0, 1, 60

mov ah,0 ;ждем любую клавишу
int 16h ;для выхода

mov ax,3 ;установим текстовый режим
int 10h

mov ax, 4c00h
int 21h ;выход в ДОС

;Рисуем линию от точки (x, y) c направлением (deltax, deltay),
;и состоящую из count точек
line proc x:word, y:word, deltax:word, deltay:word, count:word
uses cx, dx, si

mov si, count
mov cx, x
mov dx, y
line_loop:
call SetPixel, cx, dx, 1

add cx, deltax
add dx, deltay
dec si ;счетчик точек
jnz line_loop

ret
line endp

; Name: PixelAddr
; Function: Определяет позицию пикселя в буфере VGA в режиме 640x480
;
; Caller: AX = y-координата 0-479
; BX = x-координата 0-639
;
; Returns: AH = битовая маска
; BX = смещение байта в видеобуфере
; CL = число сдвигов для сдвига маски влево
; ES = сегмент видеобуфера

BytesPerLine EQU 80 ; число байт в одной гор.линии
VideoBufferSeg EQU 0A000h

PixelAddr PROC near
mov cl,bl ; CL := младший байт x

push dx ; сохраним DX

mov dx,BytesPerLine ; AX := y * BytesPerLine
mul dx

pop dx
shr bx,1
shr bx,1
shr bx,1 ; BX := x/8
add bx,ax ; BX := y*BytesPerLine + x/8
; BX - смещение байта в видеобуфере

mov ax,VideoBufferSeg
mov es,ax ; ES:BX := адрес байта пикселя

and cl,7 ; CL := x & 7
xor cl,7 ; CL := число сдвигов для сдвига маски влево
mov ah,1 ; AH := несдвинутая маска
ret

PixelAddr ENDP

; Name: SetPixel
;
; Function: Устанавливает значение пикселя в режиме 640x480
;
; void SetPixel(x,y,n);
;
; int x,y; /* координаты пикселя */
;
; int n; /* цвет пикселя */

RMWbits EQU 0 ; read-modify-write bits

SetPixel PROC ARGx:word, ARGy:word, ARGn:word
uses cx, dx, bx, es

mov ax,ARGy ; AX := y
mov bx,ARGx ; BX := x
call PixelAddr ; AH := битовая маска
; ES:BX -> буфер
; CL := число сдвигов

; установка регистра битовой маски графического контроллера (GC)

shl ah,cl ; AH := битовая маска в соответствующей позиции
mov dx,3CEh ; порт регистра адреса GC
mov al,8 ; AL := номер регистра битовой маски
out dx,ax

; установка регистра режима GC

mov ax,0005h ; AL := номер регистра режима
; AH := режим записи 0 (биты 0,1)
; режим чтения 0 (бит 3)
out dx,ax

; установка регистра выбора вращения/функции

mov ah,RMWbits ; AH := биты Read-Modify-Write (=0)
mov al,3 ; AL := регистр выбора Data Rotate/Function
out dx,ax

; установка регистров установки/сброса и разрешения установки/сброса

mov ah,byte ptr ARGn; AH := цвет пикселя
mov al,0 ; AL := регистр установки/сброса
out dx,ax

mov ax,0F01h ; AH := разрешаем все цветовые слои
; AL := регистр разрешения установки/сброса
out dx,ax

; установка значения пикселя

or es:[bx],al ; загрузка в защелки во время чтения
; и установка во время записи

; восстановим значения по-умолчанию

mov ax,0FF08h ; маска битов
out dx,ax

mov ax,0005 ; регистр режима
out dx,ax

mov ax,0003 ; выбор функции
out dx,ax

mov ax,0001 ; разрешение установки/сброса
out dx,ax

ret
SetPixel ENDP

end start
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа