|
主题 : : 检测点6.1的第二小题 求救啊````达人飞过来 快来看 [待解决] |
回复[ 19次 ]
点击[ 978次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-03-10 01:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2009-02-22 23:57 |
几乎本论坛的关于这个帖子都看了``但还是不明白呀``为什么第三空要填 pop cs:[bx] 为什么``不是说只要把数据压栈就行了吗``为什么还要出栈``不懂啊 都想了1个小时了``还有个问题 如果我那空不填 就生成不了obj文件`也就不能跟踪了啊`如果随便填 可能会出一些问题吧``啊 头好疼`` | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-03-10 09:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07 |
刚看楼主的博客还没有作业,一定要按照前言提到的“两个必须”学习啊,前面的不透彻很容易后面出现不懂的东西。
要好好分析一下程序中每条语句的作用。首先程序把数据也定义在了代码段。
在程序的开始指令赋值了ss<-cs ds<-0 到后面的循环,push [bx],是把0:[bx]的数据入栈,add bx,2是寻找下一个字单元,所以之间需要填写把栈中的数据写入cs:[bx]的操作。
0:[bx]->cs:[bx]才能“复制过去”,如果用如果设置sp=16,直接把0:[0-15]复制到cs:[0-15]显然顺序就不对了。(不清楚的去看push 和pop的具体操作步骤) | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-03-10 09:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07 |
如果我那空不填 就生成不了obj文件
-------------
不填这个空就不能通过编译生成obj文件吗?你实验过了吗?!
不要轻易的用脑袋下结论,先不说如果分析推理出正确的判断,也可以用电脑实际去做一下就确定了。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-04-11 09:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2007-12-10 17:12 |
题目是用0:0-0:15的数据填充程序的数据.
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0
start:
mov ax,cs ;cs为所填第一空
mov ss,ax
mov sp,1ah ;此条指令为所填第二空
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s:
push [bx]
pop cs:[bx] ;此条指令为所填第三空
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
题目已经说了后面5个内容为0的字单元当做栈来用.所以第一空明显应该填cs,因为程序的地址在cs,或者cs=ds+10H
第二个空要填sp的大小.也就是栈顶在那里.先放着不管.看第三空上面这行push [bx],把ds:[bx]的内容压栈,
ds:[bx]的内容就是0:0的内容,bx每次自增2,也就是把0:0到0:15的内容依次压倒栈里面.但是栈空间题目指定只有
5个字空间,题目要求改写的内容有8个字,所以这里要想用常规的办法先把0-15的数据入栈,再pop到ds:0-ds:15是
行不通的.换一种思路.可以一边进栈,马上就出栈.这样只占用一个字的栈空间.即先push ds:[bx],随后马上pop
出来.pop到ds:[bx].随着bx每次自增2,0:0-0:15的8个字单元的内容就全部通过这个栈空间的某个字单元进行了
中转.再pop到ds:0-ds:[15]的地方.也完成了题目的要求.所以这个题目实际上只用到栈空间的一个字空间.因为每
次push后跟着就是一次pop,又因为题目的栈空间里面有5个字.所以选那个字作为中转都可以.借个别人的图说明下:
-dcs:0l20
0B6E:0000 23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09 #.V.............
0B6E:0010 00 00 00 00 00 00 00 00-00 00 8C C8 8E D0 BC 12 ................
- ↑ ↑ ↑ ↑ ↑
18 20 22 24 26
12H 14H 16H 18H 20H
如上所示我觉得sp应该是箭头所在位置,即18 20 22 24 26或者12H 14H 16H 18H 20H不应该是奇数。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-04-17 14:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-10-10 01:10 |
这个程序我也看了很久 最后才知道我是对栈不理解 囧 | | |
|
|
|
|
[第5楼]
[ 回复时间:2009-04-30 16:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-22 18:44 |
|
|
|
|
|
[第6楼]
[ 回复时间:2009-05-04 10:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-05-02 11:54 |
第二个空1a咋来的??? 谁能讲讲????? 后面的很好理解 他就是把128页的程序6.3简化了 S和S0都差不多 没必要分开写 | | |
|
|
|
|
[第7楼]
[ 回复时间:2009-05-04 20:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-05-04 20:45 |
程序开始0-15个单元存储数据,后来又开辟了5个字,占10个字节单元,所以从第16-25个单元就当作栈来使用,(栈空时)那么第26个单元就是栈顶了,26 = 0x1ah.所以如是。 | | |
|
|
|
|
[第8楼]
[ 回复时间:2009-05-05 20:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-03-09 09:23 |
说下小弟的看法,因为题目给的是5个字的空间,如果依次入栈肯定是空间不够,所以才会一入栈就,出栈。
至于为什么写pop cs:[bx]其实很容易理解 因为他入栈后 不要忘了入栈是SP减2往里面入的 也就是说就算让程序从CS:0F入栈,数据也是反的 而写pop cs:[bx]的话 不要忘了BX是设定等于0的 而出栈是sp加2的,也就是说数据会正向复制的
如果说错了不要笑话我,小弟也是才看到第六章。如果没说错希望对那些有困惑的人有所帮助 | | |
|
|
|
|
[第9楼]
[ 回复时间:2009-05-14 20:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-05-13 22:27 |
assume cs:codesg
codesg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
dw 0,0,0,0,0
start:mov ax,cs 因为要填的是一个数,又不能填运算式,如cs+1c.所以就只好填cs了
mov ss,ax 用ax中转,让栈段与代码段相同起始地址相同
mov sp,1cH 栈地址范围cs:[10]-cs:[1a],栈空时sp指向cs:[1c]
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s:push [bx] 直接写[bx],段地址在ds中.即将ds:[bx]中的内容入栈
入栈后,sp=1a,ss不变
pop cs:[bx] 出栈后,sp=1c,ss不变cs:[bx]指向dw定义数的开始位置,当
bx=0,pop cs:[bx]相当于cs:[0]=cs:[1a]
bx=2,pop cs:[bx]相当于cs:[2]=cs:[1a]
bx=4,pop cs:[bx]相当于cs:[4]=cs:[1a]
bx=6,pop cs:[bx]相当于cs:[6]=cs:[1a]
bx=8,pop cs:[bx]相当于cs:[8]=cs:[1a]
bx=a,pop cs:[bx]相当于cs:[a]=cs:[1a]
bx=c,pop cs:[bx]相当于cs:[c]=cs:[1a]
bx=e,pop cs:[bx]相当于cs:[e]=cs:[1a]
以上可以看到,虽然定义了5个字的栈空间,但是实际上只用到了cs:1a这一个栈顶
即cs:1a,cs:1b这两个内存单元
add bx,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start | | |
|
|
|
|
[第10楼]
[ 回复时间:2009-06-20 20:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:31
信誉值:3
注册日期:2009-06-15 19:20 |
我的想法和3楼是一致的。
但我不知道3楼是否用debug试过sp除了1ah以外的值,比如你提到的18h,16h..
我试过,debug证明在题设第二段dw为5个字长的情况下,sp只能为1ah;其余值均无法完全复制0:0~f.
可惜我想不明白为什么。 | | |
|
|
|
|
[第11楼]
[ 回复时间:2009-07-04 08:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2009-02-10 14:31 |
mov sp,1cH ;会造成内存覆盖的大哥,长篇大论用得着吗。 | | |
|
|
|
|
[第12楼]
[ 回复时间:2009-07-04 15:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30 |
我的想法和3楼是一致的。
但我不知道3楼是否用debug试过sp除了1ah以外的值,比如你提到的18h,16h..
我试过,debug证明在题设第二段dw为5个字长的情况下,sp只能为1ah;其余值均无法完全复制0:0~f.
可惜我想不明白为什么。
------------------
回复:我也不明白 | | |
|
|
|
|
[第13楼]
[ 回复时间:2009-07-04 16:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30 |
哦!我明白了,和88页实验3一样,那里的ADD SP,4就不行,必须是6以上,当时找到的原因是堆栈还要保存的相关寄存器AX,BP,IP,CS寄存器以及标志寄存器中的内容,这里应该也是这样的 | | |
|
|
|
|
[第14楼]
[ 回复时间:2009-07-09 18:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-06-14 00:35 |
|
|
|
|
|
[第15楼]
[ 回复时间:2009-08-11 16:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-07-11 13:50 |
|
|
|
|
|
[第16楼]
[ 回复时间:2009-10-02 18:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:8
注册日期:2009-09-30 22:35 |
我的第二版的书上写的为 10个字单元用作栈空间
难道大家的书是第一版的,不懂。 | | |
|
|
|
|
[第17楼]
[ 回复时间:2009-10-02 18:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:8
注册日期:2009-09-30 22:35 |
程序开始0-15个单元存储数据,后来又开辟了5个字,占10个字节单元,所以从第16-25个单元就当作栈来使用,(栈空时)那么第26个单元就是栈顶了,26 = 0x1ah.所以如是。
------------------
回复:但是程序也定义了8个数据,也就是16个单元,这个也要算进去吧。 | | |
|
|
|
|
[第18楼]
[ 回复时间:2009-10-12 21:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2009-10-05 23:12 |
不考虑栈空间够不够,全部入栈再出栈顺序就倒了,入栈马上出栈感觉和直接放寄存器再传过去没啥区别,根本显不出栈的用处,感觉这题有点无聊 | | |
|
|
|
|
[第19楼]
[ 回复时间:2009-10-26 10:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2009-10-09 11:42 |
为什么要随便填啊 很明确的问题啊 栈的空间与你要修改的空间不在一起 | | |