王爽汇编语言综合研究-函数如何接收不定数量的参数

本文通过分析C语言程序和汇编代码,探讨了函数如何接收和处理不定数量的参数,特别是在汇编语言中。示例程序展示了如何将参数压栈并传递给子程序,以及函数如何通过参数数量来控制循环次数。同时,文章还讨论了printf函数处理参数的机制,并通过编写简易的print函数进一步解释了接收不定参数的原理。
摘要由CSDN通过智能技术生成

1、c语言如何传递参数

编写这样一个程序试验

void showchar(char a,int b);

main()
{
	showchar('a',2);
}

void showchar(char a,int b)
{
	*(char far *)(0xb8000000 + 160*10 + 80) = a;
	*(char far *)(0xb8000000 + 160*10 + 81) = b;
}
调试这个程序

                        ;进入main程序
141A:01FA 55            PUSH    BP        ;保存寄存器现场
141A:01FB 8BEC          MOV     BP,SP

141A:01FD B80200        MOV     AX,0002        ;将2个字节的2h入栈
141A:0200 50            PUSH    AX
141A:0201 B061          MOV     AL,61        ;将1个字节的'a'入栈
141A:0203 50            PUSH    AX
141A:0204 E80400        CALL    020B        ;调用子程序
141A:0207 59            POP     CX        ;释放局部变量的空间
141A:0208 59            POP     CX
141A:0209 5D            POP     BP        ;恢复寄存器现场
141A:020A C3            RET            ;main函数返回

                        ;进入子程序
141A:020B 55            PUSH    BP        ;保存寄存器现场
141A:020C 8BEC          MOV     BP,SP       
141A:020E 8A4604        MOV     AL,[BP+04]    ;读出字符'a'
141A:0211 BB00B8        MOV     BX,B800        ;写入到b800:0690h
141A:0214 8EC3          MOV     ES,BX
141A:0216 BB9006        MOV     BX,0690
141A:0219 26            ES:
141A:021A 8807          MOV     [BX],AL
141A:021C 8A4606        MOV     AL,[BP+06]    ;读出数据2h
141A:021F BB00B8        MOV     BX,B800        ;写入到b800:0691h
141A:0222 8EC3          MOV     ES,BX
141A:0224 BB9106        MOV     BX,0691
141A:0227 26            ES:
141A:0228 8807          MOV     [BX],AL
141A:022A 5D            POP     BP        ;恢复寄存器现场
141A:022B C3            RET            ;子程序返回
141A:022C C3            RET

容易分析,c中调用函数是通过栈来传递参数的,调用前将参数从右往左依次入栈。
参数在函数中是局部变量,这种方式和创建局部变量的方式类似,可以认为是在子程序调用前为子程序创建局部变量
所不同的是子程序里局部变量通过保存和恢复sp寄存器来释放局部变量空间,参数的局部变量必须通过调用完成后多次调用pop操作来释放栈空间
 
2、c语言如何传递不定数量的参数
通过上文的分析,c程序在调用函数前,首先对所有参数依次入栈,在调用后依次出栈。
在函数内部,如果知道了有多少个参数,可以根据sp+偏移量来找到参数所在的位置,完成参数的接收
那么如果是不定数量的参数呢,函数
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值