Как распечатать массив ASCII в сборке? - PullRequest
2 голосов
/ 01 июня 2019

Я пытаюсь сделать автомобильную игру в графическом режиме сборки. Для этого мне нужно вывести на экран автомобиль, чтобы я мог перемещаться по оси X с помощью клавиатуры. Я пытаюсь напечатать массив ASCII, но он не работает.

Прилагаю массив и процедуру печати с проблемой. Я был бы счастлив, если бы кто-то обнаружил проблему.

Спасибо за помощь!

Проблема: Пока я запускаю программу, все работает нормально, пока не сработает процедура «печатная машина». Он работает, но вместо того, чтобы печатать автомобиль на экране, он печатает много разрозненных пикселей на одной оси x.

car db 0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0          
    db 0,0,0,0,0,0,0,0,4,4,4,4,4,0,0,0,0,0,4,4,4,4,4,0,0,0,0,0,0,0,0       
    db 0,0,0,0,0,4,4,4,4,4,4,4,4,0,4,0,4,0,4,4,4,4,4,4,4,4,0,0,0,0,0   
    db 0,0,0,0,4,4,4,4,4,4,4,4,0,4,4,4,4,4,0,4,4,4,4,4,4,4,4,0,0,0,0   
    db 0,0,0,4,4,14,14,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,14,14,4,4,0,0,0
    db 0,0,0,4,14,14,4,4,4,4,4,0,4,4,4,4,4,4,4,0,4,4,4,4,4,14,14,4,0,0,0 
    db 0,0,4,4,14,14,4,4,4,4,0,0,4,4,4,4,4,4,4,0,0,4,4,4,4,14,14,4,4,0,0 
    db 0,0,4,4,14,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,14,4,4,0,0
    db 0,0,4,4,4,4,4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,4,4,4,4,0,0
    db 0,0,4,4,0,4,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,4,0,4,4,0,0
    db 0,0,0,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,0,0,0
    db 0,0,0,4,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,0,0,0
    db 0,0,0,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,0,0,0
    db 0,0,0,4,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,4,0,0,0
    db 0,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,4,4,0
    db 0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4
    db 0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0  
    db 0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0
    db 0,0,0,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,0,0,0 
    db 0,0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0,0
    db 0,0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0,0
    db 0,0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,0,0
    db 0,0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,0,0
    db 0,0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,0,0
    db 0,0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0,0 
    db 0,0,4,4,0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,4,4,0,0
    db 0,0,4,4,0,0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,4,4,0,0
    db 0,0,4,4,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,4,4,0,0
    db 0,0,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,4,0,0
    db 0,0,4,4,4,4,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,4,4,4,4,0,0
    db 0,0,0,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,4,4,4,0,0,0
    db 0,0,0,4,4,4,4,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,4,4,4,4,0,0,0
    db 0,0,0,0,4,4,4,4,0,0,4,4,4,4,4,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0
    db 0,0,0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0,0,0
    db 0,0,0,0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0,0,0,0

Xcar dw 150


proc carP
    push ax
    push bx
    push cx
    push dx
    push si
    push di
    xor si, si
    xor di, di
    mov bx, offset car
    mov cx, [Xcar]
    BLoop:
        cmp [byte ptr bx], 0
        je Pixel
        mov al, [byte ptr bx] 
        mov ah, 0ch
        mov dx, 140
        add cx, si
        int 10h
    Pixel:
        inc bx
        inc si
        cmp si, 34
        jne BLoop
        mov si, 0
        inc cx
        inc di
        cmp di, 34
        jne BLoop

    pop ax
    pop bx
    pop cx
    pop dx
    pop si
    pop di
    ret
endp carP

1 Ответ

3 голосов
/ 02 июня 2019
push ax
push bx
push cx
push dx
push si
push di
...
pop ax
pop bx
pop cx
pop dx
pop si
pop di

1 Когда вы используете стек для сохранения регистров, вы должны pop их в обратном порядке по сравнению с тем, как вы push их редактировали!

push ax
 push bx
  push cx
   push dx
    push si
     push di
     ...
     pop di
    pop si
   pop dx
  pop cx
 pop bx
pop ax

2 Я подсчитал для вашей машины данные 35 строк с каждым 31 байтом.Это составляет в общей сложности 1085 байтов.Однако ваши вложенные циклы обрабатывают 34 х 34 байта.Это 1156 байт!

3 Пропуск черных пикселей может или не может быть хорошей идеей.Это зависит от того, очистите ли вы эту часть экрана перед рисованием автомобиля .

3 Поскольку во внешнем цикле вместо перезагрузки с mov cx, [Xcar] используется inc cx, вы получите искаженную картину!Является ли это намеренным?

4 Наличие mov dx, 140 во внутреннем цикле неизбежно приведет все пиксели к одной и той же координате Y.Эта инструкция должна идти перед запуском внешнего цикла, и вам нужно увеличить регистр DX по завершении внутреннего цикла.

5 Поскольку инструкция add cx, si была в пределах деталикода, который пропускается для каждого черного цвета, координата X не будет продвигаться так, как должна.

6 Для функции BIOS.WritePixel требуется параметр страницы отображения в регистре BH,Используйте страницу дисплея 0. Это потребовало немного изменить то, как регистры используются в вашем коде.

Завершенный код со всеми необходимыми исправлениями:

    push    ax
    push    bx
    push    cx
    push    dx
    push    si
    push    di
    push    bp

    xor     di, di            ; Vertical counter 0..34 (35)
    mov     dx, 140           ; Topside Y
    mov     si, offset car
    mov     bh, 0             ; Display page 0
    cld                       ; DF=0 so pointer will auto-increment (*)
OuterLoop:
    xor     bp, bp            ; Horizontal counter 0..30 (31)
    mov     cx, [Xcar]        ; Leftside X

InnerLoop:
    lodsb                     ; Fetch data byte plus increment pointer (*)
    cmp     al, 0
    je      SkipPixel
    mov     ah, 0Ch           ; BIOS.WritePixel
    int     10h
SkipPixel:
    inc     cx                ; Next X coordinate
    inc     bp
    cmp     bp, 31            ; 31 bytes per row in DB for the car
    jb      InnerLoop

    inc     dx                ; Next Y coordinate
    inc     di
    cmp     di, 35            ; 35 rows of DB for the car
    jb      OuterLoop

    pop     bp
    pop     di
    pop     si
    pop     dx
    pop     cx
    pop     bx
    pop     ax
    ret
...