Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet

16 окт 2024 Ср Первые две программы на новом процессоре

Мне удалось создать программы, при этом изрядно попортив себе нервы на отладке. Оказывается, не работают некоторые инструкции, причем довольно важные, так что пришлось поискать где баг. Мне бы написать юнит-тесты на процессор, но видимо, не получится. Это слишком сложная и неоднозначная задача.
Сначала я сделал программу сортировки 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...
Теги: 8088