. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9,请教栈的用法。  [已解决] 回复[ 5次 ]   点击[ 307次 ]  
jjch224
[帖 主]   [ 发表时间: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
jjch224
[第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老大,以及其他的大大答疑。
tinyparticle
[第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
towersimper
[第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本身并不识别是否为栈段,只能由编程者自己控制,不要超过栈界。
jjch224
[第4楼]   [ 回复时间:2010-07-24 12:31 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
受教了。
jjch224
[第5楼]   [ 回复时间:2010-07-24 12:31 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
此贴由 贴主 于 [ 2010-07-24 12:31 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved