Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
13 / 13 / 5
Регистрация: 03.06.2010
Сообщений: 84
1

По экрану (хаотично!) летают два шарика (нули), зеркально отражаясь от его границ. К границе шарики подлетают под углом 45 градусов.

24.11.2011, 21:49. Показов 4083. Ответов 10
Метки нет (Все метки)

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
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
;По экрану (хаотично!) летают два шарика (нули), зеркально отражаясь от его границ. К границе шарики подлетают под углом 45 градусов. 
;Нажатие клавиши SPACE останавливает движение шариков, а последующее нажатие любой другой клавиши снова его возобновляет. 
;Выход из программы по нажатию клавиши ESC или при столкновении шариков.
 
          
model small
 
stack 100h
 
dataseg
    char    db     'O'
        char1   db  'O' 
    posx    db  40 
    posy    db  10 
    posx1   db  34 
    posy1   db  13 
 
 
codeseg
 
...
 
_loop:        m1:   call char_out_1; выводим символ на экран
                    cmp posy, 21
                    ja  razv1
                    inc posy
                    inc posx
                    
                    jne m1
                    
            razv1:  cmp posx, 55
                    je razv2
                    dec posy
                    inc posx 
                    jne m1
                    
            razv2:  
                    jne m1   
 
...
 
char_out_1 proc near        ; вывод первого шарика
    mov ah, 02h     ; в указанной позиции
    mov dh, posy
    mov dl, posx
    int 10h
 
    mov ah, 09h
    mov bl, 07h
    mov al, char
    mov cx, 1
    int 10h
 
    ret
    
    
char_out_1 endp
 
...
 
// описываем 2ю процедуру char_out_2 proc near(здесь не совсем понял с регистрами)
 
 
end
Общий цикл задал, не могу разобраться с условиями, здесь по идее условие в условии должно быть. И так проверку на каждую границу экрана.

Как задать задержку, чтоб шарики не летали по экрану как угорелые?

Не могу разобраться с выводом второго шарика. так то я его вывожу и даж летит он в одну сторону, а под 45 градусов категорически отказывается...

Добавлено через 11 минут
С циклом задержки разобрался
Assembler
1
2
3
4
5
6
7
mov bx,00f9fh; Цикл задержки, вроде
m100:
mov cx,0ffffh
m200:
loop m200
dec bx
jnz m100
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2011, 21:49
Ответы с готовыми решениями:

Анимация (в пикчербоксе летают два шарика и при соприкосновении отталкиваются)
Пытаюсь сделать анимацию, где в пикчербоксе летают два шарика и при соприкосновении отталктваются ...

Рассчитать траекторию падения шарика под углом к горизонту
составить падение шарика под углом

Градиент под углом ~40 градусов
Доброго времени суток. Как можно реализовать градиент (угол ~40 градусов) как на картинке?

Движение под углом 45 градусов
Вобщем что то у меня тут не получаеться вывести чтобы нормально двигался шарик под углом,...

10
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
25.11.2011, 03:51 2
Цитата Сообщение от Alest
45 градусов категорически отказывается
Исходи из того, что матрица знакоместа - 8х16, т.е. по х надо бы прибавлять 2.

Добавлено через 5 часов 37 минут
Alest, вобщем, развлекайся:писано грязно, но работает
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
;include 'macro\masm.inc'
struc BALL x, y, ch, atr, dx, dy, ox, oy
{
.db  x     ; 0
.db  y     ; 1
.ch db  ch    ; 2
.atr    db  atr   ; 3
.dx db  dx    ; 4
.dy db  dy    ; 5
.ox db  ox    ; 6
.oy db  oy    ; 7
}
    org 100h
    push    cs
    pop ds
        ; очистка экрана
        call clear_scr
 
        ; главный цикл
_loop:  ;call char_out; выводим символ на экран
 
        mov     ah, 1       ; считываем код нажатой клавиши
        int     16h
        jz  draw
        cmp     ah, 1
        jz  exit       ; если это <ESC>
