如何拒绝或反转内存地址

How to deny or invert the memory address

我正在做一些任务,我需要解决以下问题: 我需要用降序加载 table,这个 table 从值 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

直接,这段代码不起作用,什么都不做。我对汇编知识不多,我无法检测到错误。

连续的地址存储一个字节,可以容纳从 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

这将在偏移地址 0、2、4、6、...、65534 处存储 32768 降序 word-values。
此时,您必须通过向其添加 2048 来更改 ES 段寄存器。
然后继续下一个代码:

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

字节解决方案是可行的:

    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