Mr.C 发表于 2011-11-24 23:33:08

要技术值的大侠进来看下,是不是我的理解有偏差。

assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,30h ;将设置栈顶ss:sp指向cs:30

mov bx,0
mov cx,8
s: push cs:
add bx,2
loop s

mov bx,0
mov cx,8
s0: pop cs:
add bx,2
loop s0

mov ax,4c00h
int 21h
codesg ends
end start
以上程序实现第3行中的数据段反向排列。

思路是:
1。在数据段后面,开辟一段空间(第4行)
2。设置栈段为cs:30h(第5,6,7行)
3。然后你们都懂了,push,push,push,....pop,pop,pop....逆向交换位置。

以上是王爽第2版128页程序6.3的原代码,我手抄下来的。

以下是不解之处:
第4行为什么定义了16个字型单元呢?
既然是临时存放第3行数据,只要跟第3行一样定义8个word就行了。
是不是我有考虑不周全的地方。


cfer 发表于 2011-11-24 23:33:09

楼主你的这个问题我学的时候也试过这样做,发现开辟8个字空间是不够的,至少需要12个字空间才行,那四个多余的字空间被放了下一条指令的cs,ip等等的东西,到现在都不知道为什么会这样。书上也没有说明。所以我最后得到的结论就是栈空间要开辟大一点,这样才不会出错。你可以只开辟8个试试看就知道了。

慢慢走 发表于 2011-11-25 07:28:05

这个自己定义的
你觉得够用就行了

z310394543 发表于 2011-11-25 09:28:13

jacalhu 发表于 2011-11-25 09:28:32

第五行的mov sp,30h ;是定义局部变量的,指向第三行定义的数据,当大小是自定义的,
但不能小于第三行定义的数据的大小哦,如果太小的话再PUSH就会把第三行定义的数据给覆盖哦。。。

z310394543 发表于 2011-11-25 09:53:54

kane080824 发表于 2011-11-25 11:18:16

栈段有时候会存放一些别的数据,比如调用子程序时的cs,ip等等,当然还有一些别的,所以一般设置栈的时候请别吝啬空间,现在是大内存时代,不是过去别瞎省,栈太小会使程序运行出错,经常遇到的情况是提示:cpu遇到无效的指令...

ztc123 发表于 2011-11-25 20:17:56

作者喜欢这样 ,没办法

api 发表于 2011-11-25 20:54:12

ztc123 发表于 2011-11-25 20:17 static/image/common/back.gif
作者喜欢这样 ,没办法

这不是作者喜欢这样,3楼已经实验过,开辟8个字的空间是不够的,你用T手动试试看就知道了
页: [1]
查看完整版本: 要技术值的大侠进来看下,是不是我的理解有偏差。