簡體   English   中英

如何拒絕或反轉內存地址

[英]How to deny or invert the memory address

我正在執行一些任務,並且需要解決以下問題:我需要加載一個降序表,該表以值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個降序字值。
此時,您必須通過將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM