Assembler - язык неограниченных возможностей


Трансцендентные функции - часть 2


.model tiny .code .386 ; будут использоваться 32-битные регистры org 100h ; СОМ-программа

SCALE_H equ 3 ; число периодов в фигуре по горизонтали SCALE_V equ 5 ; число периодов по вертикали

start proc near cld ; для команд строковой обработки mov di,offset cos_table ; адрес начала таблицы косинусов mov ebx,16777137 ; 224 * cos(360/2048) - заранее вычисленное mov cx,2048 ; число элементов для таблицы call build_table ; построить таблицу косинусов

mov ax,0013h ; графический режим int 10h ; 320x200x256

mov ax,1012h ; установить набор регистров палитры VGA, mov bx,70h ; начиная с регистра 70h mov cx,4 ; четыре регистра mov dx,offset palette ; адрес таблицы цветов int 10h

push 0A000h ; сегментный адрес видеопамяти pop es ; в ES

main_loop: call display_picture ; изобразить точку со следом mov dx,5000 xor cx,cx mov ah,86h int 15h ; пауза на CX:DX микросекунд mov ah,11h ; проверить, была ли нажата клавиша, int 16h jz main_loop ; если нет - продолжить основной цикл

mov ах,0003h ; текстовый режим int 10h ; 80x24

ret ; конец программы start endp

; процедура build_table ; строит таблицу косинусов в формате с фиксированной запятой 8:24 ; по рекуррентной формуле cos(xk) = 2 * cos(span/steps) * cos(xk-1) - cos(xk-2), ; где span - размер области, на которой вычисляются косинусы (например, 360), ; a steps - число шагов, на которые разбивается область ; Ввод: DS:DI = адрес таблицы ; DS:[DI] = 224 ; EBX = 224 * cos(span/steps) ; СХ = число элементов таблицы, которые надо вычислить ; Вывод: таблица размером СХ * 4 байта заполнена ; Модифицируются: DI,CX,EAX,EDX

build_table proc near mov dword ptr [di+4],ebx ; заполнить второй элемент таблицы sub ex,2 ; два элемента уже заполнены add di,8 mov eax,ebx build_table_loop: imul ebx ; умножить cos(span/steps) на cos(xk-1) shrd eax,edx,23 ; поправка из-за действий с фиксированной ; запятой 8:24 и умножение на 2 sub eax,dword ptr [di-8] ; вычитание cos(xk-2) stosd ; запись результата в таблицу loop build_table_loop ret build_table endp




Начало  Назад  Вперед