回 帖 发 新 帖 刷新版面

主题:有个程序,各位大虾帮忙分析一下

程序如下:
assume cs:codesg
codesg segment
mov ax,cs
mov ss,ax
mov sp,number
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax,4c00H
int 21h
     db 10 dup(0)
number:
codesg ends
end 
1.POP过后原来的数据不是应该不变的吗?为什么POP AX运行前后存储空间的数值有变化呢??(DEBUG里看是有变化)
2.你举的例子里有一句,mov sp,number,number是定义的一个变量,字节变量"00"一共重复10次,也就是10个字节,DEBUG里查看sp的值,该条指令执行后,从最初的0000变为001C,明显不是number变量的长度,用U命令查看,mov ss,ax之后的指令是:mov sp,001C,这句是....???为什么载入程序后会出现一条直接给sp赋值001C的命令呢??
3.还是例子中的一句
db 10 dup(0)
number:
这个是定义number的吧?改为number db 10 dup (0)运行结果就不一样了
是不是这一句根本就不是定义变量的语句呢?? 
4.该程序DEBUG一步一步运行时没有问题(Windows平台),而另一个程序却会出错,原因是系统没有给程序分配堆栈空间,但是上面这个程序载入后系统给程序分配堆栈空间了吗??
堆栈大小是??

回复列表 (共1个回复)

沙发


1、看前面的程序,感觉LZ并没有给AX赋值。使用PUSH AX时,AX里是个随机数,谁也不知道是什么,在执行POP AX时,里面的结果自然不一样。
2、同样的,NUMBER并没有赋值,放入SP内的也只是个随机数,你再执行一次,也许又不一样了
3、那不是给NUMBER赋值
4、程序会自动分配堆栈空间,具体大小。。忘了。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册