draw:   
    mov si, ballG
    call    ball
    call    delay
    mov si, ballR
    call    ball
    call    delay
    mov si, ballB
    call    ball
    call    delay
    mov si, ballY
    call    ball
    call    delay
    jmp _loop
 
 
exit:   call clear_scr
        mov ah, 4ch
        int 21h
 
 
clear_scr: ; proc       ; функция очистки экрана
        mov ax, 0600h
        mov bh, 07h
        mov cx, 0000h
        mov dx, 184fh
        int 10h
        ret
;clear_scr       endp
 
char_out:; proc
draw1:  ; proc near
        mov ah, 02h             ; в указанной позиции
        mov dh, [si+6]  ; ox
        mov dl, [si+7]       ; oy
        mov bh, 0
        int 10h
    mov ax, 0A20h
    xor bx,bx
    mov cx,1
    int 10h
                      ; вывод текущего символа
        mov ah, 02h             ; в указанной позиции
        mov dh, [si]    ; .x
        mov dl, [si+1]       ; .y
        mov bh, 0
        int 10h
 
        mov     ah, 09h
        mov al, [si+2]          ; chr
        mov bl, [si+3]      ; atr
        mov bh, 0
        mov cx, 1
        int 10h
        ret
;char_out endp
 
; проверки на допустимость и изменения координат символа
ball:
    mov al,[si]     ; y
    mov [si+6],al   ; oy
    add al, [si+4]  ; dy
    jz  @b0
    cmp al, 25
    jb  @b1
@b0:    neg byte [si+4] ; dy
@b1:    mov [si], al        ; y
;
    mov al,[si+1]   ; x
    mov [si+7],al       ; ox
    add al, [si+5]      ; dx
    jz  @b2
    cmp al, 80
    jb  @b3
@b2:    neg byte [si+5] ; dx
@b3:    mov [si+1], al      ; x
    call    draw1
    ret
 
delay:  pusha
    mov dx,378h     ; это LPT0:
    mov ecx, 0FFFh ; подбери сам
@_loop: in  al,dx
    loop    @_loop
    popa
    ret
 
ballR   BALL     0,  0, '*', 4, 1, 2, 0, 0
ballG   BALL    10, 14, '*', 2, -1,-2, 0, 0
ballB   BALL    10, 70, '*', 1, -1,2, 0, 0
ballY   BALL    20, 40, '*', 0Eh, 1,-2,0, 0
 
;end    start
1
Ушел с форума
Автор FAQ
16338 / 7659 / 1075
Регистрация: 11.11.2010
Сообщений: 13,697
25.11.2011, 08:51 3
Alest, создай анимированный gif-файл с хаотично летающими двумя шарами отскакивающие от границ рисунка (лучше в 3D) Преподаватель всё равно не поймет, рисунок это или программа
1
Ушел с форума
Автор FAQ
16338 / 7659 / 1075
Регистрация: 11.11.2010
Сообщений: 13,697
25.11.2011, 09:56 4
лови! Написано под WinXP под Vista и семеркой работать не будет!
Вложения
Тип файла: zip temp.zip (11.8 Кб, 42 просмотров)
1
13 / 13 / 5
Регистрация: 03.06.2010
Сообщений: 84
25.11.2011, 13:38  [ТС] 5
Цитата Сообщение от Mikl___ Посмотреть сообщение
Alest, создай анимированный gif-файл с хаотично летающими двумя шарами отскакивающие от границ рисунка (лучше в 3D) Преподаватель всё равно не поймет, рисунок это или программа
у нас так и делают)
Такой способ никакой возможности не оставляет разобраться в коде..

Добавлено через 30 минут
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Добавлено через 5 часов 37 минут
Alest, вобщем, развлекайся:писано грязно, но работает
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
;include 'macro\masm.inc'
struc BALL x, y, ch, atr, dx, dy, ox, oy
{
.db  x     ; 0
.db  y     ; 1
.ch db  ch    ; 2
.atr    db  atr   ; 3
.dx db  dx    ; 4
.dy db  dy    ; 5
.ox db  ox    ; 6
.oy db  oy    ; 7
}
    org 100h
    push    cs
    pop ds
        ; очистка экрана
        call clear_scr
 
        ; главный цикл
_loop:  ;call char_out; выводим символ на экран
 
        mov     ah, 1       ; считываем код нажатой клавиши
        int     16h
        jz  draw
        cmp     ah, 1
        jz  exit       ; если это <ESC>
draw:   
    mov si, ballG
    call    ball
    call    delay
    mov si, ballR
    call    ball
    call    delay
    mov si, ballB
    call    ball
    call    delay
    mov si, ballY
    call    ball
    call    delay
    jmp _loop
 
 
exit:   call clear_scr
        mov ah, 4ch
        int 21h
 
 
clear_scr: ; proc       ; функция очистки экрана
        mov ax, 0600h
        mov bh, 07h
        mov cx, 0000h
        mov dx, 184fh
        int 10h
        ret
;clear_scr       endp
 
char_out:; proc
draw1:  ; proc near
        mov ah, 02h             ; в указанной позиции
        mov dh, [si+6]  ; ox
        mov dl, [si+7]       ; oy
        mov bh, 0
        int 10h
    mov ax, 0A20h
    xor bx,bx
    mov cx,1
    int 10h
                      ; вывод текущего символа
        mov ah, 02h             ; в указанной позиции
        mov dh, [si]    ; .x
        mov dl, [si+1]       ; .y
        mov bh, 0
        int 10h
 
        mov     ah, 09h
        mov al, [si+2]          ; chr
        mov bl, [si+3]      ; atr
        mov bh, 0
        mov cx, 1
        int 10h
        ret
;char_out endp
 
; проверки на допустимость и изменения координат символа
ball:
    mov al,[si]     ; y
    mov [si+6],al   ; oy
    add al, [si+4]  ; dy
    jz  @b0
    cmp al, 25
    jb  @b1
@b0:    neg byte [si+4] ; dy
@b1:    mov [si], al        ; y
;
    mov al,[si+1]   ; x
    mov [si+7],al       ; ox
    add al, [si+5]      ; dx
    jz  @b2
    cmp al, 80
    jb  @b3
@b2:    neg byte [si+5] ; dx
@b3:    mov [si+1], al      ; x
    call    draw1
    ret
 
delay:  pusha
    mov dx,378h     ; это LPT0:
    mov ecx, 0FFFh ; подбери сам
@_loop: in  al,dx
    loop    @_loop
    popa
    ret
 
ballR   BALL     0,  0, '*', 4, 1, 2, 0, 0
ballG   BALL    10, 14, '*', 2, -1,-2, 0, 0
ballB   BALL    10, 70, '*', 1, -1,2, 0, 0
ballY   BALL    20, 40, '*', 0Eh, 1,-2,0, 0
 
;end    start
Спасибо!!!

ток чет не пойму как её запустить, чтоб под себя подогнать..

C:\ASMTool PE>ML /coff temp.asm
Assembling: temp.asm
error A4910: cannot open file: C:\ASMTool PE\ml.err
temp.asm(2) : error A2008: : struc
temp.asm(3) : error A2045:
temp.asm(4) : error A2008: : x
temp.asm(5) : error A2008: : y
temp.asm(6) : error A2008: : ch
temp.asm(7) : error A2008: : atr
temp.asm(8) : error A2008: : dx
temp.asm(9) : error A2008: : dy
temp.asm(10) : error A2008: : ox
temp.asm(11) : error A2008: : oy
temp.asm(12) : error A2045:
...
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

LINK : fatal error LNK1181: cannot open input file "temp.obj"

Компиляция завершена.... Всего ошибок: 0, Фатальных ошибок: 0
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
25.11.2011, 13:42 6
Закомментарить стр.2-10, в стр 95-98 BALL поменять на db
1
13 / 13 / 5
Регистрация: 03.06.2010
Сообщений: 84
25.11.2011, 15:07  [ТС] 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
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
model small
 
stack 100h
 
