Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2008, 16:08   #1
AsmBeginer
Пользователь
 
Регистрация: 09.01.2008
Сообщений: 12
По умолчанию Работа с графикой на ассемблере под DOS

Здравствуйте . Я более-менее знаю АСМ, но применяю, с трудом.
Вот написал исходник, чтоб вывести вертикальную линию. И не получается. Горизонтальная выводится без проблем:

Код:
.model	tiny
	.code
	 org	100h		; COM-файл
	.186			; для команды shr cx,3
start:
        mov  AX,11h
        int  10h		; видеорежим 640x480

        MOV  AH,0CH        ;ф-ия установки точки
        MOV  AL,3          ;выбираем цвет 3 палеты

        mov  CX, 100

label_1:

        MOV  DL,100        ;строка
        INC   DL
 
        ;MOV  DH,10        ;столбец
        ;INC   DH

        INT  10H          ;выводим точку
	
loop Label_1
	
	MOV	ah,0		; ожидание нажатия клавиши
	INT	16h
	
	ret			; конец программы
end	start
Пишу в WinAsm 2.0, под ХР

Последний раз редактировалось AsmBeginer; 09.01.2008 в 16:19.
AsmBeginer вне форума Ответить с цитированием
Старый 09.01.2008, 17:49   #2
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Код:
org    100h

start:   
        mov  AX,11h   
        int  10h
  
        MOV  AH,0CH
        MOV  AL,3

        mov  CX, 100    ;Столбец, X
        mov  DX, 200    ;Строка, Y

label_1:   

        inc  cx
        int  10h

        cmp  cx, 200
        jle  label_1

       
    MOV ah,0
    INT 16h   
       
    ret
* Fasm
пыщь
JTG вне форума Ответить с цитированием
Старый 09.01.2008, 17:53   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

попробуй так:
Код:
.model  tiny   
    .code   
     org    100h        ; COM-файл   
    .186            ; для команды shr cx,3   
start:   
        mov  AX,11h   
        int  10h        ; видеорежим 640x480   
  
        MOV  AH,0CH        ;ф-ия установки точки   
        MOV  AL,3          ;выбираем цвет 3 палеты   
  
        mov  CX, 100   

        MOV DX, 100        ;строка   
label_1:            
        
        xchg dx, cx
        INT  10H          ;выводим точку   
        xchg dx, cx
       
loop Label_1   
       
    MOV ah,0        ; ожидание нажатия клавиши   
    INT 16h   
       
    ret         ; конец программы   
end start
rpy3uH вне форума Ответить с цитированием
Старый 10.01.2008, 15:27   #4
AsmBeginer
Пользователь
 
Регистрация: 09.01.2008
Сообщений: 12
По умолчанию

JTG: почему-то полоса горизонтальная.
груЗиН: спасибо. Полоса вертикальная.
AsmBeginer вне форума Ответить с цитированием
Старый 10.01.2008, 18:07   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

тю, я думал понятно
once more:
Код:
      mov  CX, 100    ;начальная координата Х
       mov  DX, 100    ;начальная координата Y
  
label_1:      
  
        inc  cx    ; Х=Х+1
        int  10h   ; вывести пиксель
  
        cmp  cx, 200   ; если Х <= 200
        jle  label_1      ; goto label_1
т.е. это нарисует серию точек с координатами (100,100)..(200,100)
для вертикальной линии увеличивать надо координату Y (inc dx) и сравнивать тоже её (cmp dx,200)
пыщь
JTG вне форума Ответить с цитированием
Старый 11.01.2008, 15:17   #6
AsmBeginer
Пользователь
 
Регистрация: 09.01.2008
Сообщений: 12
По умолчанию

JTG: все получилось. Спасибо.
AsmBeginer вне форума Ответить с цитированием
Старый 11.01.2008, 16:07   #7
AsmBeginer
Пользователь
 
Регистрация: 09.01.2008
Сообщений: 12
По умолчанию


Вот теперь хочу двигать точку по экрану вверх-вниз:
Код:
.model	tiny
	.code        
	org	100h 

begin:	jmp setup

setup:
        mov AX,11h
        int 10h

        MOV AH,0CH
        MOV AL,3

        mov CX, 200    ;столбец, X
        mov DX, 200    ;строка, Y
        int 10h

main_loop_2:	
	mov ah,7         ;ждем символ с клавиатуры		
	int 21h		
	test al,al         ;проверка на 0-е начало		
	jnz exit_loop_2 ;если да, выходим	
	int 21h		
	cmp al,50h      ;сравнение со стрелкой вниз	
	je key_down    ;переход в обработчик
	cmp al,48h      ;сравнение со стрелкой вверх	
	je key_up        ;переход в обработчик

exit_loop_2:			
	mov ax,3		
	int 10h
	ret			

key_down:			
	dec dx		
	jns setup
key_up:		
	inc dx		
	jns setup
RET
end	begin
Точка отображается.
При нажатии на стрелки 'вниз', 'вверх' происходит гашение экрана, через секунду, опять включение, точка остается недвижимой

Последний раз редактировалось AsmBeginer; 11.01.2008 в 16:10.
AsmBeginer вне форума Ответить с цитированием
Старый 11.01.2008, 17:54   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Код:
.model  tiny   
    .code           
    org 100h    
  
begin:  jmp setup    ;ненужный прыжок
  
setup:   
        mov AX,11h   
        int 10h   
  
        MOV AH,0CH   
        MOV AL,3   
  
        mov CX, 200    ;столбец, X   
        mov DX, 200    ;строка, Y   
        int 10h   
  
main_loop_2:       
    mov ah,7         ;ждем символ с клавиатуры         
    int 21h        
    test al,al         ;проверка на 0-е начало         
    jnz exit_loop_2 ;если да, выходим
;Фигня: прыжок на комманду рисовать, а в AL сейчас левый код клавиши 

    int 21h        
    cmp al,50h      ;сравнение со стрелкой вниз    
    je key_down    ;переход в обработчик   
    cmp al,48h      ;сравнение со стрелкой вверх       
    je key_up        ;переход в обработчик   
  
exit_loop_2:               
    mov ax,3           
    int 10h   
    ret            
  
key_down:              
    dec dx         
    jns setup 
key_up:        
    inc dx         
    jns setup ; тут прыжок не в то место вообще, поэтому "При нажатии на стрелки 'вниз', 'вверх' происходит гашение экрана..."
RET   
end begin
Чуть переделаный код
Код:
.model  tiny      
    .code              
    org 100h  
begin:
        mov AX,11h   
        int 10h   
    
        mov CX, 200    ;столбец, X
        mov DX, 20    ;строка, Y
        int 10h   
  
key_loop:

    mov ah,7         ;ждем символ с клавиатуры         
    int 21h
    cmp  al,27      ; Нажали Esc?
    je   quit          ; Да, выход
    test al,al         ;проверка на 0-е начало         
    jnz key_loop   ;если да, не выходим, а ждём другую клавишу
    int 21h        
    cmp al,50h      ;сравнение со стрелкой вниз    
    je key_down    ;переход в обработчик   
    cmp al,48h      ;сравнение со стрелкой вверх       
    je key_up        ;переход в обработчик   
  
draw:

    MOV AH,0CH
    MOV AL,3
    int 10h   
    jmp key_loop
  
key_down:              
    inc dx
    jmp draw
key_up:        
    dec dx
    jmp draw

quit:
    ret 
end begin
пыщь
JTG вне форума Ответить с цитированием
Старый 14.01.2008, 12:24   #9
AsmBeginer
Пользователь
 
Регистрация: 09.01.2008
Сообщений: 12
По умолчанию

Я изменил твой код, немного. У тебя получалось рисование линии. Я изменил, чтоб только точка перемещалась по экрану:
Код:
.model	tiny 
	.code        
	org	100h 
begin:
        mov AX,11h
        int 10h

        mov CX, 320    
        mov DX, 240    
        MOV AH,0CH
        MOV AL,3
        int 10h

key_loop:
    mov ah,7         
    int 21h

    cmp  al,27      
    je   quit          
    test al,al         
    jnz key_loop   
    int 21h

    cmp al,50h      
    je key_down    

    cmp al,48h      
    je key_up        
    
    cmp al,4Bh
    je key_left
    
    cmp al,4Dh
    je key_right
    
    cmp al,47h
    je key_home
    
    cmp al,49h
    je key_pgap
    
    cmp al,4Fh
    je key_end
    
    cmp al,51h
    je key_pgdn

draw:
    MOV AH,0CH
    MOV AL,3
    int 10h
    jmp key_loop

key_down:
    MOV AH,0CH
    MOV AL,0
    int 10h
    inc dx
    jmp draw
    
key_up:
    MOV AH,0CH
    MOV AL,0
    int 10h
    dec dx
    jmp draw
    
key_left:
    MOV AH,0CH
    MOV AL,0
    int 10h
    dec cx
    jmp draw
    
key_right:
    MOV AH,0CH
    MOV AL,0
    int 10h
    inc cx
    jmp draw
    
key_home:
    MOV AH,0CH
    MOV AL,0
    int 10h
    dec dx
    dec cx
    jmp draw

key_pgap:
     MOV AH,0CH
     MOV AL,0
     int 10h
     dec dx
     inc cx
     jmp draw
     
key_end:
     MOV AH,0CH
     MOV AL,0
     int 10h
     inc dx
     dec cx
     jmp draw

key_pgdn:
     MOV AH,0CH
     MOV AL,0
     int 10h
     inc dx
     inc cx
     jmp draw

quit:
    ret
end begin
Если убрать из процедур key_(...), вот такой код:
Код:
     MOV AH,0CH
     MOV AL,0
     int 10h
, то можно рисовать на экране

Существует возможность перевести экран в разрешение 1024х768?
AsmBeginer вне форума Ответить с цитированием
Старый 14.01.2008, 13:28   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Стандартными средствами дос - нет.
В паскале это можно было сделать, подключив драйвер svga256.bgi (поддерживает разрешение до 1280x1024 8bit), а как на ассемблере - хз, да и незачем наверно такое разрешение в досе.

У мну в подписе программа - вывод фрактала Серпинского, там вообще разрешение 320х200, а вывод на экран прямой записью в видеобуффер
пыщь

Последний раз редактировалось JTG; 14.01.2008 в 13:32.
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
help с графикой SYL@R Помощь студентам 3 07.07.2008 08:11
ПРоблемы с графикой HELP!!! ANARHIST Помощь студентам 2 03.07.2008 09:04
помогите с графикой glasian Помощь студентам 8 26.06.2008 00:15
работа с массивом на ассемблере dmk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 12.12.2007 19:50