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,SP141A: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+偏移量来找到参数所在的位置,完成参数的接收
那么如果是不定数量的参数呢,函数