CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  其他开发语言 >  汇编语言

题二

楼主protale()2001-09-30 16:53:31 在 其他开发语言 / 汇编语言 提问

C语言中很容易实现“变参”的问题,如printf()后的参数就不定,但在汇编中  
  实现“变参”却不容易,请提供一种思路,实现汇编的变参问题,仅实现printf  
  的汇编也可,通用的最好。 问题点数:100、回复次数:14Top

1 楼protale()回复于 2001-09-30 17:01:51 得分 0

若要灌水,请先答题...  
  若要关注,欢迎!  
  若要在本帖内另外提问,兄弟支持,并给分!Top

2 楼JWhiteHorse()回复于 2001-09-30 17:08:46 得分 10

upTop

3 楼cui(蚊子王)回复于 2001-09-30 17:14:56 得分 55

c/c++中能实现“变参”的前提是他的C调用机制。  
  C调用机制有两个特点:  
        1、参数由右到左依次压栈,这样第一个参数必定在最上面,所以无论有多少参数,第一个总能确定位置。  
        2、栈由调用者恢复,不管压入多少参数,函数都不管,一个RET完事(不象pascal来个RET   XXXX),而调用者根据压入多少再给SP/ESP加上多少值来恢复栈。  
   
  用ASM实现“变参”只要也满足这两个特性就可以了,多少个参数由第一个参数加以控制(象printf)就可以了Top

4 楼protale()回复于 2001-09-30 17:34:36 得分 0

同意基本看法,但总不能在第一个参数上声明有多少个参数,即便如此,编译如何通过...Top

5 楼vBin(彬)回复于 2001-09-30 18:13:51 得分 20

参数中加个计数器.  
   
  在输入参数时在最后再加上一个输入参数的个数.Top

6 楼cui(蚊子王)回复于 2001-09-30 20:09:54 得分 0

to   protale():第一个参数指明后面有几个参数是一种办法;象printf第一个参数是字符串指针,由这个字符串中有几个‘%’号决定后面还有几个参数,这也是一种办法;再一种办法是用一个特别的数字作为最后个参数的标记(比如0),则可以从第一个参数开始处理,当出现参数为标记时结束。  
  “即便如此,编译如何通过...   ”,什么意思,怎么会通不过的?  
  我就写一个第一种办法的例子(16bit),把他编译成COM文件用调试器调试看看(我没有输出结果):  
   
  .286  
  .model   tiny  
   
  .code  
   
  org   100h  
  start:  
          push   4  
          push   3  
          push   2  
          push   1  
          push   4               ;这个记数  
          call   add  
          add     sp,0ah     ;恢复栈,因为压入5个参数,所以加10  
          ;  
          mov     ax,4c00h  
          int     21h  
   
  add   proc   near     ;返回值在ax  
          push   bp  
          mov     bp,sp  
          push   si  
          ;  
          mov     si,04h  
          mov     cx,[bp+si]   ;第一个参数作为后面还有几个参数的记数  
          xor     ax,ax  
          jcxz   @add_end  
  @add_loop:  
          inc     si  
          inc     si  
          add     ax,[bp+si]  
          loop   @add_loop  
  @add_end:      
          ;  
          pop     si  
          pop     bp  
          ret  
  add   endp  
   
          end   startTop

7 楼seeking(Please wait ...)回复于 2001-09-30 20:11:01 得分 10

变参?变化的不仅是参数的个数,还有参数的类型......Top

8 楼cui(蚊子王)回复于 2001-09-30 20:16:18 得分 0

to   seeking(傲冷影):那可以通过象printf那种第一个参数是字符串的方法(就是我说的第二种),比如printf,是根据%后面的字符来确定类型的。Top

9 楼CNer(Leemaasn)回复于 2001-09-30 21:30:10 得分 5

good。。。。Top

10 楼Only_I(我)回复于 2001-09-30 22:09:43 得分 0

upTop

11 楼seeking(Please wait ...)回复于 2001-10-01 07:41:55 得分 0

哦,对。Top

12 楼protale()回复于 2001-10-01 18:42:49 得分 0

写的很好,原先兄弟是想看是否有人能弄出来类似va_start,   va_end等的函数,不过  
  看各位解答如此精辟,倒也不必吹毛求疵了。作为探讨,CNer也不必只写上good了了,  
  高分榜上既有你,必有由也!Top

相关问题

  • 二个问题
  • 二问题 ~
  • 二个问题
  • 二个问题
  • 无题(二)
  • 二级问题
  • 问题二
  • 问题二则。
  • 二个问题,急!
  • ADO问题之二

关键词

  • 汇编
  • 编译
  • 参数
  • 变参
  • 调用
  • 字符串
  • si
  • bp
  • 实现
  • ax

得分解答快速导航

  • 帖主:protale
  • JWhiteHorse
  • cui
  • vBin
  • seeking
  • CNer

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo