我正在做一些任务,我需要解决以下问题: 我需要加载一个降序表,该表以值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 :(得分:2)
成功的地址存储一个字节,该字节可以保存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