2017-01-08 14 views
2

Я пытаюсь скопировать кучу пикселей из местоположения экрана в другое место. Представьте себе, что у меня есть 8x8 зеленый квадрат по координатам (100, 120), и я хочу скопировать квадрат в координаты (150,60).Скопируйте пиксель из коордов (x0, y0) в (x1, y1)

Я использую графический режим 13h. Это означает 320x200, поэтому мой квадрат начинается с адреса 38500 (используя y * 320 + x).

DS указывает на 0A0000h.

Как скопировать этот квадрат в другие уголки (19350)?

Я пытался что-то вроде этого:

MOV SI,38500 
    MOV DI,19350 
INIT: 
    MOV CX,4   ; loop 4 times 
COPY_BOX: 
    MOV AX,DS:[SI] ; copy two pixels 
    MOV DS:[DI],AX 
    ADD SI,2   ; move to the next two pixels 
    ADD DI,2 
    LOOP COPY_BOX 
    ADD SI,312  ; drop one line and position on the first pixel 
    ADD DI,312 
    JMP INIT   ; copy next row of pixels 

; do this for the 8 rows 

Что я делаю неправильно?

+1

Какая часть вашего кода ISN Не работает? Где это происходит? Вы пробовали пройти через него с помощью отладчика? –

+0

@CodyGray Он просто не работает, Dosbox замерзает. Я запускаю код в Dosbox, и я попытался использовать отладчик Turbo, но он не работает в графическом режиме: \ Можете ли вы использовать любой другой способ отладки? – razoes

ответ

2
JMP INIT   ; copy next row of pixels 

Это где ваша программа переходит в бесконечный цикл.
Вам нужно только повторить код высота = 8 раз.
Я решил проблему, поставив эти небольшие счетчики в CH и CL:

MOV SI,100+120*320 ;(100,120) 
    MOV DI,150+60*320 ;(150,60) 
    MOV CH,8   ; loop 8 times vertically 
INIT: 
    MOV CL,4   ; loop 4 times horizontally 
COPY_BOX: 
    MOV AX,DS:[SI]  ; copy two pixels 
    MOV DS:[DI],AX 
    ADD SI,2   ; move to the next two pixels 
    ADD DI,2 
    DEC CL 
    JNZ COPY_BOX 
    ADD SI,320-8  ; drop one line and position on the first pixel 
    ADD DI,320-8 
    DEC CH 
    JNZ INIT 

Если вы готовы использовать строковые примитивы это может выглядеть следующим образом:

CLD 
    PUSH DS    ; 0A000h 
    POP ES 
    MOV SI,100+120*320 ;(100,120) 
    MOV DI,150+60*320 ;(150,60) 
    MOV AX,8   ; loop 8 times vertically 
INIT: 
    MOV CX,4   ; 4 x 2 pixels 
    REP MOVSW   ; copy 1 line of pixels 
    ADD SI,320-8  ; drop one line and position on the first pixel 
    ADD DI,320-8 
    DEC AX 
    JNZ INIT