Все.
Я хочу перевернуть столбцы видеоэкрана / 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, чтобы я мог поменять местами правую и левую стороны дисплея.