Сменные колонки дисплея 8086 в сборе - PullRequest
0 голосов
/ 22 ноября 2018

Все.

Я хочу перевернуть столбцы видеоэкрана / d / display в процессе эмулятора DOS 8086.Я изучаю ассемблер в школе.

Вопрос в том, чтобы поменять местами правую вертикальную половину экрана с левой половиной вертикального экрана.

Я хочу выбрать первый столбец, заменить его последним.Затем выберите 2-й столбец, замените его на 24-й столбец и так далее.У меня возникают трудности с определением точного местоположения экрана.Кроме того, мне нужны два счетчика для хранения значения первого и последнего столбца, которые будут соответственно увеличиваться и уменьшаться.Кроме того, мне нужно два регистра, чтобы поменять значения столбцов.Там не должно быть функции clrscr.

Вот мой попытанный код:

<code><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

`

В этом коде есть проблемы с адресацией, и я не могу настроить, как поменять местами эти два столбца.Пожалуйста, дайте мне знать, если есть другой способ поменять эти места памяти.

Спасибо.

Хорошо, друзья, я изменил этот код следующим образом:

<code><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`

Я хотел использовать это утверждение:

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

Ноотладчик говорит, что это ошибка адресации.Любая идея, как я могу увеличивать и уменьшать si и di, чтобы я мог поменять местами правую и левую стороны дисплея.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вот пример того, как отразить.По сути, оба алгоритма одинаковы, но, как указал @ 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
0 голосов
/ 23 ноября 2018

Обычно я не отвечал бы таким образом, так как слишком часто все, к чему это относится, выполняет задание за вас, но вы приложили разумные усилия, поэтому я приведу этот пример, так какнамного проще, чем пытаться объяснить, почему ваша методология не работает.Я намеренно оставил комментарии, так как вам придется использовать отладчик вашего эмулятора, чтобы понять код и прокомментировать его перед передачей.

    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, но я уверен, что вы поймете это.

...