|
主题 : : 王爽《汇编语言》实验三 [待解决] |
回复[ 14次 ]
点击[ 1866次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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的时候提示没有设置栈段 | | |
|
|
|
|
[第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声明啊!!! | | |
|
|
|
|
[第2楼]
[ 回复时间:2007-10-21 21:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-09-30 21:53 |
我把add sp,4
改成add sp,8
编译通过。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2007-11-09 22:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:9
注册日期:2007-10-19 10:16 |
TO 1楼:
代码第6行的“mov ax,stack ”应该改成“mov ax,stackseg”。
1楼的做法很好,我又学了一招。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2007-12-23 23:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-11-15 23:59 |
为什么按照1楼和3楼的方法修改后,在执行第二次执行T命令就没有反应了 请问是怎么回事?? | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第6楼]
[ 回复时间:2008-03-26 22:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-28 00:12 |
|
|
|
|
|
[第7楼]
[ 回复时间:2008-03-27 09:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-27 08:40 |
|
|
|
|
|
[第8楼]
[ 回复时间:2008-04-01 22:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2008-03-24 16:51 |
回复:[贴 主]
------------------
我的猜想是:在debug 下用T命令执行是 一个中断调用,中断调用的过程会把 PSW,CI,IP(总共6个字节)相继入栈,就是 程序中的栈,4个字节的空间太小就会报错!
更好答案的指教 | | |
|
|
|
|
[第9楼]
[ 回复时间:2008-04-01 22:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2008-03-24 16:51 |
|
|
|
|
|
[第10楼]
[ 回复时间:2009-09-09 23:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:2
注册日期:2009-08-15 01:25 |
我把add sp,4
改成add sp,8
编译通过。
------------------
回复:我有个疑问,ADD SP,8以后那栈空间的大小是多少,,对这里有点不清楚 | | |
|
|
|
|
[第11楼]
[ 回复时间:2009-09-10 00:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:2
注册日期:2009-08-15 01:25 |
我把add sp,4
改成add sp,8
编译通过。
------------------
回复:我有个疑问,ADD SP,8以后那栈空间的大小是多少,,会越界 | | |
|
|
|
|
[第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
为什么? | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第14楼]
[ 回复时间:2010-03-21 10:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-03-18 08:37 |
貌似如果用 stack 已经定义堆栈段,下面的程序就不用再传送堆栈段基址到堆栈段寄存器了,所以程序可以简化三个传送指令mov ax,stackseg mov ss,ax mov sp,0 | | |