Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   программа на Ассемблере (http://forum.oszone.net/showthread.php?t=30152)

himik 17-11-2003 12:44 207534

помогите плиз
переместить по экрану символ вертикально
спасибо.

shurikan 18-11-2003 03:39 207535

himik
Ну, полностью код писать не буду. Наводку даю:
(я так понимаю, что это требуется под DOS)

Способ 1.
Используем прерывние 10h (видео) функции скроллирование прямоугольной области экрана.
Если в ah записать число 06h, то скроллинг осуществляется вверх, а если 07h, то - вниз. Остальные аргументы одинаковы для обеих функций.
ch, cl - соответственно номера строки и колонки левого верхнего угла области скроллинга, (для всего экрана эти координаты 0 и 0)
dh, dl - номера строки и колонки правого нижнего угла области скроллинга,
al - количество строк, на которое нужно произвести сдвиг,
bh - видео атрибут (цвет символа и фона) для заполнения пустого места, например 07h - светло серый символ на черном фоне.

Способ 2.
Прямое обращение к видеопамяти.
Код:


 *push ds
 *mov *ax,0B800h
 *mov *ds,ax
 *mov *ax, Y
 *mul *160
 *add *ax, X
 *add *ax, X
 *mov *dx,[ax]
 *sub *ax, 160 ; для сдвига вверх
 *add *ax, 160 ; для сдвига вниз
 *mov *[ax],dx
 *pop *ds

:)

[s]Исправлено: shurikan, 4:41 18-11-2003[/s]

himik 19-11-2003 10:11 207536

shurikan
Цитата:

Ну, полностью код писать не буду.
:help::pray: напиши если не сложно, очень надо, а я в этом ваще никак не рублю(
Санкс.

shurikan 20-11-2003 03:08 207537

himik
OK! Только тогда я попрошу полностью выложить задание. А то я только понял, что писать надо на ассемблере. Это должна быть подпрограмма, принимающая какие-то параметры? Или как можно узнать какой символ двигать, куда именно сейчас (вверх или вниз), постоянно или по нажатию клавиши, с какой скоростью, когда остановиться???? Лады? А так это не сложно - сделаем. :biggrin:

Добавлено:

Можно и комментарии приклеить.

himik 20-11-2003 09:38 207538

shurikan
мдя озадачил)))
задание так и звучит
Составить программу, перемещения символа по экрану вертикально :-(
А как я думаю значения не имеет.

shurikan 21-11-2003 03:12 207539

himik
Значится так. Компилил TASM-ом. Стрелочками перемещается курсор. CTRL+стрелочки - символ вместе с курсором во все стороны. На краях перпрыгивает на противоположный край. ESC - выход. Код уже отладил. Читай:
Код:


.286
.model smal
 
.data
videoseg * * * * dw 0B800h
 
cursor_pos * * * * dw ?
cursor_shape * * dw ?
video_off * * * * *dw ?
 
key_tbl * * * * * *db 4Bh, 4Dh, 48h, 50h, 73h, 74h, 8Dh, 91h, 0
off_tbl * * * * * *dw offset do_left
 * * * * * * * * * dw offset do_right
 * * * * * * * * * dw offset do_up
 * * * * * * * * * dw offset do_down
 * * * * * * * * * dw offset do_cleft
 * * * * * * * * * dw offset do_cright
 * * * * * * * * * dw offset do_cup
 * * * * * * * * * dw offset do_cdown
 
 .code
start:
 * * * * mov * * * *ax,@data
 * * * * mov * * * *ds,ax
 * * * * mov * * * *ax,videoseg
 * * * * mov * * * *es,ax
 
 * * * * mov * * * *ah,03h
 * * * * mov * * * *bh,0
 * * * * int * * * *10h
 
 * * * * mov * * * *cursor_pos,dx
 * * * * mov * * * *cursor_shape,cx
 
 * * * * xor * * * *cx,cx
 * * * * mov * * * *cl,dl
 * * * * shl * * * *cx,1
 * * * * xor * * * *ax,ax
 * * * * mov * * * *al,dh
 
 * * * * mov * * * *bp,160
 * * * * mul * * * *bp
 * * * * add * * * *ax,cx
 * * * * mo * * * * vvideo_off,ax
 
next:
 * * * * mov * * * *ah,10h
 * * * * int * * * *16h
 
 * * * * cmp * * * *ah,1
 * * * * je * * * * done
 
 * * * * call * * * process
 
 * * * * jmp * * * *next
 
done:
 * * * * mov * * * ax,4c00h
 * * * * int * * * *21h
 
 
process:
 * * * *cmp * * * *al,0E0h
 * * * *jne * * * * *locret
 
 * * * *xor * * * * *bx,bx
 
 @@1:
 * * * *mov * * * *al,key_tbl[bx]
 * * * *and * * * *al,al
 * * * *je * * * * * locret
 
 * * * *cmp * * * *ah,al
 * * * *je * * * * * found
 
 * * * * inc * * * * bx
 * * * * jmp * * * @@1
 
found:
 * * * * shl * * * * bx,1
 * * * * add * * * *bx,offset off_tbl
 * * * * mov * * * ax,[bx]
 * * * * call * * * * ax
 
locret:
 * * * * ret
 
 
do_left:
 * * * * mov * * * dx,cursor_pos
 * * * * and * * * dl,dl
 * * * * je * * * * *zero_col0
 
 * * * * dec * * * dx
 * * * * sub * * * video_off,2
 * * * * jmp * * * cont0
 
zero_col0:
 * * * * mov * * *dl,79
 * * * * add * * * video_off,2*79
 
cont0:
 * * * * mov * * *cursor_pos,dx
 * * * * call * * * *set_cursor_pos
 * * * * ret
 
 
do_right:
 * * * * mov * * *dx,cursor_pos
 * * * * cmp * * *dl,79
 * * * * je * * * * last_col0
 
 * * * * inc * * * *dx
 * * * * add * * *video_off,2
 * * * * jmp * * * cont1
 
last_col0:
 * * * * xor * * * dl,dl
 * * * * sub * * *video_off,2*79
 
cont1:
 * * * *mov * * * cursor_pos,dx
 * * * *call * * * *set_cursor_pos
 * * * *ret
 
 
do_up:
 * * * *mov * * * dx,cursor_pos
 * * * *and * * * dh,dh
 * * * *je * * * * *zero_row0
 
 * * * *sub * * * dx,100h
 * * * *sub * * * video_off,160
 * * * *jmp * * * cont2
 
zero_row0:
 * * * *mov * * *dh,24
 * * * *add * * * video_off,160*24
 
cont2:
 * * * *mov * * * cursor_pos,dx
 * * * *call * * * *set_cursor_pos
 * * * *ret
 
 
do_down:
 * * * *mov * * * dx,cursor_pos
 * * * *cmp * * * dh,24
 * * * *je * * * * *last_row0
 
 * * * *add * * * dx,100h
 * * * *add * * * video_off,160
 * * * *jmp * * * cont3
 
last_row0:
 * * * *xor * * * *dh,dh
 * * * *sub * * * video_off,160*24
 
cont3:
 * * * *mov * * *cursor_pos,dx
 * * * *call * * * *set_cursor_pos
 * * * *ret
 
 
do_cleft:
 * * * *mov * * * bx,video_off
 * * * *mov * * * bp,bx
 * * * *mov * * * dx,cursor_pos
 * * * *and * * * dl,dl
 * * * *je * * * * *zero_col1
 
 * * * *sub * * * bp,2
 * * * *jmp * * * cont4
 
zero_col1:
 * * * *add * * * bp,2*79
 
cont4:
 * * * *mov * * *dx,es:[bx]
 * * * *mov * * *ax,es:[bp]
 * * * *mov * * *es:[bx],ax
 * * * *mov * * *es:[bp],dx
 * * * *call * * * do_left
 * * * *ret
 
 
do_cright:
 * * * *mov * * * bx,video_off
 * * * *mov * * * bp,bx
 * * * *mov * * * dx,cursor_pos
 * * * *cmp * * * dl,79
 * * * *je * * * * *last_col1
 
 * * * *add * * * bp,2
 * * * *jmp * * * cont5
 
last_col1:
 * * * *sub * * * bp,2*79
 
cont5:
 * * * *mov * * *dx,es:[bx]
 * * * *mov * * *ax,es:[bp]
 * * * *mov * * *es:[bx],ax
 * * * *mov * * *es:[bp],dx
 * * * *call * * * do_right
 * * * *ret
 
 
do_cup:
 * * * *mov * * *bx,video_off
 * * * *mov * * *bp,bx
 * * * *mov * * *dx,cursor_pos
 * * * *and * * *dh,dh
 * * * *je * * * * zero_row1
 
 * * * *sub * * *bp,160
 * * * *jmp * * *cont6
 
zero_row1:
 * * * *add * * *bp,160*24
 
cont6:
 * * * *mov * * *dx,es:[bx]
 * * * *mov * * *ax,es:[bp]
 * * * *mov * * *es:[bx],ax
 * * * *mov * * *es:[bp],dx
 * * * *call * * * do_up
 * * * *ret
 
 
do_cdown:
 * * * *mov * * *bx,video_off
 * * * *mov * * *bp,bx
 * * * *mov * * *dx,cursor_pos
 * * * *cmp * * *dh,24
 * * * *je * * * * last_row1
 
 * * * *add * * *bp,160
 * * * *jmp * * *cont7
 
last_row1:
 * * * *sub * * *bp,160*24
 
cont7:
 * * * *mov * * *dx,es:[bx]
 * * * *mov * * *ax,es:[bp]
 * * * *mov * * *es:[bx],ax
 * * * *mov * * *es:[bp],dx
 * * * *call * * * *do_down
 * * * *ret
 
 
set_cursor_pos:
 * * * *mov * * *ah,02h
 * * * *xor * * * *bh,bh
 * * * *int * * * *10h
 * * * *ret
 
.stack
 
end start

:)

himik 21-11-2003 09:13 207540

shurikan
большое спасибо, выручил)
Guest
пасиб, но надо было на ассемблере :-)))

shurikan 21-11-2003 15:48 207541

himik
Не за что :gigi:
Комментарии нужны? :)

himik 21-11-2003 16:18 207542

Цитата:

Комментарии нужны?
shurikan
было бы не плохо, а то я не смогу если спросят объяснить)

shurikan 22-11-2003 04:40 207543

himik
OK! Здесь добавлять не буду, вышлю по e-mail с вложением.
:)


Время: 08:36.

Время: 08:36.
© OSzone.net 2001-