所有人。
我想在8086 DOS仿真器进程中翻转视频屏幕/ d /显示的列。我正在学校学习汇编语言。
问题是将屏幕的右垂直一半换成垂直屏幕的左一半。
我想选择第一列,将其替换为最后一列。然后选择第二列,将其替换为第二十四列,依此类推。我在计算确切的屏幕位置时遇到困难。另外,我需要两个计数器来存储第一列和最后一列的值,该值将分别递增和递减。另外,我需要两个寄存器来交换列值。应该没有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,以便可以交换显示的左右两侧。
答案 0 :(得分:2)
这里是如何镜像的示例。从根本上讲,这两种算法是相同的,但正如@ Ped7g所指出的,规范并不是真正的确定性。
我想选择第一列,将其替换为最后一列。然后选择第二列,将其替换为第二十四列,依此类推
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
答案 1 :(得分:1)
通常情况下,我不会以这种方式来回应,因为它等同于为您完成任务,但是您付出了相当大的努力,因此我将举这个例子,因为它是比尝试解释为什么您的方法不起作用要简单得多。我故意省略了注释,因为您有责任使用仿真器的调试器来理解代码并在上交之前对其进行注释。
client_secret_basic
您可能需要对NASM代码进行一些即兴创作,但我敢肯定,您会发现的。