如何拒绝或反转内存地址
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
我正在做一些任务,我需要解决以下问题: 我需要用降序加载 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