1

我有一个分配,我必须将两位整数插入堆栈。在栈中查找一个数,返回这个数在哪个位置,打印栈中的所有数,从栈中删除一个数。

现在我正在尝试通过使用基指针遍历堆栈来打印堆栈中的所有数字,但我的代码不起作用。

mov di,offset bp   
mov ax, [di]     ;trying to move de value stored in di direction in stack to Ax
mov digito,ah
mov digito2,al

mov dl,digito
mov ah,02
int 21h

mov dl,digito2
mov ah,02
int 21h

mov ah,01
int 21h

因此,在这段代码中,我试图通过将 bp 放入 di 来打印两个数字(以便稍后我可以将其递减以通过所有堆栈),并将存储在该方向的数字传递给 Ax。我是组装新手,所以我不知道我在做什么。

提前感谢您的宝贵时间。(对不起我的英语)

4

1 回答 1

0

抱歉延迟回复。首先,bp实际上并没有“偏移量”,因此您可以将其删除。其次,bp不会自动指向堆栈,除非您这样做(mov bp, sp)。

您没有提到操作系统,但int 21h将其标识为 DOS ......这是实模式,分段内存模型。mov ax, [di]默认为mov ax, ds:[di]. 如果您已将其组装成“.com”文件,则csdsesss都是相同的。如果您已将其组装成“.exe”文件,情况并非如此!你可能想写它mov ax, ss:[di]以确保它。相反,mov ax, [bp] 默认为mov ax, ss:[bp],因此您可能希望使用bp而不是di此处。我怀疑这就是你“应该”这样做的方式。如果你有一个“.com”文件,你可以忘记这部分(在 32 位代码中你也可以忘记它,但这不适用于你)。

然后...您尝试打印数字并不能真正正常工作。查找“如何打印号码?” 有关这方面的更多信息的示例 - 太多了,无法进入这里......

这对初学者来说太难了,IMO(但“教练永远是对的”:))。

于 2013-10-14T19:03:47.103 回答