. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->第一个程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  王爽《汇编语言》实验三  [待解决] 回复[ 14次 ]   点击[ 1866次 ]  
newasmer
[帖 主]   [ 发表时间:2007-06-27 15:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-06-26 14:20
在看王爽老师的书的第四章的时候,做课后实验的时候发生了如下问题。 
实验了给出了代码要求用MASM5.0编译然后连接生成EXE文件。代码如下: 
assume cs:codesg 
codesg segment 
mov ax,2000H 
mov ss,ax 
mov sp,0 
add sp,4 
pop ax 
pop bx 
push ax 
push bx 
pop ax 
pop bx 
mov ax,4c00h 
int 21h 
codesg ends 
end 
然后在用DEBUG追踪的时候到POP出栈的时候会提示错误而不能继续,但是在单独执行程序的时候却可以执行请明白的朋友告诉下为什么会出错呢? 
我的CPU是塞扬D2。93的,是不是该版本的MASM对CUP类型的不支持还是什么呢希望大家帮助。。。
问题补充:对了这个程序在LINK的时候提示没有设置栈段
Wednesday
[第1楼]   [ 回复时间:2007-07-19 14:56 ]   [引用]   [回复]   [ top ] 
荣誉值:43
信誉值:3
注册日期:2007-07-05 19:53
1.
debug跟踪时出错,是因为debug命令的执行过程也用到了栈,而栈空间设置过小导致栈顶超界,故Windows提示错误。
与MADSM、CPU没有关系。

2.
因为你的程序里没有自己定义栈段啊。

把程序写成这样就没有LINK : warning L4021: no stack segment了。

assume cs:codesg,ss:stackseg
stackseg segment stack
dw 0,0
stackseg ends
codesg segment
mov ax,stack
mov ss,ax
mov sp,0
add sp,4
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax,4c00h
int 21h
codesg ends
end

堆栈段在segment后面必须加上stack声明啊!!!
caoheqian
[第2楼]   [ 回复时间:2007-10-21 21:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-09-30 21:53
我把add sp,4
改成add sp,8
编译通过。
goal00001111
[第3楼]   [ 回复时间:2007-11-09 22:03 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16
TO 1楼:
代码第6行的“mov ax,stack ”应该改成“mov ax,stackseg”。
1楼的做法很好,我又学了一招。
mxtk1987
[第4楼]   [ 回复时间:2007-12-23 23:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-11-15 23:59
为什么按照1楼和3楼的方法修改后,在执行第二次执行T命令就没有反应了 请问是怎么回事??
mouse
[第5楼]   [ 回复时间:2007-12-24 08:25 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
我按照一楼的说法做了一下,有个错误,不过改了之后确实没有了那个栈空警告错误了。

代码如下
assume cs:codesg,ss:stackseg 

stackseg segment stack
        dw 0,0 
stackseg ends 

codesg segment 
        mov ax,stackseg ;这还是段标号,而不是stack
        mov ss,ax 
        mov sp,0 
        add sp,8 
        pop ax 
        pop bx 
        push ax 
        push bx 
        pop ax 
        pop bx 
        mov ax,4c00h 
        int 21h 
codesg ends 
end
wzh5024wzh
[第6楼]   [ 回复时间:2008-03-26 22:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-28 00:12
4改8,很好。。。
xilong3
[第7楼]   [ 回复时间:2008-03-27 09:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-03-27 08:40
我刚开始学masm  有好多东西都不懂
lansekongjian414
[第8楼]   [ 回复时间:2008-04-01 22:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-03-24 16:51
回复:[贴 主]
------------------
我的猜想是:在debug 下用T命令执行是 一个中断调用,中断调用的过程会把 PSW,CI,IP(总共6个字节)相继入栈,就是 程序中的栈,4个字节的空间太小就会报错!
更好答案的指教
lansekongjian414
[第9楼]   [ 回复时间:2008-04-01 22:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-03-24 16:51
上面的CS,不是CI
xp55699312
[第10楼]   [ 回复时间:2009-09-09 23:53 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2009-08-15 01:25
我把add sp,4
改成add sp,8
编译通过。
------------------
回复:我有个疑问,ADD SP,8以后那栈空间的大小是多少,,对这里有点不清楚
xp55699312
[第11楼]   [ 回复时间:2009-09-10 00:15 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2009-08-15 01:25
我把add sp,4
改成add sp,8
编译通过。
------------------
回复:我有个疑问,ADD SP,8以后那栈空间的大小是多少,,会越界
shuxsheng
[第12楼]   [ 回复时间:2009-09-11 10:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-31 18:08
mov sp,0  
add sp,4  

用T命令,
出来的是,
13CB:0008 83C408        ADD     SP,+04
为什么?
ailesargentees
[第13楼]   [ 回复时间:2010-03-20 20:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-02 17:21
ls的 因为mov sp,0 是紧接着它上面的指令mov ss,ax 在一个-t的过程中直接执行了 所以执行完后直接显示mov sp,0的下一条指令 add sp,4
zhsllove
[第14楼]   [ 回复时间:2010-03-21 10:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-18 08:37
貌似如果用 stack 已经定义堆栈段,下面的程序就不用再传送堆栈段基址到堆栈段寄存器了,所以程序可以简化三个传送指令mov ax,stackseg   mov ss,ax   mov sp,0
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved