. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  检测点6.1的第二小题 求救啊````达人飞过来 快来看  [待解决] 回复[ 19次 ]   点击[ 978次 ]  
xuan214
[帖 主]   [ 发表时间:2009-03-10 01:13 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-02-22 23:57
几乎本论坛的关于这个帖子都看了``但还是不明白呀``为什么第三空要填 pop cs:[bx] 为什么``不是说只要把数据压栈就行了吗``为什么还要出栈``不懂啊 都想了1个小时了``还有个问题 如果我那空不填 就生成不了obj文件`也就不能跟踪了啊`如果随便填 可能会出一些问题吧``啊 头好疼``
abob
[第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的具体操作步骤)
abob
[第2楼]   [ 回复时间:2009-03-10 09:49 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
如果我那空不填 就生成不了obj文件
-------------
不填这个空就不能通过编译生成obj文件吗?你实验过了吗?!

不要轻易的用脑袋下结论,先不说如果分析推理出正确的判断,也可以用电脑实际去做一下就确定了。
kingwrcy
[第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不应该是奇数。
mpop
[第4楼]   [ 回复时间:2009-04-17 14:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-10 01:10
这个程序我也看了很久 最后才知道我是对栈不理解 囧
lxk_ideal
[第5楼]   [ 回复时间:2009-04-30 16:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-22 18:44
大冒进要不得。
zhao129999
[第6楼]   [ 回复时间:2009-05-04 10:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-02 11:54
第二个空1a咋来的??? 谁能讲讲?????  后面的很好理解 他就是把128页的程序6.3简化了 S和S0都差不多 没必要分开写
jhchen002
[第7楼]   [ 回复时间:2009-05-04 20:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-04 20:45
程序开始0-15个单元存储数据,后来又开辟了5个字,占10个字节单元,所以从第16-25个单元就当作栈来使用,(栈空时)那么第26个单元就是栈顶了,26 = 0x1ah.所以如是。
xxdhj
[第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的,也就是说数据会正向复制的
如果说错了不要笑话我,小弟也是才看到第六章。如果没说错希望对那些有困惑的人有所帮助
hansonjan
[第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
tsembrace
[第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.
可惜我想不明白为什么。
liangdezhi
[第11楼]   [ 回复时间:2009-07-04 08:00 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-02-10 14:31
mov sp,1cH    ;会造成内存覆盖的大哥,长篇大论用得着吗。
wsay666
[第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.
可惜我想不明白为什么。
------------------
回复:我也不明白
wsay666
[第13楼]   [ 回复时间:2009-07-04 16:21 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:8
注册日期:2009-06-27 18:30
哦!我明白了,和88页实验3一样,那里的ADD SP,4就不行,必须是6以上,当时找到的原因是堆栈还要保存的相关寄存器AX,BP,IP,CS寄存器以及标志寄存器中的内容,这里应该也是这样的
sunhairuiqn
[第14楼]   [ 回复时间:2009-07-09 18:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-06-14 00:35
大家看好 题目说的是10个字单元用作栈空间!
lihaibo115
[第15楼]   [ 回复时间:2009-08-11 16:13 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-11 13:50
这个程序改写什么数据?
hdming88
[第16楼]   [ 回复时间:2009-10-02 18:13 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:8
注册日期:2009-09-30 22:35
我的第二版的书上写的为  10个字单元用作栈空间    
难道大家的书是第一版的,不懂。
hdming88
[第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个单元,这个也要算进去吧。
zhanqimj
[第18楼]   [ 回复时间:2009-10-12 21:38 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-10-05 23:12
不考虑栈空间够不够,全部入栈再出栈顺序就倒了,入栈马上出栈感觉和直接放寄存器再传过去没啥区别,根本显不出栈的用处,感觉这题有点无聊
auty95
[第19楼]   [ 回复时间:2009-10-26 10:04 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-10-09 11:42
为什么要随便填啊  很明确的问题啊  栈的空间与你要修改的空间不在一起
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved