Sorting 汇编程序不运行英特尔8086

Sorting 汇编程序不运行英特尔8086,sorting,assembly,average,procedure,x86-16,Sorting,Assembly,Average,Procedure,X86 16,下面的代码应该是获得20个用户输入的数字(6位数或更少),计算平均值并对它们进行排序,当我将其设置为获得6个或更少的数字时,效果很好。但当它设置为获取7-20个数字时,在获取数字后,它会跳过下一个过程,有时会再次运行GetNum过程(从用户处获取数字的过程),当它获取11个数字时,我会收到消息“程序已将控制权返回到操作系统” 问题在于这两条线路(在其他地方可能类似): 默认情况下,bp寄存器寻址的是堆栈段,而不是数组所在的数据段。您必须使用另一个索引寄存器,或者使用 mov ds:array[b

下面的代码应该是获得20个用户输入的数字(6位数或更少),计算平均值并对它们进行排序,当我将其设置为获得6个或更少的数字时,效果很好。但当它设置为获取7-20个数字时,在获取数字后,它会跳过下一个过程,有时会再次运行GetNum过程(从用户处获取数字的过程),当它获取11个数字时,我会收到消息“程序已将控制权返回到操作系统”


问题在于这两条线路(在其他地方可能类似):

默认情况下,
bp
寄存器寻址的是
堆栈
段,而不是
数组
所在的
数据
段。您必须使用另一个索引寄存器,或者使用

mov ds:array[bp], ax
mov ds:array[bp+2], dx
如果它使用少量元素,那么幸运的是,没有任何东西被破坏而导致崩溃或破坏数据

更新

我建议修改
GetNum
proc,这样您就可以使用
bx
索引
array
,而不是
bp

proc GetNum  
mov bx, 0
mov ch, 20

NextNumber:
push bx
NewLine
...
pop bx
mov array[bx], ax
mov array[bx+2], dx
add bx, 4 
...

与排序功能类似,交换
bx
bp
的角色。最好将
bp
用作通用寄存器,将
bx
用作索引寄存器。

Enter
不是一个特别好的命名选择,因为有一条x86指令具有相同的名称。您确定汇编器确实扩展了宏,而不是为
enter
指令生成操作码吗?(也就是说,你看过你的程序的反汇编吗?)我不知道有一个“enter”指令,我重命名了宏,但问题仍然存在。使用调试器单步执行代码。不要使用BP作为数据变量的指针(如Weather所说)。顺便说一句,将堆栈从DD更改为DW对我来说是一个非常有趣的发现。@Asnira Jose厚颜无耻:堆栈没有这样的类型。您的意思是您将
array DD
更改为
array DW
。这是错误的:您需要20*4字节来存储数据。要使用
DW
您必须声明40个元素而不是20个,因为您为每个元素存储32位值。@Asnira很遗憾您没有找到正确的方法来解决这个问题。这一次你是在逃避,但你还没有学会正确的方法。下次,你有更好的装备吗?我用一些建议更新了我的答案。你最终将使用
bp
作为索引寄存器。它的典型用途是索引堆栈框架,但这与“借用”堆栈底部完全不同!这就是为什么
bp
的默认段是
stack
段的原因。对于好奇的人来说,有大量的资料,而要编写好程序,你必须做到这一点。这里有一个关于堆栈帧的问题,还有其他问题!
mov ds:array[bp], ax
mov ds:array[bp+2], dx
proc GetNum  
mov bx, 0
mov ch, 20

NextNumber:
push bx
NewLine
...
pop bx
mov array[bx], ax
mov array[bx+2], dx
add bx, 4 
...