C语言语句执行。

请问在这个程序中
#include <stdio.h>
#include <errno.h>
#include <io.h>
#include <fcntl.h>
#include <string.h>

#define FILENAME "test.bin"
#define MAX_STRING_LENGTH 3

int WriteData(int fh, void *buf, int len);
struct data
{
int i;
float f;
char string[MAX_STRING_LENGTH+1];
char end[4];
};
int main()
{
struct data block;
int fh, rtn;

memset(&block, 0, sizeof(block));
block.i = 100;
block.f = 100.0;
strcpy(block.string, "100");
strcpy(block.end ,"END");

fh = open(FILENAME, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,0666);
if(fh == -1)
{
perror(FILENAME);
return;
}
rtn = WriteData(fh, &block, sizeof(block));
if(rtn < 0)
{
perror(FILENAME);
return;
}
close(fh);
system("pause");
return 0;
}
int WriteData(int fh, void *buf, int len)
{
int written = 0;
int val;
while( written < len )
{
val = write(fh, ((char*)buf)+written, len-written);
if(val == -1)
{
return val;
}
written += val;
}
return written;
}
请问这句语句:val = write(fh, ((char*)buf)+written, len-written);是怎么执行的?

定的关系,不同的编译器参数的入栈的顺序不同
一般的编译器是从右到左
如fun(a,b)这个函数调用,是先计算参数b,入栈,再计算参数a,入栈

printf("%d %d", a++,++a); //先计算++a,先自增,a的值变为2,将2入栈 再来计算a++,将a的值2入栈,再使a自增,a的值变为3
printf(" %d\n",a); //a的值已经变为3了

printf(%d %d", ++a.a++);//先计算a++,将a的值1入栈,再使a自增,a的值变为2,再来计算++a,先自增,a的值为3,将3入栈,输出3 1
printf(" %d\n",a); //输出3

三种调用约定:
__stdcall调用约定。两者实质上是一致的,即函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部分(关于函数名的修饰部分在后面将详细说明)。
C调用约定(即用__cdecl关键字说明)和__stdcall调用约定有所不同,虽然参数传送方面是一样的,但对于传送参数的内存栈却是由调用者来维护的(也正因为如此,实现可变参数的函数只能使用该调用约定),另外,在函数名修饰约定方面也有所不同。
__fastcall调用约定是“人”如其名,它的主要特点就是快,因为它是通过寄存器来传送参数的(实际上,它用CX和EDX传送前两个双字或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈),在函数名修饰约定方面,它和前两者均不同。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-16
这个是标准的 文件写库函数呢, 一般调用的是操作系统的 相关 中断调用 来写文件了追问

能不能说得详细点啊?

追答

再详细 就是 bios 的文件中断调用了,比如 入口,ax 寄存器放 什么,bx 放什么, int13
中断, 汇编语言的 语法
具体的可以查看一些关于中断调用的文献资料了

追问

好深奥。我只是想解释那句语句。怎撤到硬件上了呢?

追答

没有,这个还在软件范畴,不过就是底层的调用了

本回答被提问者和网友采纳
相似回答