Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet
16 окт 2024 Ср
Первые две программы на новом процессоре
Мне удалось создать программы, при этом изрядно попортив себе нервы на отладке. Оказывается, не работают некоторые инструкции, причем довольно важные, так что пришлось поискать где баг. Мне бы написать юнит-тесты на процессор, но видимо, не получится. Это слишком сложная и неоднозначная задача.
Сначала я сделал программу сортировки QuickSort.
Это просто для интереса я подсчитал. Еще вот надо будет проверить как работает XCHG ax, r16...
Сначала я сделал программу сортировки QuickSort.
1 org 100h 2 include "../macro.asm" 3start: screen 13 4 mov cx, 64000 ; Сгенерировать случайный шум 5 xor di, di 6@@: add al, ah 7 imul ax, 3235 8 inc ax 9 stosb 10 loop @b 11 mov si, 0 ; Начать сортировку 12 mov di, 64000 13 call qsort 14 hlt 15qsort: push si di ; L-si, R-di 16 mov ax, si 17 mov bx, di 18 shr ax, 1 19 shr bx, 1 20 add bx, ax ; BX=середина 21 mov cl, [es:bx] ; CL=PIVOT 22.w1: cmp [es:si], cl ; WHILE (Arr[si] < pivot): si = si + 1 23 jnb .w2 24 inc si 25 jmp .w1 26.w2: cmp [es:di], cl ; WHILE (Arr[di] > pivot): di = di - 1 27 jbe .w3 28 dec di 29 jmp .w2 30.w3: cmp si, di ; IF a% <= b% THEN 31 ja .w4 32 mov al, [es:si] ; SWAP Arr(a%), Arr(b%) 33 xchg al, [es:di] 34 xchg al, [es:si] 35 inc si 36 dec di 37 cmp si, di ; LOOP WHILE a% <= b% 38 jbe .w1 39.w4: pop bx ax ; AX-было ранее L, BX-R 40 cmp ax, di ; IF l% < b% THEN QSort l%, b% 41 jnb .s1 42 push ax bx si di 43 mov si, ax ; ax=l%, di=b% 44 call qsort 45 pop di si bx ax 46.s1: cmp si, bx ; IF a% < r% THEN QSort a%, r% 47 jnb .s2 48 push ax bx si di 49 mov di, bx 50 call qsort 51 pop di si bx ax 52.s2: retПотом сделал программу для создания эффекта пламени. Получилось хоть и красиво, но медленно. Сортировка 64к элементов производится за примерно 1.5 секунды (за 37822337 тактов процессора). Среднее количество тактов на одну инструкцию составляет 4.8 тактов на инструкцию. Если проверять эквивалент в DOSBOX, то там выставлено по умолчанию количество 3 млн инструкции в секунду. Если разделить 25 на 4.8 равно 5.2 млн инструкции в секунду.
Это просто для интереса я подсчитал. Еще вот надо будет проверить как работает XCHG ax, r16...