题二
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




