交换显示器8086程序集的列



每个人。

我想在8086 DOS模拟器进程中翻转视频屏幕/d/显示的列。我在学校学习汇编语言。

问题是将屏幕的垂直右半部分与垂直屏幕的左半部分交换。

我想选择第一列,用最后一列替换它。然后选择第2列,用第24列替换,以此类推。我很难计算出确切的屏幕位置。此外,我需要两个计数器来存储第一列和最后一列的值,它们将分别递增和递减。另外,我需要两个寄存器来交换列值。不应该有clrscr函数。

这是我尝试的代码:

<pre>`
[org 0x0100]

mov bx,1    ;dummy number
mov di,1     ;left-most column

Call FlipColumn
FlipColumn:

mov  ax, 0xb800               
mov  es, ax             ; point es to video base              
mov  al, 80             ; load al with columns per row               
mull  byte [di]       ; multiply with y position               
add  ax, [bx]        ; add x position               
shl  ax, 1              ; turn into byte offset               
mov  di, ax             ; point di to required location               
mov [es:di],ax     ;first row & first column element
mov dx,[es:di]
FlipColumn1:
mov di, 25
mov  ax, 0xb800               
mov  es, ax             ; point es to video base              
mov  al, 80             ; load al with columns per row               
mull  byte [di]       ; multiply with y position               
add  ax, [bx]        ; add x position               
shl  ax, 1              ; turn into byte offset               
mov  di, ax             ; point di to required location               
mov [es:di], dx
jne FlipColumn
ret
mov ax,0x4c00
int 21h
</pre>`

在这段代码中,有一些问题正在解决,我无法配置如何交换这两列。请告诉我是否有其他方法可以交换这些内存位置。

谢谢。

好吧,朋友们,我这样修改了这个代码:

<pre>`
[org 0x0100]
mov di, 1
mov si, 41
FlipColumn:
mov ax, 0xb800
mov es, ax
mov word ax, [es:1*80+1]
mov word bx, [es:41*80+1]
mov word [es:1*80+1], bx
mov word [es:41*80+1], ax
inc si
inc di
cmp si, 80
jbe FlipColumn 
mov ax, 0x4c00
int 21h`
</pre>

我想使用以下语句:

mov ax, [es:di*80+1]
mov bx, [es:si*80+1]

但是调试器说,这是一个寻址错误。知道我如何递增和递减si和di,以便交换显示器的右侧和左侧吗。

下面是一个如何镜像的示例。从根本上讲,这两种算法是相同的,但正如@Ped7g所指出的,该规范并不是真正确定的。

我想选择第一列,用最后一列替换它。然后选择第2列,用第24列替换,依此类推

push    ds
push    es
mov     ax, 0xb800
mov     ds, ax
mov     es, ax
xor     si, si
mov     di, 158
mov     cx, 25
L0:  push    cx
mov     cx, 40
push    di
push    si
L1:  mov     ax, [di]
mov     bx, [si]
mov     [di], bx
mov     [si], ax
inc     si
inc     si
dec     di
dec     di
loop    L1
pop     si
pop     di
add     si, 160
add     di, 160
pop     cx
loop    L0
pop     es
pop     ds

通常情况下,我不会以这种方式回应,因为它通常只相当于为你做作业,但你已经付出了合理的努力,所以我将举这个例子,因为它比解释为什么你的方法不起作用要简单得多。我特意省略了注释,因为你有责任使用模拟器的调试器来理解代码并在提交之前对其进行注释。

push    ds
push    es
mov     ax, 0xb800
mov     ds, ax
mov     es, ax
xor     si, si
mov     di, 80
mov     cx, 25
L0: push    cx
mov     cx, 40
L1: mov     ax, [di]
movsw
mov     [si-2], ax
loop    L1
xchg    si, di
add     di, 160
pop     cx
loop    L0
pop     es
pop     ds

你可能需要对这个NASM代码进行一些即兴创作,但我相信你会明白的。