将一个像素从坐标 (x0,y0) 复制到 (x1,y1)

Copy a pixel from coords (x0,y0) to (x1,y1)

我正在尝试将一堆像素从屏幕位置复制到其他位置。想象一下,我在坐标 (100,120) 上有一个 8x8 的绿色正方形,我想将正方形复制到坐标 (150,60)。

我正在使用图形模式 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

我做错了什么?

JMP INIT          ; copy next row of pixels

这是您的程序进入无限循环的地方。
您只需要重复代码高度=8次。
我通过将这些小计数器放在 CHCL:

中解决了这个问题
  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