Pointers ASM x86如何正确地从数组中获取指针?(16位TASM/DOS)

Pointers ASM x86如何正确地从数组中获取指针?(16位TASM/DOS),pointers,assembly,x86,tasm,segment,Pointers,Assembly,X86,Tasm,Segment,好了,各位,让我们希望这是一个简单的例子:我需要访问一个数组以在16位TASM中实现双缓冲(我使用模式13h)。但是:无论我使用“OFFSET”、“BYTE PTR[Array]”、“BYTE PTR Array”还是我已经尝试过的任何方法,程序都会读/写不正确的内存块,这在一定程度上落后于数组的实际启动 以下是我的代码(目前还没有真正优化过,而且非常混乱): 这段代码显示了一个彩虹色的框,你可以用左右箭头键移动它 ;INITIALISE MOV BX, OFFS

好了,各位,让我们希望这是一个简单的例子:我需要访问一个数组以在16位TASM中实现双缓冲(我使用模式13h)。但是:无论我使用“OFFSET”、“BYTE PTR[Array]”、“BYTE PTR Array”还是我已经尝试过的任何方法,程序都会读/写不正确的内存块,这在一定程度上落后于数组的实际启动

以下是我的代码(目前还没有真正优化过,而且非常混乱):

这段代码显示了一个彩虹色的框,你可以用左右箭头键移动它

;INITIALISE
        MOV     BX,     OFFSET VPage
        MOV     [PageSeg],BX
这是我伤心的尝试获取指向缓冲区的指针,但没有返回正确的指针


很抱歉,我的问题没有解决,我意识到当我因为某种原因立即起床时。

虽然这不是我编写代码的方式,但我会提供一些建议,让您更接近解决问题

可执行文件加载时,DS和ES寄存器最初指向程序的。在您的情况下,您至少需要将DS指向您的数据段。DOS EXE加载器在运行时填写的数据段可以在代码中引用,方法是在段名称前面加上@(at)符号。因此,您可以替换此代码:

;INITIALISE
MOV     BX,     OFFSET VPage
MOV     [PageSeg],BX
XOR     AH,     AH
MOV     AL,     [YPos]
MOV     DX,     320
MUL     DX
ADD     AX,     [XPos]
MOV     DI,     AX
MOV     AL,     [Color]
MOV     ES,     [PageSeg]  
MOV     ES:[DI],AL
为此:

;INITIALISE
MOV BX, @DATA           ; Set up DS with our program's DATA segment
MOV DS, BX              
MOV     [PageSeg],BX    ; VPage is in DATA segment, move segment to PageSeg
DrawPixel
代码中,需要将VPage偏移量添加到DI中。替换此代码:

;INITIALISE
MOV     BX,     OFFSET VPage
MOV     [PageSeg],BX
XOR     AH,     AH
MOV     AL,     [YPos]
MOV     DX,     320
MUL     DX
ADD     AX,     [XPos]
MOV     DI,     AX
MOV     AL,     [Color]
MOV     ES,     [PageSeg]  
MOV     ES:[DI],AL
与:

视频模式13h为320x200x256色。所需的视频ram量为320*200*1=64000。这可以从以下内容更改:

VPage   DB      64010   DUP(0)  ;TODO: Size *might* be incorrect. 
致:

通过这些更改,程序似乎显示一个彩虹框,并在屏幕上用箭头键左右移动


可能还有其他的bug,但我不知道你想实现什么。这段代码可以大大简化。我所做的更改对于您编写程序的方式来说是最小的,并使其具有一定的功能性。

我建议使用调试器(在您的示例中是Turbo调试器)逐步检查代码,以查看正在发生的情况。您没有提到哪个内存地址或数组(甚至是哪个指令)你认为这是一个问题。我投票决定结束这场比赛,这不是一场比赛。没有描述程序的功能、工作方式、预期和发生的情况。有人提到访问
数组时可能出现的问题,但代码中没有此类变量,也没有说明海报认为问题在哪里(特定说明)。有些代码在游戏循环中被注释掉了,我认为这不是一个好例子。
ds
没有正确初始化。@FrankKotler同样,除了没有设置ds(默认为PSP)之外,我注意到ES被设置为
VPage
的偏移量,这是完全错误的。海报可能希望用类似的东西初始化DS、ES和
PageSeg
,而不是
MOV BX、@data
,然后
MOV DS、BX
,然后
MOV[PageSeg],BX
。谢谢,通过我的各种尝试使双缓冲区工作,很多代码都被弄乱了。是的,我知道64000是正确的大小,但在此之前,大小是63999字节。再次感谢你帮助我
VPage   DB      64000   DUP(0)