Как отказать или инвертировать адрес памяти - PullRequest
1 голос
/ 30 мая 2019

Я выполняю некоторые задачи, и мне нужно решить следующую проблему: Мне нужно загрузить с нисходящей таблицей, эта таблица начинается со значения 0000 и заканчивается ffff, например:

Addres    value
0000      ffff
0001      fffe
0002      fffd
....      ....
....      ....
ffff      0000

Мой код:

mov ax,0000
mov bx,0000
not bx
mov ax,bx ; this is line 41
inc ax
dec bx
cmp ax,ffff
jne 41 
int 3

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

1 Ответ

2 голосов
/ 31 мая 2019

Последовательные адреса хранят один байт, который может содержать значения от 0 до 255 .Для значений от 0 до FFFFh, которые вы хотите сохранить, вам потребуется 131072 байта (65536 * 2).В 16-битном режиме (режиме реального адреса) сегмент памяти может иметь 65536 байтов, что усложняет задачу!

    cld
    xor     di, di    ; Address 0000h
    mov     ax, FFFFh ; Value
More:
    stosw
    dec     ax
    js      More

Это будет хранить 32768 нисходящих значений слов по адресам смещения 0, 2, 4,6, ..., 65534.
На этом этапе вам придется изменить регистр сегмента ES, добавив к нему 2048.
Затем перейдите к следующему коду:

    ; DI=0 AX=7FFFh 
More_:
    stosw
    dec     ax
    jnz      More_

AОднако возможно байтовое решение:

    mov     bx, 0
    mov     al, 255
Next:
    mov     [bx], al
    inc     bx
    dec     al
    jnz     Next

    ; 0000  FF
    ; 0001  FE
    ; 0002  FD
    ;
    ; 00FE  01
    ; 00FF  00

Байтное решение с использованием 1 регистра:

    xor     bx, bx
 ext:
    mov     [bx], bl
    not     byte ptr [bx]
    inc     bx
    test    bl, bl
    jnz     Next

    ; 0000  FF
    ; 0001  FE
    ; 0002  FD
    ;
    ; 00FE  01
    ; 00FF  00
...