Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
Assembler this system does not support fullscreen mode https://www.cyberforum.ru/ assembler/ thread882161.html
this system does not support fullscreen mode В чем может быть ошибка?
Assembler Какое будет содержимое регистров после выполнения данного фрагмента программы
Уважаемые форумчане! Подскажите пожалуйста каково буде содержание регистра ECX в десятичном формате после выполнения следующей программы: MOV ECX,28 CLD MOV AL,100 LEA EDI,STRING REPNE SCASB ---------------------------------------- STRING DB "Abcdefghijklmnop qrstuvwxyz"
Assembler проверка оборудования https://www.cyberforum.ru/ assembler/ thread881675.html
прошу помощи. напишите код с комментариями. заранее спасибо. для компьютера на своем рабочем столе определить: - тип компьютера; - версию MS-DOS; - число дисковых накопителей; - тип и число видеоадаптеров; - число периферийных устройств; - количество памяти;
Assembler Ассемблер.повторное нажатие клавиши и использование таймера tasm Есть программа, в которой прорисовывается фигура и при нажатии любой клавиши должна начинаться смена цвета. Подскажите, пожалуйста, как сделать, чтобы при повторном нажатии той же клавиши или после 7 секунд смена цвета останавливалась Процедура смены цвета: changcv proc inc color call zvezda jmp changcv ret https://www.cyberforum.ru/ assembler/ thread880292.html
Запрет на удаление файла Assembler
Задача: Резидентная программа по горячей клавише выводит окно, в котором с помощью клавиш 'стрелка вверх' и 'стрелка вниз' выбирается режим работы с файлами, т.е. тип файлов, которые нельзя удалять. В случае попытки удалить файл с выбранным расширением, программа выдает сообщение. Предусмотреть возможность выгрузки программы и защиту от повторной загрузки. Состоит из двух программ: основной и...
Assembler Идентификация производителя монитора https://www.cyberforum.ru/ assembler/ thread879437.html
Здравствуйте, не первый день пытаюсь найти способ узнать (идентифицировать) производителя монитора. Например (из аиды64): ID монитора SAM0691 Программу нужно написать на TASM, нашёл только информацию по EnumDisplayDevices, но как реализовать не знаю, и ещё вычитал про прерывание INT 1Dh, но про него тоже не где нечего нет...
Assembler Графика MASM Помогите доделать! не могу понять почему движение фигуры происходит только наискось, а должна влево вправо вверх и вниз. вроде все правильно но не работает, помогите разобраться... data segment col db ? horiz dw ? vert dw ? https://www.cyberforum.ru/ assembler/ thread879186.html Часы вторым каналом таймера Assembler
Надо запилить часы с помощью второго канала системного таймера, именно второго, не используя нулевой, с его перерыванием. Где то на просторах интернета, нарыл код, просто стартуем канал в режиме 3, фиксируем значение регистра канала, отнимаем предыдущее значение от текущего, получаем разницу. Теперь в чем загвоздка - как узнать, с какой частотой декрементит свой счетчик второй канал таймера?
Assembler Связь ассемблера с Pascal https://www.cyberforum.ru/ assembler/ thread877335.html
Сформируйте массив, в котором соответствующий элемент является произведением элементов двух массивов. Помогитею.
Assembler Текстовый редактор - своя ОС Доброго времени суток. Задача: написать загрузчик, который выбирал бы либо unix(win) или свою ОС + написать свою ОС - текстовый редактор где можно заменять и удалять участки текста. Загрузчик: ;Bootloader entry-code main: cli ;Clear interrupts https://www.cyberforum.ru/ assembler/ thread877212.html
Как узнать откуда запущена программа? Assembler
напишите пожалуйста код ассемблерной вставки для делфи, например функцию, определяющую откуда запущена программа Добавлено через 15 минут Format of environment block: Offset Size Description 00h N BYTEs first environment variable, ASCIZ string of form "var=value" N BYTEs second environment variable, ASCIZ string ... N BYTEs last environment variable, ASCIZ string of form...
Assembler Почему в TASM нельзя сравнивать память-память? То есть я понимаю, что можно либо регистр-память, либо память-регистр, либо регистр-регистр. Но почему так? И существуют ли методы, как это обойти, кроме как заносить значение переменной в содержимое регистра? https://www.cyberforum.ru/ assembler/ thread875222.html
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
25.06.2013, 15:16  [ТС] 0

FAQ для раздела Assembler, MASM, TASM - Assembler - Ответ 4770619

25.06.2013, 15:16. Показов 143687. Ответов 65
Метки (Все метки)

Ответ

Графика в DOS. Эффект RADIAL BLUR
Если вы захотите подставить какую-нибудь другую картинку, то проделайте следующую последовательность действий:
  1. нарисуйте или считайте другую двух-цветную картинку в PaintBrush
  2. сохраните ее как монохромную картинку
  3. потом как 256-цветную
  4. и вот эту 256 цветную картинку можно подставлять вместо intel.bmp.
Размер картинки естественно должен составлять 320x200, и bmp-файл не должен быть упакован, иначе у вас ничего не получиться.

intel.bmp
Идея radial blur`a проста: блюрить по кругу, то есть как в обычном случае блюрения по одной координате, но с переходом к полярным координатам.

Выберем центр нашего блюра, пусть это будет, для простоты, центр экрана. Допустим разрешение экрана 320x200. Тогда центр экрана придется на точку с координатами (160,100). Сместим начало координат в эту точку: x'=x-160; y'=y-100. Теперь рассмотрим точку М с координатами, например, (185,65), эта точка будет нашей текущей точкой, на примере ее я расскажу как выбирать вторую точку, чтобы сблюрить их цвета. Координаты в нашей новой системе координат, у этой точки будут M'(25,-35). Вектор этой точки тоже будет иметь координаты (25,-35).

Теперь надо решить, как находить вектор, по которому мы будем находить вторую точку. Есть два варианта:
  1. Изменить длину вектора нашей текущей точки так, что-бы она лежала в пределах от 1 до некоторого значения max, которое вы выберите сами, на свой вкус. (Обычно выбирают 8 чтобы использовать сдвиги).
  2. Зафиксировать длину вектора. (Опять же выбор длины остается за вами, а но можно опять выбрать 8).
Здесь используется второй вариант.
Вычислим по ней координаты вектора N, округляя до целого: N.x= 4, N.y= -6.
Тогда координаты искомой точки P будут находиться так: P(x'-N.x,y'-N.y). То есть, P(21,-29).
Теперь осталось сблюрить точки M и P, и записать получившиеся значение в точку M.
Осталось рассказать в каком порядке надо обрабатывать точки, чтобы получить правильное, радиально-сблюренное изображение.
Разобьем экран на четыре сектора:
Рассмотрим сектор #1:
Обрабатывать пиксели по координате X, надо в порядке: 1,2,3..., а по координате Y, по-строчно, в порядке: A,B,C... .
По такому же принципу надо поступать и в других секторах: обрабатывать сектор по строкам, начиная с ближней к центру блюра, а в строке тоже двигаться от центра блюра.
Естественно, линии с координатами центра блюра надо тоже обработать. Ну вот и все, загляните в прилагаемые исходники, что бы посмотреть, как можно прооптимизировать этот эффект.
Взято здесь, текст программы немного переделан, в результате СОМ-файл уменьшился с 1242 байт до 810 байт
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
; masm dos com #
.model tiny
.code
.386
org 100h
WIDTH_SCREEN    equ 320
HEIGHT_SCREEN   equ 200
SCREENSIZE  equ WIDTH_SCREEN*HEIGHT_SCREEN
MEMBLOCKSIZE    equ SCREENSIZE/16
IMPUT_STATUS_0  equ 3DAh    ;регистр статуса ввода 0
VGA_SEGMENT equ 0A000h
 
time        equ dword ptr [bp-4]
n       equ dword ptr [bp-8]
y       equ word ptr [bp-10]
vx      equ word ptr [bp-12]
p1      equ word ptr [bp-14]
screen      equ word ptr [bp-16]
pics        equ word ptr [bp-18]
bbx     equ dword ptr [bp-22]
bby     equ dword ptr [bp-26]
 
start:      mov sp,0DF0h
        mov ah,4Ah      ;ADJUST MEMORY BLOCK SIZE (SETBLOCK)
        mov bx,0DFh     ;ES = segment address of block  to change
        int 21h         ;BX = new size in paragraphs
        enter 26,0
        mov time,0
        mov bx,MEMBLOCKSIZE ;4000
        mov ah,48h      ;ALLOCATE MEMORY
        int 21h         ;BX = number of 16-byte paragraphs desired      
        mov screen,ax       ;screen[64000]
        mov bx,MEMBLOCKSIZE ;4000
                mov ah,48h      ;ALLOCATE MEMORY
        int 21h         ;BX = number of 16-byte paragraphs desired
        mov pics, ax        ;pics[64000]
        mov bx,MEMBLOCKSIZE*2
                mov ah,48h      ;ALLOCATE MEMORY
        int 21h         ;BX = number of 16-byte paragraphs desired
        mov es,ax ;es=sqr       sqr[128000]
        mov fs,ax ;fs=sqr
        add ax,4000
        mov gs,ax ;gs=sqr+64000/16
        mov ax,13h
        int 10h     
;initsqr--------------------------------------
        mov si,WIDTH_SCREEN-1
a0:     mov y,HEIGHT_SCREEN-1
@@:     mov ax,y
        mul ax
        movzx ecx,ax;ecx=y*y
        movsx eax,si
        mul eax
        add eax,ecx;eax=x*x + y*y
        mov n,eax
        fild n
        fsqrt
        fistp n
        mov eax,n;n=sqrt(x*x + y*y)
        shr eax,3
        inc eax
        mov n,eax;n=(sqrt(x*x + y*y))/8 + 1
        imul di,y,WIDTH_SCREEN
        mov ax,si
        add di,ax;di=y*320 + x
        cwd
        idiv word ptr n;ax=x/((sqrt(x*x + y*y))/8 + 1)
        mov gs:[di],al
        mov ax,y
        cwd
        idiv word ptr n;ax=y/((sqrt(x*x + y*y))/8 + 1)
        stosb   ;mov es:[di],al
        dec y
        jns @b
        dec si
        jns a0
;readbmp-----------------------------------------------------------
        mov dx, offset aIntel_bmp ; "intel.bmp"
        mov ax, 3D00h     ; OPEN DISK FILE WITH HANDLE
        int 21h; DS:DX  -> ASCIZ filename
        mov bx,ax
        xor cx,cx
        mov dx,1078;заголовок и палитра BMP-файла
        mov ax,4200h; MOVE FILE READ/WRITE POINTER (LSEEK)
        int 21h ; AL = method: offset from beginning of file                    
        push    ds
        mov ds, pics
        mov di,HEIGHT_SCREEN-1
@@:     imul    dx,di,WIDTH_SCREEN
        mov cx,WIDTH_SCREEN
        mov ah, 3Fh; READ FROM FILE WITH HANDLE
        int 21h; BX = file handle, CX = number of bytes to read, DS:DX -> buffer
        dec di
        jnz @b
        push    ds
        pop     es;es=pics  di=0
        pop ds
        mov ah, 3Eh; CLOSE A FILE WITH HANDLE
        int 21h; BX = file handle
        mov cx,64000
            inc si;si=0FFFFh+1=0
a1:     lods byte ptr es:[si];c=fgetc(in)
        dec al
        jz  @f
        or  al,-1
@@:     not al
        stosb ;if(c==1)pics[x+320*y]=255 else pics[x+320*y]=0
                loop    a1
;blurpics-----------------------------------------------------
        mov di, WIDTH_SCREEN
        mov cx,63040
@@:     movzx   ax, byte ptr es:[di-WIDTH_SCREEN]
        add al, byte ptr es:[di-1]
        adc ah, 0
        add al, byte ptr es:[di+1]
        adc ah, 0
        add al, byte ptr es:[di+WIDTH_SCREEN]
        adc ah, 0
        shr ax, 2
        stosb
        loop    @b
;setcolortable--------------------------------------------
        mov cx, 255
@@:     mov bl, 255
        sub bl, cl
        shr bl, 2
        mov dx, 3C8h
        mov al, cl;color
                mov ah, bl;red
        out dx, ax
        inc dx
        mov al,bl;green
        out dx,al
        out dx,al
        dec cx
        jns @b
;-----------------------------------------------------------
a2: fld time
    fadd    const005
    fst time; time+=0,05
    fmul    const1_1;time*1,1
    fadd    const1_5;time*1,1+1,5
    fsin                      ;sin(time*1,1+1,5)
    fmul    const120;120*sin(time*1,1+1,5)
    fistp   bbx   ;bbx=120*sin(time*1,1+1,5)
    add bbx,WIDTH_SCREEN/2;bbx=160+120*sin(time*1,1+1,5)
    fld time
    fmul    const08;time*0,8
    fadd    const1_1;1,1+time*0,8
    fcos                      ;cos(1,1+time*0,8)
    fmul    const90;90*cos(1,1+time*0,8)
    fistp   bby  ;bby=90*cos(1,1+time*0,8)
    add bby,HEIGHT_SCREEN/2;bby=100+90*cos(1,1+time*0,8) 
;100 и 160 координаты середины экрана
;copypicsvirtual        
    push ds
    mov ds,pics
    mov es,screen
    xor si,si
    xor di,di
    mov cx,SCREENSIZE/4
    rep movsd
    pop ds
;radialblurscreen
    xor dx,dx
    mov bx,word ptr bby
    dec bx         ; bx = bby - 1
    imul di,bx,WIDTH_SCREEN; di = (bby - 1)*320
    add di,word ptr bbx; di = (bby - 1)*320 + bbx
    dec di        ; di = (bby - 1)*320 + bbx - 1
a3: mov cx,word ptr bbx
@@: mov ah,0
    mov al,es:[di]
    mov p1,ax
    mov si,dx
    mov al,gs:[si]
    mov vx,ax        ; vx = gs[t]
    lods byte ptr fs:[si]
    imul ax,WIDTH_SCREEN;      ax=320*fs:[t]
    mov si,di
    add si,vx
    add si,ax
    mov ah,0
    lods byte ptr es:[si];movzx ax,byte ptr es:[si]
    add ax,p1
    shr ax,1
    stosb;mov es:[di], al
    dec di
    dec di
    inc dx
    dec cx
    jnz @b
    sub di,WIDTH_SCREEN
    add di,word ptr bbx
    mov ax,WIDTH_SCREEN
    sub ax,word ptr bbx
    add dx,ax
    dec bx
    jns a3
        mov ax,word ptr bby
        dec ax
        imul di,ax,WIDTH_SCREEN
        add di,word ptr bbx
        xor dx,dx
        mov cx,word ptr bby
a4:     mov bx,word ptr bbx
@@:     movzx   ax, byte ptr es:[di]
        mov p1,ax
        mov si,dx
        movzx   ax,byte ptr gs:[si]
        mov vx,ax
        movzx   ax,byte ptr fs:[si]
        imul ax,WIDTH_SCREEN
        mov si, di
        sub si, vx
        add si, ax
        movzx   ax, byte ptr es:[si]
        add ax, p1
        shr ax, 1
        stosb
        inc dx
        inc bx
                cmp bx,WIDTH_SCREEN
        jl  @b
        sub di,WIDTH_SCREEN*2
        add di,word ptr bbx
        mov ax,word ptr bbx
        add dx,ax
        dec cx
        jnz a4
        mov cx,word ptr bby
        imul di,cx,WIDTH_SCREEN
        add di,word ptr bbx
        dec di
        xor dx,dx
a5:     mov bx,word ptr bbx
@@:     movzx   ax, byte ptr es:[di]
        mov p1,ax
        mov si,dx
        movzx   ax, byte ptr gs:[si]
        mov vx,ax
        movzx   ax, byte ptr fs:[si]
        imul ax,WIDTH_SCREEN
        mov si, di
        add si, vx
        sub si, ax
        movzx   ax, byte ptr es:[si]
        add ax, p1
        shr ax, 1
        stosb;mov   es:[di], al
        dec     di
        dec di
        inc dx
        dec bx
        jnz @b
        add di, WIDTH_SCREEN
        add di,word ptr bbx
        mov ax, WIDTH_SCREEN
        sub ax,word ptr bbx
        add dx,ax
        inc cx
                cmp cx,HEIGHT_SCREEN
        jl  a5
        mov cx,word ptr bby
        imul    di,cx,WIDTH_SCREEN
        add di,word ptr bbx
        xor dx,dx
a6: mov bx,word ptr bbx
@@:     movzx   ax, byte ptr es:[di]
        mov p1,ax
        mov si,dx; t
        mov ah,0
        mov al,gs:[si]
        mov vx,ax
        lods    byte ptr fs:[si]
        mov dx,si
        imul ax,WIDTH_SCREEN
        mov si, di
        sub si, vx
        sub si, ax
        movzx   ax, byte ptr es:[si]
        add ax, p1
        shr ax, 1
        stosb
        inc bx
                cmp bx,WIDTH_SCREEN
        jl  @b
        mov ax,word ptr bbx
        add di,ax
        add dx,ax
        inc cx
        cmp cx,HEIGHT_SCREEN
        jl  a6
;blurscreen --------------------------------------
        mov di, WIDTH_SCREEN
        mov cx,63040
loc_104E7:  movzx   ax, byte ptr es:[di-WIDTH_SCREEN]
        add al, byte ptr es:[di-1]
        adc ah, 0
        add al, byte ptr es:[di+1]
        adc ah, 0
        add al, byte ptr es:[di+WIDTH_SCREEN]
        adc ah, 0
        shr ax, 2
        stosb
        loop    loc_104E7
;copyvirtualscreen
        mov dx, IMPUT_STATUS_0
WaitVerticalSync:in al,dx
            test al,8
            jz WaitVerticalSync
WaitNotVerticalSync:in al,dx
            test al,8
            jnz WaitNotVerticalSync
        mov cx,SCREENSIZE/4
        xor si,si
        push ds
        push es
        pop ds
        xor di,di
            push VGA_SEGMENT
        pop es
        rep movsd
        xor ax,ax
        mov ds,ax
        mov ax,ds:[41Ah]
        sub ax,ds:[41Ch]
        pop ds
        jz a2
exit:       mov ax,3
        int 10h     ; - VIDEO - SET VIDEO MODE
        int 20h
 
const005    dd 0.05
const08     dd 0.8
const1_1    dd 1.1
const1_5    dd 1.5
const90     dd 90.0
const120    dd 120.0
aIntel_bmp  db 'intel.bmp',0
end start
Исходный текст, СОМ-файл и картинка здесь

Вернуться к обсуждению:
FAQ для раздела Assembler, MASM, TASM Assembler
2
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2013, 15:16
Готовые ответы и решения:

Глоссарий для раздела Assembler, MASM, TASM
Thread, AFP, Charles Kludge, 6a6kin, Убежденный, Ethereal, выкладывайте свои глоссарии - разложу...

Организация тем в разделе Assembler, MASM, TASM
Всем привет! Друзья, возник вопрос: как лучше организовать темы в разделе Assembler, MASM, TASM?...

Полезные макросы для MASM и TASM
Не претендую на создание чего-то нового и гениального, но макросы довольно полезные. Часть из того,...

Видеоуроки по Ассемблеру MASM/TASM (для DOS) на русском языке
Всем доброго времени суток. Вобщем, ищу видеоуроки на русском языке по Ассемблеру. Нужно для...

MASM, TASM, FASM: что выбрать для программирования в ядре
Какой асемлер выбрать для проганья в едре? вынь

65
25.06.2013, 15:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2013, 15:16
Помогаю со студенческими работами здесь

Есть ли компиляторы Tasm или Masm для 64-разрядных систем
Есть ли компиляторы Tasm или Masm для 64-разрядной с-мы??? если есть просьба скинуть...

Подскажите ссылки на FAQ для разделов Assembler, MASM, TASM
Скиньте FAQ для разделов Assembler,MASM,TASM где много вариантов "Hello,world!$" и где написана...

Assembler Переделать из TASM в masm
model small .stack 256h .data dbEnter db 10,13,'Enter string:$' dbCode db 10,13,'Code...

Подскажите этот код для TASM или MASM?
Подскажите это TASM или MASM? EOFLINE EQU '$' AStack SEGMENT STACK DW 12 DUP(?) AStack ENDS...

Где скачать TASM или MASM для Win 10 64 разряда
Где скачать TASM или MASM для Win 10 64 разряда ???? Хочу выучить ассемблер не не знаю где скачать...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru