|
主题 : : 实验9,请教栈的用法。 [已解决] |
回复[ 5次 ]
点击[ 307次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-07-17 23:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
assume cs:codesg
data segment
db 'welcome to masm!'
data ends
stacksg segment
dw 0,0,0,0
dw 16 dup(200h,2400h,7100h)
stacksg ends
codesg segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov ax,stacksg
mov ss,ax
mov sp,8h
mov cx,10h
mov si,0h
mov di,0h
s:
mov dx,cx
mov cx,3h
mov bx,0h
s1: pop ax
mov al,ds:[si]
mov es:[bx+40h+di],ax
add bx,0a0h
loop s1
mov cx,dx
inc si
add di,2h
loop s
mov ax,4c00h
int 21h
codesg ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-07-17 23:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
首先,这个问题困扰我很久了。今天彻底爆发了,我想把它叫‘栈的初始化问题’,初始设置ss=(stacksg),sp为8h,可我定义的stacksg段有104个字节,然后,除了前面的四个字以外,其他的数值都是在程序里面要用到的。当然,前面课本里面提过,cpu是因为我们设置了ss sp才知道这个是栈段,那么,是不是可以理解为sp为8h,就是栈的大小就是8h,那我程序里面的操作就是超界了。结果是对的,所以,很困扰,请求master老大,以及其他的大大答疑。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-07-18 00:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26 |
确实超界了,看下运行时栈内数据就知道了
stacksg segment
dw 0,0,0,0 这里预留了空间,如果没有,就出错了
dw 16 dup(200h,2400h,7100h)
stacksg ends | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-07-23 15:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16 |
assume cs:codesg
data segment
db 'welcome to masm!'
data ends
stacksg segment
dw 0,0,0,0
dw 16 dup(200h,2400h,7100h)
stacksg ends
codesg segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov ax,stacksg
mov ss,ax
mov sp,8h
mov cx,10h
mov si,0h
mov di,0h
s:
mov dx,cx
mov cx,3h
mov bx,0h
s1: pop ax
mov al,ds:[si]
mov es:[bx+40h+di],ax
add bx,0a0h
loop s1
mov cx,dx
inc si
add di,2h
loop s
mov ax,4c00h
int 21h
codesg ends
end start
------------------
回复:恩是操界了,因为mov ax,stacksg
mov ss,ax
mov sp,8h这三条指令设置栈段长为8个字节,栈段范围为:ss:0~ss:7h,初始栈空。而根据你程序可知,是将栈外的存储200h,2400h,7100h数据出栈。之所以测试时没有问题,那是因为你只是把栈外的值读出,并没有改动栈外的内存单元存储的数据,否则如果把栈外的重要内存单元的数据篡改,不问题才奇怪呢。再说,CPU本身并不识别是否为栈段,只能由编程者自己控制,不要超过栈界。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-07-24 12:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
|
|
|
|
|
[第5楼]
[ 回复时间:2010-07-24 12:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
此贴由 贴主 于 [ 2010-07-24 12:31 ] 结贴。 结贴原因:问题已解决 | | |
|