题二

protale 2001-09-30 04:53:31
C语言中很容易实现“变参”的问题,如printf()后的参数就不定,但在汇编中
实现“变参”却不容易,请提供一种思路,实现汇编的变参问题,仅实现printf
的汇编也可,通用的最好。
...全文
158 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
seeking 2001-10-01
  • 打赏
  • 举报
回复
哦,对。
protale 2001-10-01
  • 打赏
  • 举报
回复
写的很好,原先兄弟是想看是否有人能弄出来类似va_start, va_end等的函数,不过
看各位解答如此精辟,倒也不必吹毛求疵了。作为探讨,CNer也不必只写上good了了,
高分榜上既有你,必有由也!
Only_I 2001-09-30
  • 打赏
  • 举报
回复
up
CNer 2001-09-30
  • 打赏
  • 举报
回复
good。。。。
蚊子王 2001-09-30
  • 打赏
  • 举报
回复
to seeking(傲冷影):那可以通过象printf那种第一个参数是字符串的方法(就是我说的第二种),比如printf,是根据%后面的字符来确定类型的。
seeking 2001-09-30
  • 打赏
  • 举报
回复
变参?变化的不仅是参数的个数,还有参数的类型......
蚊子王 2001-09-30
  • 打赏
  • 举报
回复
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 start
vBin 2001-09-30
  • 打赏
  • 举报
回复
参数中加个计数器.

在输入参数时在最后再加上一个输入参数的个数.
protale 2001-09-30
  • 打赏
  • 举报
回复
同意基本看法,但总不能在第一个参数上声明有多少个参数,即便如此,编译如何通过...
蚊子王 2001-09-30
  • 打赏
  • 举报
回复
c/c++中能实现“变参”的前提是他的C调用机制。
C调用机制有两个特点:
1、参数由右到左依次压栈,这样第一个参数必定在最上面,所以无论有多少参数,第一个总能确定位置。
2、栈由调用者恢复,不管压入多少参数,函数都不管,一个RET完事(不象pascal来个RET XXXX),而调用者根据压入多少再给SP/ESP加上多少值来恢复栈。

用ASM实现“变参”只要也满足这两个特性就可以了,多少个参数由第一个参数加以控制(象printf)就可以了
JWhiteHorse 2001-09-30
  • 打赏
  • 举报
回复
up
protale 2001-09-30
  • 打赏
  • 举报
回复
若要灌水,请先答题...
若要关注,欢迎!
若要在本帖内另外提问,兄弟支持,并给分!

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