每个人。
我想在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代码进行一些即兴创作,但我相信你会明白的。