| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 576 人关注过本帖
标题:一道汇编题目。。。高手帮忙。先谢谢了!!!
只看楼主 加入收藏
lywhlao
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-6-16
结帖率:0
收藏
已结贴  问题点数:0 回复次数:2 
一道汇编题目。。。高手帮忙。先谢谢了!!!
试题给出了一个欠完整的X86汇编语言远过程,请基于此给定汇编语言程序,回答试题给出的各有关问题。
  说明:(1)程序功能:在字符串1(STR1)后追加字符串2(STR2);
  (2)参数规定:STR1和STR2的指针均为长指针,经过堆栈传入子程序;
  (3)设字符串均以0结尾,不考虑在STR1后是否留有足够的空间;
  (4)要求使用“结构”抽象子程序入口处堆栈栈顶的内容。
  问题:(1)给出相应结构类型的类型说明(2分)
  (2)补充完善子程序的代码。(6分)
  (3)以注释的形式给出子程序的详细设计与使用说明(2分)
  已有的子程序代码(含需要补充的内容的说明)如下:
  
  PARM STRUC ;说明“结构”类型(2分)
  BPREG DW ? ;对应BP寄存器保存单元
  RETADR DD ? ;对应返回地址
  ……
  ……  
  PARM ENDS
  
  ;过 程 名:STRCAT 给出子程序的详细设计与使用说明(2分)
  ;功 能:在STR1后追加STR2
  ;参 数:  
  ;返 回 值:
  ;说 明:(1)字符串均以0结尾
  ; (2)不考虑在STR1后是否留有足够的空间
  ;调用示例: ……
  ; ……
  ; CALL FAR PTR STRCAT
  
  STRCAT PROC FAR
  PUSH BP
  MOV BP, SP
  PUSH DS
  PUSH ES
  PUSH AX
  PUSH CX
  PUSH SI
  PUSH DI
  CLD
  MOV ES, ……… ( 2分)
  MOV DI, ………  
  PRG1:MOV AL, ES:[ DI ] ;确定STR1尾
  INC DI
  OR AL, AL
  JNZ PRG1
  DEC DI
  XCHG SI, DI
  MOV ES, [ BP ].STR2SEG ;测STR2的串长
  MOV DI, [ BP ].STR2OFF
  MOV CX, 0FFFFH
  REPNZ SCASB
  NOT CX
  XCHG SI, DI
  MOV DS, [ BP ].STR2SEG ;实现STR1和STR2拼接
  MOV SI, [ BP ].STR2OFF
  REP MOVSB
  ………… ;恢复寄存器(2分)
   
  RET ;平衡堆栈(2分)
  BCDTOB ENDP


我的问题有两个:1.RET后面应该加一个参数,加这个参数的目的是什么,为什么要加这个参数。
  2.程序的大概意思我看懂了。有些地方不是很明白。比如
  MOV ES, ……… ( 2分)
  MOV DI, ………  
  这里是不是确定第一个字符串的地址? ……… 应该填什么?
  另外:
  ES最后存储的是[ BP ].STR2SEG ,并不是第一个字符串的段地址,执行下面指令怎么会正确?希望大家帮帮忙。谢谢!
  MOV DS, [ BP ].STR2SEG ;实现STR1和STR2拼接
  MOV SI, [ BP ].STR2OFF
  REP MOVSB
搜索更多相关主题的帖子: 字符串 子程序 空间 
2011-06-16 21:30
samuelchen
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:73
专家分:179
注 册:2011-6-10
收藏
得分:10 
汇编忘得差不多了。
发点资料过来复习下,然后告诉你吧

--------------------------
多么美好的清晨。
2011-06-21 14:21
finalken
Rank: 2
等 级:论坛游民
威 望:1
帖 子:30
专家分:94
注 册:2007-10-2
收藏
得分:10 
1.RET后面应该加一个参数,加这个参数的目的是什么,为什么要加这个参数。
这个是清堆栈用的,函数通过堆栈传递了参数,所以返回的时候要清理堆栈。这个跟你使用的调用约定有关系。可以看下资料,这个数据必须是4的倍数。具体是多少,嘿嘿,留给你自己思考。跟你传的参数有关系。
你可以查一下STDCALL的调用约定。


2.程序的大概意思我看懂了。有些地方不是很明白。比如
  MOV ES, ……… ( 2分)
  MOV DI, ………  
  这里是不是确定第一个字符串的地址? ……… 应该填什么?

你下面都看懂了,这个怎么可能不会啊

另外:
  ES最后存储的是[ BP ].STR2SEG ,并不是第一个字符串的段地址,执行下面指令怎么会正确?希望大家帮帮忙。谢谢!
  MOV DS, [ BP ].STR2SEG ;实现STR1和STR2拼接
  MOV SI, [ BP ].STR2OFF
  REP MOVSB
这个我还真没看出来为什么。
2011-06-22 16:38
快速回复:一道汇编题目。。。高手帮忙。先谢谢了!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014657 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved