Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
44 / 44 / 11
Регистрация: 10.06.2009
Сообщений: 311
Записей в блоге: 2
1

Квадрат изображается крив. Графика.

22.05.2011, 14:49. Показов 2046. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте).. вот есть программка:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.model small
.stack 100h
.186
.code
 
mov ax,13h   ;режим 320*200
int 10h
mov ax,0a000h  ; начало
mov es,ax
mov al, 15; белая точка
mov di,0; координата верхнего левого угла квадрата
mov cx, 320
aa: 
push cx
mov cx,200
rep stosb
add di,0; сдвигаюсь на 0 точек (=320-320)
pop cx
loop aa 
mov ax,0
 
mov ah,7  ; klavisha ESC
int 21h
cmp al,1bh
je vihod
vihod:
mov ah,4ch
int 21h
 
end
На весь экран рисуется квадрат белого цвета. Как только хочу нарисовать полквадрата, получаю какую-то ступенчатую фигуру.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.model small
.stack 100h
.186
.code
 
mov ax,13h   ;режим 320*200
int 10h
mov ax,0a000h  ; начало
mov es,ax
mov al, 15; белая точка
mov di,0; координата верхнего левого угла квадрата
mov cx, 220
aa: 
push cx
mov cx,200
rep stosb
add di,100; сдвигаюсь на 0 точек (=320-220)
pop cx
loop aa 
mov ax,0
 
mov ah,7  ; klavisha ESC
int 21h
cmp al,1bh
je vihod
vihod:
mov ah,4ch
int 21h
 
end
Если кто знает в чём может быть проблема, сообщите, пожалуйста

Проблема решена.

Assembler
1
2
3
4
mov cx, 200
aa: 
push cx
mov cx,220
прошу прощения за срач)...

Добавлено через 1 час 2 минуты
Продолжу в этой же темы дабы новую не создавать).. Как заставить нарисованный квадрат плавно менять цвет?)..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2011, 14:49
Ответы с готовыми решениями:

Не изображается картинка
Здравствуйте, помогите разобраться VS 2010 ->Web Site -> Default.aspx В браузере не...

Не изображается CheckBox
ребят изучаю яву совсем недавно, буквально пару месяцев, столкнулся с такой проблемой не...

Графика. Повернуть квадрат
Не могли бы помочь. Нужно повернуть квадрат на определённый угол который вводится с клавиатуры. ...

Графика.Как нарисовать квадрат?
Собственно вопрос в теме...как нарисовать простейий квадрат с помощью линий

7
5001 / 1673 / 409
Регистрация: 25.04.2010
Сообщений: 4,623
Записей в блоге: 2
22.05.2011, 21:16 2
Как заставить нарисованный квадрат плавно менять цвет?)..
Через регистры VGA, управляемые через порты: 3С8h, 3С9h.
В 3C8h записываете номер цвета, далее в 3C9h поочерёдно записываете 3 числа первое красная компонента, второе - зелёная компонента и последнее - синяя. Значения компонент расположены в диапазоне от 0 до 63 включительно.
Чтобы плавно менять окрас, нужно делать это по таймеру(вектор 1Ch), перехватываете вектор, внутрь засовываете счётчик и пару условий для бесконечного изменения значений палитры. Отрисовку ставите в беск. цикл.
1
44 / 44 / 11
Регистрация: 10.06.2009
Сообщений: 311
Записей в блоге: 2
22.05.2011, 23:02  [ТС] 3
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
mov si,offset pallete ; смешение на палитру
change_col:
 
    mov dx,3c8h     ; порт видео палитры (3C8h) 
    xor al,al       ; установить индекс палитры 0
    out dx,al       ; Вывод байта или слова в порт  
 
    mov dx,3c9h                  ; порт записи 3C9h
    lodsb
    cmp al,255  ; Дошли до конца палитры? 255-маркер конца
    jne skip_pal    
    mov si,offset pallete ; если дошли до конца - смещение на начало
    lodsb
skip_pal:
    out dx,al   ; красный цвет в порт
    lodsb
    out dx,al   ; зеленую компоненту
    lodsb
    out dx,al   ; и синию 
 
    xor ah,ah   ; ждем нажатие клавиши
    int 16h
    cmp al,27   ; нажата ESC?
    jne change_col  ; нет - меняем палитру по кругу
 
    mov ax,3    ; установим текстовый режим 80x25
    int 10h
    int 20h     ; выходим.
 
pallete db 63,0,0   ; красный цвет
    db 0,63,0   ; зеленый цвет
    db 0,0,63   ; синий
    db 63,63,63 ; белый
    db 0,0,0    ; черный
    db 255
что-то на подобии этого куска кода?)..Если да, то как его прилепить к предыдущему, чтобы заработало?)..
0
44 / 44 / 11
Регистрация: 10.06.2009
Сообщений: 311
Записей в блоге: 2
25.05.2011, 10:28  [ТС] 4
Всё еще нужна помощь).. Общее задание: вращение квадрата и смена цвета, по горизонтали)..

Принцип вращения: есть белый квадрат. Справа и слева белый превращается в чёрный. Дойдя до середины, белая центральная линия начинает движение влево, а за не появляются линии другого цвета. И так пока весь квадрат не зарисуется новым цветом. Затем зелёные линии слева и справа начинают превращаться в чёрный и т.д.)

У меня в 1м посте рисуется горизонтальная линия).. А нужна ведь вертикальная).. Вот возникли определённые трудности)..

1. Занесение точки в координаты. Т.е. сделать точку, например, А(0,0), где координата Х - максимум 320, а координата Y - максимум 200. Чтобы нарисовать вертикальную линию, Y увеличиваем до 1. Если Y=200, сбрасываем в 0, увеличиваем Х на 1 и повторяем процедуру увеличения координаты Y. Если достигло максимальных значений - перейти к изменению цвета.
2. Смена цвета. Начиная с координаты (0,0)-(0,200) и (320,0)-(320,200) начать закрашивания линий к центральной - координаты (160,0)-(160, 200). Если дошли до этой координаты, центральную линию смещать до линии координатами (50,0)-(50,200), а справа закрашивать другим цветом.

Т.е. квадрат рисовать умею, вертикальные, горизонтальные линии тоже. Основные проблемы описаны выше

For Troll: я не прошу пользователей написать мне готовую программу. Прошу лишь подтолкнуть на правильный путь, как это сделал >Quiet Snow<
0
5001 / 1673 / 409
Регистрация: 25.04.2010
Сообщений: 4,623
Записей в блоге: 2
25.05.2011, 11:15 5
1. Занесение точки в координаты.
Вы работаете с памятью размером 64000 байт, адрес складывается из X и Y, общая формула
Adress = Y * 320 + X
На асме это что то типа(Заранее извиняюсь за неоптимальный код):

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 ; Сохраним сначала все регистры . . .
    Mov di, Y   ; DI = Y
    Mov cx, X
    Cmp di, 199
       Ja NoDraw   ; Клиппинг по Y
    Cmp cx, 319
       Ja NoDraw   ; Клиппинг по X
    Shl di, 6    ; Y * 64
    Mov ax, di ; дублируем Y
    Shl ax, 2    ; Y * 256
    Add di, ax  ; DI = Y * 320
    Add di, cx
    Mov ax, 40960
    Mov es, ax
    Mov al, COLOR
    StoSb
NoDraw:
 ; Далее восстановим регистры . . .
Допишите и засуньте этот код куда-нибудь в процедуру, потом ознакомьтесь с целочисленным алгоритмом брозенхема и напишите процедуру по отрисовке линии. Тогда вам уже просто будет сделать то, что хотите(хотя лично я из сказанного вами мало что понял, на словах такие вещи лучше не объяснять, а нарисовать где н-ть в фотошопе и прикрепить к сообщению).
Поначалу смоделируйте, что требуется на любом высокоуровневом языке, а потом уже на ассемблере реализуйте, так же ведь проще...
1
44 / 44 / 11
Регистрация: 10.06.2009
Сообщений: 311
Записей в блоге: 2
27.05.2011, 00:00  [ТС] 6
Очередной вопрос)..

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
.model small
.stack 100h
.186
.data
green db 0,63,0
white db 63,63,63
black db 0,0,0
red db 63,0,0
blue db 0,0,63
 
koorx dw 10
 
.code
mov ax,@data
mov ds,ax
 
mov ax,13h   ;режим 320*200
int 10h
mov ax,0a000h  ; начало
mov es,ax
 
mov al,1
mov cx,50
white_palet:
push cx
whitepalitra PROC NEAR
mov dx,03c8h
out dx,al
mov dx,03c9h
mov cx,3
mov si,offset white
rep outsb
whitepalitra endp
sub cx,1
add al, 1
pop cx
jne white_palet
 
mov al,51
mov cx,50
green_palet:
push cx
greenpalitra PROC NEAR
mov dx,03c8h
out dx,al
mov dx,03c9h
mov cx,3
mov si,offset green
rep outsb
greenpalitra endp
sub cx,1
add al, 1
pop cx
jne green_palet
 
mov al,101
mov cx,50
red_palet:
push cx
redpalitra PROC NEAR
mov dx,03c8h
out dx,al
mov dx,03c9h
mov cx,3
mov si,offset red
rep outsb
redpalitra endp
sub cx,1
add al, 1
pop cx
jne red_palet
 
mov al,151
mov cx,50
blue_palet:
push cx
bluepalitra PROC NEAR
mov dx,03c8h
out dx,al
mov dx,03c9h
mov cx,3
mov si,offset blue
rep outsb
bluepalitra endp
sub cx,1
add al, 1
pop cx
jne blue_palet
 
mov al,201
mov cx,50
black_palet:
push cx
blackpalitra PROC NEAR
mov dx,03c8h
out dx,al
mov dx,03c9h
mov cx,3
mov si,offset red
rep outsb
blackpalitra endp
sub cx,1
add al, 1
pop cx
jne black_palet
 
mov al, 1
mov di, 50+320*50; координата верхнего левого угла квадрата
mov cx,100
a1:
stosb
add di,319
loop a1
 
;a3:add al,1
;sal di,1
;loop a2
;pop cx
;push cx
;loop a3
 
mov ah,7  ; klavisha ESC
int 21h
cmp al,1bh
je vihod
vihod:
mov ah,4ch
int 21h
 
end
Рисуется линия с индексом цвета 1. Надо нарисовать прямоугольник, стоящий из 50 линий и у каждой будет свой цветовой индекс).. Рисовать так как рисовал первую линию я думаю будет глупо).. А вот как сделать через цикл пока не получается(.. Помогите, пожалуйста)

Как сделать так, чтобы нарисовалось 50 линий и каждая со своим цветовым индексом?))..

Добавлено через 4 часа 27 минут
Как заставить координату Х в di увеличиваться на 1?)

Добавлено через 27 минут
Надо получить компактны код вот этого мусора:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
mov al, 1
mov di, 50+320*50; координата верхнего левого угла квадрата
pop cx
push cx
a1:
stosb
add di,319
sub cx,1
jnz a1
 
mov al, 2
mov di, 51+320*50; координата верхнего левого угла квадрата
pop cx
push cx
a2:
stosb
add di,319
sub cx,1
jnz a2
 
mov al, 3
mov di, 52+320*50; координата верхнего левого угла квадрата
pop cx
push cx
a3:
stosb
add di,319
sub cx,1
jnz a3
 
mov al, 4
mov di, 53+320*50; координата верхнего левого угла квадрата
pop cx
push cx
a4:
stosb
add di,319
sub cx,1
jnz a4
 
mov al, 5
mov di, 54+320*50; координата верхнего левого угла квадрата
pop cx
push cx
a5:
stosb
add di,319
sub cx,1
jnz a5
 
mov al,6
mov di, 55+320*50; координата верхнего левого угла квадрата
pop cx
push cx
a6:
stosb
add di,319
sub cx,1
jnz a6
 
mov al, 7
mov di, 56+320*50; координата верхнего левого угла квадрата
pop cx
push cx
a7:
stosb
add di,319
sub cx,1
jnz a7
 
mov al,8
mov di, 57+320*50; координата верхнего левого угла квадрата
pop cx
push cx
a8:
stosb
add di,319
sub cx,1
jnz a8
 
mov al, 9
mov di, 58+320*50; координата верхнего левого угла квадрата
pop cx
push cx
a9:
stosb
add di,319
sub cx,1
jnz a9
 
mov al, 10
mov di, 59+320*50; координата верхнего левого угла квадрата
pop cx
push cx
a10:
stosb
add di,319
sub cx,1
jnz a10
Тут я рисую 10 разных линий с разными индексами цвета. Как можно осуществить такое же, но чтобы код не был таким здоровым?)..

Добавлено через 9 минут
и снова вопросик по поводу процедуры)..

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mov al,51
mov cx,50
green_palet:
push cx
greenpalitra PROC NEAR
mov dx,03c8h
out dx,al
mov dx,03c9h
mov cx,3
mov si,offset green
rep outsb
greenpalitra endp
sub cx,1
add al, 1
pop cx
jne green_palet
Чтобы изменить цвет первой линии с индексом 1, выполняю следующие действия:
Assembler
1
2
mov al, 1
call greenpalitra
Но в данном случае закрашиваются все 50 линий(.. Может я что-то в процедуре упустил?.. Почему зарисовывается весь прямоугольник?

Добавлено через 30 минут
Сам в своей же теме флужу))..

Сообразил такой цикл вывода 50 линий разных индексов

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mov cx,51
mov ax,cx
 
mov cx,100
push cx
 
mov al, 1
mov di, 50+320*50; координата верхнего левого угла квадрата
mov si,di
a2:pop cx
push cx
a1:
stosb
add di,319
sub cx,1
jnz a1
 
sub ax,1
mov cx,ax
add al,1
mov di,si
add di,1
mov si,di
jnz a2
Но зарисовывается вся площадь 320*200.. Снова вопрос).. В чём подвох у меня в коде?).. Помогите, товарисчи)..
0
766 / 310 / 11
Регистрация: 27.05.2011
Сообщений: 703
27.05.2011, 13:27 7
вот написал по быстрому.
проверить не могу, если будут ошибки курсани.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
data segment
data ends
 
