显示8086组件的交换列

时间:2018-11-22 14:08:17

标签: assembly nasm x86-16 emu8086

所有人。

我想在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,以便可以交换显示的左右两侧。

2 个答案:

答案 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代码进行一些即兴创作,但我敢肯定,您会发现的。

相关问题