看书练习过程中发现的问题,求解释
《汇编语言》书上128页的程序6.3要求使用入栈出栈的方式实现数据的逆序存放。一共要逆序存放8个字型数据,书上的例程开辟了16个字的栈空间。我一开始觉得8个字型数据就开辟8个字型栈空间就够了呀。于是在自己编的过程中就随意开辟了10个字型栈空间(就是20个字节)。结果调试时发现运行过后最后几个数据都是错的,然后仔细看了一下自己的和书上的例子的内存使用情况,发现压栈时不止用到了8个字空间,至少要12个字空间才能完成这么个任务。可是我不理解为什么是这样,为什么压栈过程会用到12个字型空间。求高手指点。。。。
这是我一开始的程序,只有把dw后面至少再加两个0才能实现功能。大家可以运行看看。
ASSUME CS:CODE
CODE SEGMENT
DW 1234H,3455H,0BD3H,259CH,2134H,1111H,25BAH,0CBCH
DW 0,0,0,0,0,0,0,0,0,0
start: MOV AX, CS
MOV SS, AX
MOV SP, start
MOV AX, CS
MOV DS, AX
MOV BX, 0
MOV CX, 8
S: PUSH
INC BX
INC BX
LOOP S
MOV BX, 0
MOV CX, 8
S0: POP
ADD BX, 2
LOOP S0
MOV AX, 4C00H
INT 21H
CODE ENDS
END start debug下..8个0没问题... {:5_92:}呵呵!理论来说8个是够用了,但是8086的cpu会用栈空间的来保存一些数据,用来记录现时的情况,如果你用T命令单步执行,会有其他的数据入栈,这些数据是下一条指令的段地址和偏移地址。好多人问这个问题! 呵呵 感谢楼上的回答,确实看到了里面有下一条指令的段地址和偏移地址,不过还有其他的。看来以后用栈的时候还是把空间设大点好。 yipwing 发表于 2011-11-7 22:48 static/image/common/back.gif
debug下..8个0没问题...
有的哦,要用栈存放些附加的东东,会使栈指针越界,覆盖原始数据的。 ASSUMECS:CODE
CODESEGMENT
DW 1234H,3455H,0BD3H,259CH,2134H,1111H,25BAH,0CBCH ;8位字型数据
DW 0,0,0,0,0,0,0,0,0,0 ;8位字型数据加上面的字型数据也就是16进制的10H
start:MOV AX, CS
MOV SS, AX ;让SS栈取得段地址
MOV SP, 11H ;栈的顶应该是11H
MOV AX, CS
MOV DS, AX ;让DS段寄存器取得数据的段地址
MOV BX, 0
MOV CX, 8
S: PUSH ;入栈DS:地址中的1234H数据放到,栈寄存器中的10H位置
ADD BX, 2
LOOP S
MOV BX, 0
MOV CX, 8
S0: POP ;出栈放置DS:位置中,也就是当初的CS:0的位置
ADD BX, 2
LOOP S0
MOV AX, 4C00H
INT 21H
CODE ENDS
END start我看了你的课题我也做了一遍。不知对不对。错误之处请各位大牛没具体指出。多多原谅。。欢迎指点。。 楼上朋友的栈顶的sp应是24h,其实可以直接把start赋值给sp的,这样不用自己算。 本帖最后由 wxc807 于 2011-11-8 00:55 编辑
cfer 发表于 2011-11-7 23:59 static/image/common/back.gif
楼上朋友的栈顶的sp应是24h,其实可以直接把start赋值给sp的,这样不用自己算。SP不是偏移地址吗??
cfer 发表于 2011-11-7 23:34 static/image/common/back.gif
有的哦,要用栈存放些附加的东东,会使栈指针越界,覆盖原始数据的。
我用模拟器模拟的,没有越界。。
只是在执行int 21h 后会有数据覆盖。。 有好多的问题。感觉不能太钻牛角尖,问题一大堆。。。 :L 原来还有这么多问题啊 了解啦
页:
[1]