dataseg
    char    db               'O'
                    char1   db  'O' 
    posx    db  4 ;горизонтальная координата
    posy    db  2 ;вертикальная координата
    posx1   db  1 ;горизонтальная координата
    posy1   db  1 ;вертикальная координата
 
codeseg
 
    startupcode
 
    ; очистка экрана
    call clear_scr
 
    ; главный цикл
_loop:        m1:   call char_out_1; выводим символ на экран
                   cmp posy, 24              
                    je  razv1  
             m2:    mov ah,posy1                  ;
                    add posy, ah
                    mov ah, 1
                    add posx, ah
                 ;   int 21h
               
                    jne m1
                    
            razv1:  cmp posy, 1        ;отражает
                    je razv2
                    mov posy1,-1 
                    jne m2
                    
            razv2:  cmp posx, 60
                    je razv2
 
    mov ah, 0   ; считываем код нажатой клавиши
    int 16h
    cmp al, ' ' ; если это символ
;   je space
    cmp al, 09
    jne _loop       ; если это Tab
    jmp exit
 
 
exit:   call clear_scr
    mov ah, 4ch
    int 21h
 
    
clear_scr   proc near   ; функция очистки экрана
    mov ax, 0600h
    mov cx, 0000h
    mov dx, 184fh
    int 10h
clear_scr   endp
 
 
char_out_1 proc near        ; вывод первого шарика
    mov ah, 02h     ; в указанной позиции
    mov dh, posy
    mov dl, posx
    int 10h
 
    mov ah, 09h
    mov bl, 07h
    mov al, char
    mov cx, 1
    int 10h
    
    ; Цикл задержки
;                 mov bx,00078h        ;00f9fh
;                 m100:
;                 mov cx,0dfffh              ;0ffffh
;                 m200:
;                 loop m200
;                 dec bx
;                 jnz m100   
    ret
    
    
char_out_1 endp
 
end
Добавлено через 7 минут
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Закомментарить стр.2-10, в стр 95-98 BALL поменять на db
запустилась, спасибо!!!)

Добавлено через 1 час 1 минуту
Charles Kludge:
проверку на доступность и изменение координат так и не понял..)) чтож, буду открывать книжку и разбираться)
возможно мыслю более объективно, после изучения языков высокого уровня.

Добавлено через 2 минуты
Осталось обработать пробел(при нажатии прерывать цикл, при повторном нажатии возобновлять). и приступать к следующей задаче)
0
10 / 10 / 0
Регистрация: 22.11.2011
Сообщений: 85
Записей в блоге: 1
29.05.2013, 20:58 8
Alest, если не трудно - можете выкинуть финальный вариант вашей рабочей программы? Очень надо
0
73 / 74 / 4
Регистрация: 25.09.2012
Сообщений: 211
29.05.2013, 21:19 9
NikoX_93, Если учесть, что ТС заходил на форум примерно год назад, то финальный вариант программы он вряд ли здесь выложит.
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
30.05.2013, 06:06 10
NikoX_93, а в чём проблема-то?
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
30.05.2013, 11:42 11
Charles Kludge, наверное, в том, что он не может, как ТС, открыть книжку и разобраться xD
0
30.05.2013, 11:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2013, 11:42
Помогаю со студенческими работами здесь

Вектор под углом 90 градусов
Как можно провести вектор Ed* что бы как на рисунке был угол между А и вектором Ed* угол 90...

Построить синусоиду под углом к OX в 45 градусов
Здравствуйте, есть интересная задача (по крайней мере для меня). Итак, нужно построить синусоиду...

Рисование линий под углом в 45 градусов
Всё перерыл нигде нет этого а надо очень(((( помогите пожалуйста Необходимо написать программу...

Передвижение объекта под углом 45 градусов
Здравствуйте, подскажите как сделать передвижение объекта(Shape1) если нажать две кнопки(вверх,...

вывести содержимое формы под углом 90 градусов
имеется функция SDK которой передается хэндл окна, а она на нем рисует видеопоток с IP-камеры. в...

Вращение вокруг точки под углом 45 градусов
Нужно реализовать вращение под углом 45 к двум осям (У и Х) Пробовал так: position =...


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

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