code segment
assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
    
    mov ax,0a000h       ;адрес видеобуфера
    mov es,ax   
    mov ax,13h      ;видеорежим
    int 10h
 
    mov si,320*50+100   ;стартовая точка
 
    ;цвета линиям будут назначены по порядку
    mov cx,50           ;кол-во линий
           mov bx,100                              ;длина линий
    xor ax,ax
n0: 
    inc ax
    call LINE           ;вызов процедуры
    
    sub si,bx           ;возврат на длину линии
    add si,320          ;переход на новую строку
    
    cmp ax,15           ;проверка на цвета, ну само собой до 15
    jle n2
    xor ax,ax   
n2:
    loop n0 
    
    
    mov ah,10h      ;ожидание
    int 16h 
    mov ah,4ch      ;выход
    int 21h
    
LINE proc
    push cx
    mov cx,bx
n1:
    mov byte ptr es:[si],al
    inc si
    loop n1
    pop cx
    ret
LINE endp
code ends
end start
0
44 / 44 / 11
Регистрация: 10.06.2009
Сообщений: 311
Записей в блоге: 2
28.05.2011, 13:07  [ТС] 8
zzzyyyxxx, спасибо, но Ваша программа мне не подходит по коду Я не прошу написать готовую программу, прошу лишь помощи в поиске ошибок в моей)..

Вот часть кода, отвечающая за рисование 50 вертикальных линий).. вот что опять в нём не так?)..
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mov cx,100
push cx
 
mov cx,50
mov al, 1
mov di, 50+320*50; координата верхнего левого угла квадрата
a2:pop cx
a1:
stosb
add di,319
sub cx,1
jnz a1
push cx
sub cx,1
add al,1
add di,1
loop a2
Вся программа:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
.model small
.stack 100h
.186
.data
green db 0,63,0
white db 63,63,63
black db 0,0,0
red db 63,0,0
blue db 0,0,63
 
;koorx dw ?
;koory dw ?
 
.code
mov ax,@data
mov ds,ax
 
mov ax,13h   ;режим 320*200
int 10h
mov ax,0a000h  ; начало
mov es,ax
 
;mov bx,koorx
;mov dx,koory
 
mov al,1
mov cx,50
white_palet:
push cx
whitepalitra PROC NEAR
mov dx,03c8h
out dx,al
mov dx,03c9h
mov cx,3
mov si,offset white
rep outsb
whitepalitra endp
sub cx,1
add al, 1
pop cx
jne white_palet
 
mov al,51
mov cx,50
green_palet:
push cx
greenpalitra PROC NEAR
mov dx,03c8h
out dx,al
mov dx,03c9h
mov cx,3
mov si,offset green
rep outsb
greenpalitra endp
sub cx,1
add al, 1
pop cx
jne green_palet
 
mov al,101
mov cx,50
red_palet:
push cx
redpalitra PROC NEAR
mov dx,03c8h
out dx,al
mov dx,03c9h
mov cx,3
mov si,offset red
rep outsb
redpalitra endp
sub cx,1
add al, 1
pop cx
jne red_palet
 
mov al,151
mov cx,50
blue_palet:
push cx
bluepalitra PROC NEAR
mov dx,03c8h
out dx,al
mov dx,03c9h
mov cx,3
mov si,offset blue
rep outsb
bluepalitra endp
sub cx,1
add al, 1
pop cx
jne blue_palet
 
mov al,201
mov cx,50
black_palet:
push cx
blackpalitra PROC NEAR
mov dx,03c8h
out dx,al
mov dx,03c9h
mov cx,3
mov si,offset red
rep outsb
blackpalitra endp
sub cx,1
add al, 1
pop cx
jne black_palet
 
mov cx,100
push cx
 
mov cx,50
mov al, 1
mov di, 50+320*50; координата верхнего левого угла квадрата
a2:pop cx
a1:
stosb
add di,319
sub cx,1
jnz a1
push cx
sub cx,1
add al,1
add di,1
loop a2
 
mov ah,7  ; klavisha ESC
int 21h
cmp al,1bh
je vihod
vihod:
mov ah,4ch
int 21h
 
end
0
28.05.2011, 13:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2011, 13:07
Помогаю со студенческими работами здесь

Графика. Не получается сделать нормальный квадрат
public partial class Form1 : Form { public Form1() { ...

Сколько точек графика попали в заданный квадрат
ребят, помогите пожалуйста решить задачу... Задать произвольные координаты n точек x(i),y(i)....

Не работает мать, индикатор post кодов не изображается
Процессор: AMD Ryzen 7 1700X Материнская плата: BIOSTAR X370GT7 Водяная система охлаждения:...

Графика. Вывести квадрат со стороной, равной введенному числу
1) составьте программу,запрашивающую ввод целого числа (от 5 до 10) и выводящую в центр экрана...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru