Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/56: Рейтинг темы: голосов - 56, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 11

При обращении напрямую к видеопамяти, вывести изображение

22.11.2009, 14:39. Показов 11507. Ответов 64
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кто может помочь с решением задачи на Ассемблере, откликнитесь пожалуйста!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2009, 14:39
Ответы с готовыми решениями:

Выдавать 404 при обращении напрямую к индексным файлам
Извените, возник ряд сложностей, так как в Apache разбираюсь не очень, итак : нужно сделать так, чтобы при обращении на прямую...

TASM + VESA чтение и запись видеопамяти напрямую
Столкнулся с проблемой: есть некоторое изображение представленное битами (14х20), его нужно вывести по заданным координатам. Режим 103h...

Не могу понять реальный объём видеопамяти. (Ноут за 10к с 6 ГБ видеопамяти О_о)
Друг реши себе ноут взять на авито. Вот вижу такое объявление: Тыц Заголовок товара: Мощный HP А8-6410, 8Гб, 6Гб вид, 120Гб SSD. ...

64
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 16:14
Студворк — интернет-сервис помощи студентам
1) Поместил текст из поста 38 в блокнот и переименовал на f1.asm
2) Кинул этот f1.asm и DOSLNK.exe в папку С:\Masm32\bin C:\Masm32 для уверенности)
3) Скомпилил из cmd: ml /c f1.asm ; doslnk f1.obj
4) Запустил екзешник и по єкрану жуткие полосы
Можно переделать это, чтобы весь экран залило белым?
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
.model small
.stack 256
.code
main: 
        mov ax,13h
        int 10h ; установка режима
        mov ax, 0a000h ; сегмент видеопамяти
        mov es,ax
        xor di,di
        mov dx, 200 ; кол-во строк
frame:
        mov cx, 320 ; т.к. экран 320x200
        xor al,al
@@:
        stosb
        inc al
        loop @b
        dec dx
        jnz frame
        mov ah,1
        int 21h
        mov ah,4ch
        int 21h
end main
А это ведет себя нормально. На синем фоне 10 белых точек
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
.model small
.stack 256
.386
.data
saveMode        db ?    
xVal    dw ?
yVal    dw ?
 
.code
main proc
.startup                        
 
        call    SetVideoMode    
        call    SetScreenBackground
        call    Draw_Some_Pixels
        call    RestoreVideoMode
        
.exit                   ; return to OS
main endp
 
SetScreenBackground proc
        mov     dx,3c8h         
        mov     al,0            
        out     dx,al
 
        mov     dx,3c9h         
        mov     al,0            
        out     dx,al
        mov     al,0            
        out     dx,al
        mov     al,35           
        out     dx,al
        ret
SetScreenBackground endp
 
SetVideoMode proc
        mov  ah,0Fh             
        int  10h
        mov  saveMode,al        
 
           mov  ah,0            
           mov  al,13h          
        int     10h
 
        push    0A000h          
        pop     es                              
        ret
SetVideoMode endp
 
RestoreVideoMode proc
        mov   ah,10h            
        int     16h
        mov     ah,0            
        mov     al,saveMode   
        int     10h
        ret
RestoreVideoMode endp
 
Draw_Some_Pixels proc
        mov     dx,3c8h         
        mov     al,1            
        out     dx,al
 
        mov     dx,3c9h         
        mov     al,63           
        out     dx,al
        mov     al,63           
        out     dx,al
        mov     al,63           
        out     dx,al
 
        mov     xVal,160                
        mov     yVal,100
        mov   ax,320            
        mul   yVal              
        add   ax,xVAl           
        mov     cx,10           
        mov   di,ax             
 
DP1:
        mov     byte ptr es:[di],1      
        add     di,5            
        Loop    DP1
        ret
Draw_Some_Pixels endp
end
Вот прилагаю обе программы bin.rar

Мне как раз и надо, сделать массив 320 на 480, и в зависимости от того, еденица в массиве или нуль, либо закрасить белым, либо синим (черным) и все это с обращением напрямую к видеопамяти.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
06.12.2009, 16:25
Цитата Сообщение от galileopro Посмотреть сообщение
Запустил екзешник и по єкрану жуткие полосы
Ну... Это что-то вроде настроечной таблицы к телевизору. Показывает всю возможную гамму цветов.

Цитата Сообщение от galileopro Посмотреть сообщение
Можно переделать это, чтобы весь экран залило белым?
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
.model small
    .stack 256
.code
main:
    mov ax,13h
    int 10h ; установка режима
    
    mov ax,0a000h ; сегмент видеопамяти
    mov es,ax
    
    xor di,di
    mov cx,320*200
    mov al,15 ; ярко-белый цвет
    
    rep stosb ; заносим этот байт по всем ячейкам видеопамяти
    
; чтобы поставить 5 точек, нужно это расскоментировать
;   mov di,100*320+160 ; (100;160) координаты первой точки
;   mov al,4 ; цвет точек
;   mov cx,5 
;l1:
;   mov es:[di],al
;   add di,5
;   loop l1
    
    mov ah,1
    int 21h
    mov ax,3 ; возврат в текстовый режим
    int 10h
    mov ah,4ch
    int 21h
    
end main
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 16:44
Ага. А как вот это поправить чтобы оно этот массив отображало? (13 - красный цвет)
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
.model small
.stack 256
.data
mass db 64000 dup(13) ;200*320 = 64000
.code
main:
        mov ax,13h
        int 10h ; установка режима
        
        mov ax,0a000h ; сегмент видеопамяти
        mov es,ax
        xor di,di
        mov dx,200
nstk:
        mov cx,320
nstb:   mov al, mass[dx*320+cx]
        stosb ; заносим этот байт по всем ячейкам видеопамяти
        loop nstb
        dec dx
        jnz nstk
        mov ah,1
        int 21h
        mov ax,3 ; возврат в текстовый режим
        int 10h
        mov ax,4c00h
        int 21h        
end main
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
06.12.2009, 16:48
Скопировать его туда с помощью rep movsb ?
Assembler
1
2
3
4
mov si,offset mass
xor di,di
mov cx,64000
rep movsb ; копирует CX байт из [ds:si] в [es:di]
У меня в коде ds не настраивался, не забудьте дописать это.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 16:57
Да.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.model small
.stack 256
.data
mass db 64000 dup(13) ;200*320 = 64000
.code
main:
        mov ax,13h
        int 10h ; установка режима
        mov ax,0a000h ; сегмент видеопамяти
        mov es,ax
        xor di,di
mov cx, 64000 ;в cx занести длину строки
 rep movsb
        mov ah,1
        int 21h
        mov ax,3 ; возврат в текстовый режим
        int 10h
        mov ax,4c00h
        int 21h        
end main
Так?

Добавлено через 1 минуту
Там первые где-то 100 пикселов первой строки закрашиваются плохо.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
06.12.2009, 17:02
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
.model small
    .stack 256
.data
    mass db 64000 dup(13) ;200*320 = 64000
.code
main:
    mov ax,@data
    mov ds,ax
    
    mov ax,13h
    int 10h ; установка режима
    
    mov ax,0a000h ; сегмент видеопамяти
    mov es,ax
    
    xor di,di
    mov si,offset mass
    mov cx, 64000 ;в cx занести длину строки
    rep movsb
    
    mov ah,1
    int 21h
    mov ax,3 ; возврат в текстовый режим
    int 10h
    mov ax,4c00h
    int 21h
end main
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 17:10
Круто. А теперь чуть сложнее, есть у меня такой файлик текстовый из еденичек и нулей, и надо его прочитать в этот массив. Тупо прочитать по байтам. Конвертор.rar

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
TITLE file
.model small
.stack 100h
.data
mass  db  64000 dup(?)
Number  dw  ?       ;для хранения номера файла, получаемого от DOS
FileName  db  "C:\myfile.txt", 0   ; местоположение файла, заданное в формате ASCII
.code
                                                                               
mov ax, @data
mov ds, ax
mov ax, 3D00h   ; в ah задан номер функции открытия файла, в al задан режим доступа.
lea dx, FileName     ;в ds:dx размещается адрес строки, содержащей идентификацию файла.
int 21h                 ; вызов функций открытия файла.
 
mov Number, ax  
mov ah, 3Fh     ; в ah задан номер функции чтения из файла.
mov bx, FM      ; регистр bx должен содержать логический номер файла.
mov cx, 64000     ; в cx количество читаемых байтов.
lea dx, mass     ; в ds:dx указывается адрес буфера для ввода данных из файла.
int 21h         ; вызов функции чтения.
mov ah, 3Eh     ;в ah задан номер функции закрытия файла.
mov bx, FM
int 21h
 
mov ax, @data
        mov ds,ax
        mov ax,13h
        int 10h ; установка режима
        mov ax,0a000h ; сегмент видеопамяти
        mov es,ax
        
        xor di,di
        mov si,offset mass
        mov cx, 64000 ;в cx занести длину строки
        rep movsb
        
        mov ah,1
        int 21h
        mov ax,3 ; возврат в текстовый режим
        int 10h
        mov ax,4c00h
        int 21h
end
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 17:38
Вот не пойму, почему не работает(( (Кстати в том текстовике надо первую строку удалить)
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
TITLE file
.model small
.stack 100h
.data
mass  db  64000 dup(?)
FileName  db  "C:\myfile.txt", 0   ; местоположение файла, заданное в формате ASCII
.code
mov dx, offset Filename
mov al, 0    ;открываем для чтения
mov ah, 3dh  ;ф-я открытия файла
int 21h
mov bx, ax
mov ah, 3fh
mov dx, offset mass
mov cx, 64000
int 21h
 
mov ax, @data
mov ds,ax
mov ax,13h
int 10h ; установка режима
mov ax,0a000h ; сегмент видеопамяти
mov es,ax
        
xor di,di
mov si,offset mass
mov cx, 64000 ;в cx занести длину строки
rep movsb
mov ah,1
int 21h
mov ax,3 ; возврат в текстовый режим
int 10h
mov ax,4c00h
int 21h
end
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
06.12.2009, 18:03
Assembler
1
2
mov ax, @data
mov ds,ax
Это должно быть в самом начале кода программы, иначе в ds будет указывать не на данные.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 18:21
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
TITLE file
.model small
.stack 100h
.data
mass  db  64000 dup(?)
FileName  db  "C:\myfile.txt", 0   ; местоположение файла, заданное в формате ASCII
.code
mov ax, @data
mov ds,ax
mov dx, offset Filename
mov al, 0    ;открываем для чтения
mov ah, 3dh  ;ф-я открытия файла
int 21h
mov bx, ax
mov ah, 3fh
mov dx, offset mass
mov cx, 64000
int 21h
 
mov ax,13h
int 10h ; установка режима
mov ax,0a000h ; сегмент видеопамяти
mov es,ax
       
xor di,di
mov si,offset mass
mov cx, 64000 ;в cx занести длину строки
rep movsb
mov ah,1
int 21h
mov ax,3 ; возврат в текстовый режим
int 10h
mov ax,4c00h
int 21h
end
Читает. Но плохо. Там в текстовике 1 должны образовывать надпись "Форум - это круто".

Добавлено через 3 минуты
А я понял причину. Там же символы переноса строк. Надо как-то их обойти.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
06.12.2009, 18:26
Так может просто удалить их ? Будет все как бы в строчку.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 18:31
Вот не компилирует это(
Assembler
1
2
3
4
5
6
l1: mov cx, 64000
cmp mass[cx], 1
jl l2
mov mass[cx], 13
l2
loop l1
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
06.12.2009, 18:31
А еще и ноли на 9, и будет самое оно

А вы, во-первы не путайте символ '1' и число 1, а во-вторых наверно в 5 строчке двоеточие нужно. и в третьих при такой записи могут быть только регистры bx, si и di.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 18:33
Я это и пытаюсь сделать. Почему оно метки ругает
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
06.12.2009, 18:37
А чем плох такой файл и старый вариант кода из поста #50?
Вложения
Тип файла: rar myfile.rar (2.4 Кб, 28 просмотров)
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 18:48
Вот почему этот код, например, не заносит в масив 15?
Assembler
1
2
3
4
5
6
xor bx, bx
l1:
mov mass[bx], 15h
inc bx
cmp bx, 64000
jl l1
Файл я уже поправил. Меня интересует, почему я не могу массивом оперировать нормально(
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
06.12.2009, 18:55
Потому что jl - это переход, если число меньше с учетом знака, а 64000 - это -1536, т.е. оно сразу меньше ноля. Поставьте jnz или jb .
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 18:55
Я хочу все нолики на 9 поменять именно ассемблером. Конвертор для текстовика я переделал. Вот исходники и файл: Конвертор.rar

Заработало. Плохо, что там только 64 Кб. Если б 2 раза увеличить. Я бы тогда мог читать этот файл ассемблером, разделять на буковки (В текстовик закинуть изображения букв русского алфавита) и потом как я говорил сконвертировать любую фразу из этих букв. Поможете идейно?
Вот пока наработки: Конвертор.rar
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
06.12.2009, 19:52
А может и не нужно делать массив на 64000 байт ? Нарисовать буквы в 1 файле высотой, например 50 пикселей, и шириной 33 * 50. В процессе работы брать # буквы в алфавите и копировать нужное место файла прямо в видеобуфер.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
06.12.2009, 20:18
Можно. Вот я сделал файл. 32 буквы. 1240 на 40. Конвертор.rar Щас написал код, чтобы вывести 7 букву, но он не работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2009, 20:18

Вывести изображение при условии
Вывести изображение (id="step_№") при условии, что див "numm-content" имеет style="display: block;" Т.е., если div с id="1"...

Исключение при попытке вывести изображение
У меня выдает исключение на эту строку My_img.SetValue(Image.SourceProperty,...

Вывести изображение через HDMI при неработающем дисплее ноутбука
Здравствуйте! Такая проблема: есть ноутбук Acer Aspire V5ZRI с разбитым монитором (изображение не видно), на котором установлена...

Вывести значение напрямую из БД в блок
Здравствуйте! Интересует вопрос: Как можно вывести значение из БД в Drupal7? Последовательность действий такая: Создаю блок, формат...

Замена символа на экране при прямом доступе к видеопамяти
Нужно в процедуре обработать выведеную на экран строку следующим образом: с помощью видеопамяти загрузить символ с экрана и сравнить его с...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru