




已阅读5页,还剩50页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在C语言中,假设我们有这样的一个函数:int function(int a,int b)调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶)。用户可以在栈顶上方向栈中加入数据,这个操作被称为压栈(Push),压栈以后,栈顶自动变成新加入数据项的位置,栈顶指针也随之修改。用户也可以从堆栈中取走栈顶,称为弹出栈(pop),弹出栈后,栈顶下的一个元素变成栈顶,栈顶指针随之修改。函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。在参数传递中,有两个很重要的问题必须得到明确说明:当参数个数多于一个时,按照什么顺序把参数压入堆栈函数调用后,由谁来把堆栈恢复原装在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有:stdcallcdeclfastcallthiscallnaked callstdcall调用约定stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定就是stdcall.在Microsoft C+系列的C/C+编译器中,常常用PASCAL宏来声明这个调用约定,类似的宏还有WINAPI和CALLBACK.stdcall调用约定声明的语法为(以前文的那个函数为例):int _stdcall function(int a,int b)stdcall的调用约定意味着:1)参数从右向左压入堆栈,2)函数自身修改堆栈 3)函数名自动加前导的下划线,后面紧跟一个符号,其后紧跟着参数的尺寸以上述这个函数为例,参数b首先被压栈,然后是参数a,函数调用function(1,2)调用处翻译成汇编语言将变成:push 2 第二个参数入栈push 1 第一个参数入栈call function 调用参数,注意此时自动把cs:eip入栈而对于函数自身,则可以翻译为:push ebp 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复mov ebp,esp 保存堆栈指针mov eax,ebp + 8H 堆栈中ebp指向位置之前依次保存有ebp,cs:eip,a,b,ebp +8指向aadd eax,ebp + 0CH 堆栈中ebp + 12处保存了bmov esp,ebp 恢复esppop ebpret 8而在编译时,这个函数的名字被翻译成_function8注意不同编译器会插入自己的汇编代码以提供编译的通用性,但是大体代码如此。其中在函数开始处保留esp到ebp中,在函数结束恢复是编译器常用的方法。从函数调用看,2和1依次被push进堆栈,而在函数中又通过相对于ebp(即刚进函数时的堆栈指针)的偏移量存取参数。函数结束后,ret 8表示清理8个字节的堆栈,函数自己恢复了堆栈。cdecl调用约定cdecl调用约定又称为C调用约定,是C语言缺省的调用约定,它的定义语法是:int function (int a ,int b) /不加修饰就是C调用约定int _cdecl function(int a,int b)/明确指出C调用约定在写本文时,出乎我的意料,发现cdecl调用约定的参数压栈顺序是和stdcall是一样的,参数首先由有向左压入堆栈。所不同的是,函数本身不清理堆栈,调用者负责清理堆栈。由于这种变化,C调用约定允许函数的参数的个数是不固定的,这也是C语言的一大特色。对于前面的function函数,使用 cdecl后的汇编码变成:调用处push 1push 2call functionadd esp,8 注意:这里调用者在恢复堆栈被调用函数_function处push ebp 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复mov ebp,esp 保存堆栈指针mov eax,ebp + 8H 堆栈中ebp指向位置之前依次保存有ebp,cs:eip,a,b,ebp +8指向aadd eax,ebp + 0CH 堆栈中ebp + 12处保存了bmov esp,ebp 恢复esppop ebpret 注意,这里没有修改堆栈MSDN中说,该修饰自动在函数名前加前导的下划线,因此函数名在符号表中被记录为_function,但是我在编译时似乎没有看到这种变化。由于参数按照从右向左顺序压栈,因此最开始的参数在最接近栈顶的位置,因此当采用不定个数参数时,第一个参数在栈中的位置肯定能知道,只要不定的参数个数能够根据第一个后者后续的明确的参数确定下来,就可以使用不定参数,例如对于CRT中的sprintf函数,定义为:int sprintf(char* buffer,const char* format,)由于所有的不定参数都可以通过format确定,因此使用不定个数的参数是没有问题的。fastcallfastcall调用约定和stdcall类似,它意味着:函数的第一个和第二个DWORD参数(或者尺寸更小的)通过ecx和edx传递,其他参数通过从右向左的顺序压栈被调用函数清理堆栈函数名修改规则同stdcall其声明语法为:int fastcall function(int a,int b)thiscallthiscall是唯一一个不能明确指明的函数修饰,因为thiscall不是关键字。它是C+类成员函数缺省的调用约定。由于成员函数调用还有一个this指针,因此必须特殊处理,thiscall意味着:参数从右向左入栈如果参数个数确定,this指针通过ecx传递给被调用者;如果参数个数不确定,this指针在所有参数压栈后被压入堆栈。对参数个数不定的,调用者清理堆栈,否则函数自己清理堆栈。为了说明这个调用约定,定义如下类和使用代码:class Apublic:int function1(int a,int b);int function2(int a,.);int A:function1 (int a,int b)return a+b;#includeint A:function2(int a,.)va_list ap;va_start(ap,a);int i;int result = 0;for(i = 0 ; i a ; i +)result += va_arg(ap,int);return result;void callee()A a;a.function1 (1,2);a.function2(3,1,2,3);callee函数被翻译成汇编后就变成:/函数function1调用0401C1D push 200401C1F push 100401C21 lea ecx,ebp-800401C24 call function1 注意,这里this没有被入栈/函数function2调用00401C29 push 300401C2B push 200401C2D push 100401C2F push 300401C31 lea eax,ebp-8 这里引入this指针00401C34 push eax00401C35 call function200401C3A add esp,14h可见,对于参数个数固定情况下,它类似于stdcall,不定时则类似cdeclnaked call这是一个很少见的调用约定,一般程序设计者建议不要使用。编译器不会给这种函数增加初始化和清理代码,更特殊的是,你不能用return返回返回值,只能用插入汇编返回结果。这一般用于实模式驱动程序设计,假设定义一个求和的加法程序,可以定义为:_declspec(naked) int add(int a,int b)_asm mov eax,a_asm add eax,b_asm ret注意,这个函数没有显式的return返回值,返回通过修改eax寄存器实现,而且连退出函数的ret指令都必须显式插入。上面代码被翻译成汇编以后变成:mov eax,ebp+8add eax,ebp+12ret 8注意这个修饰是和_stdcall及cdecl结合使用的,前面是它和cdecl结合使用的代码,对于和stdcall结合的代码,则变成:_declspec(naked) int _stdcall function(int a,int b)_asm mov eax,a_asm add eax,b_asm ret 8 /注意后面的8至于这种函数被调用,则和普通的cdecl及stdcall调用函数一致。函数调用约定导致的常见问题如果定义的约定和使用的约定不一致,则将导致堆栈被破坏,导致严重问题,下面是两种常见的问题:函数原型声明和函数体定义不一致DLL导入函数时声明了不同的函数约定以后者为例,假设我们在dll种声明了一种函数为:typedef int (*WINAPI DLLFUNC)func(int a,int b);hLib = LoadLibrary(.);DLLFUNC func = (DLLFUNC)GetProcAddress(.)/这里修改了调用约定result = func(1,2);/导致错误由于调用者没有理解WINAPI的含义错误的增加了这个修饰,上述代码必然导致堆栈被破坏,MFC在编译时插入的checkesp函数将告诉你,堆栈被破坏了。 翻译句子练习练习11. 我妹妹擅长打篮球。My sister is fond of playing basketball.2. 汤姆坐下来,然后脱下他的湿鞋。Tom sat down and took off his wet shoes.3. 半小时以后,我们到达了山顶。Half an hour later we reached the top of the mountain.4. 玛丽每天7点30分上学。Mary goes to school at 7:30 every day.5. 我们的朋友遍天下。We have friends all over the world.6. 回家途中我遇到一位朋友。I met a friend of mine on my way home.7. 请递给我一片面包。Please pass me a piece of bread, please.8. 我可以用一下你的铅笔吗?当然可以!给你。Can I use your pencil?Certainly! Here you are.9. 从今以后我将设法做得更好些。I will try to do better from now on.10. 他发现王海已不在那里工作了。 He found that Wang Hai was no longer working there.11. 他们正在考虑买一辆新汽车。They are thinking of buying a new car.12. 罗伯特与很多新同学交了朋友。Robert has made friends with many of his new classmates.13. 琳达昨天买了一双新鞋。Linda bought a pair of shoes yesterday.14. 他1985年7月15日出生于上海。He was born in Shanghai on July 15, 1985.15. 她家很穷,她不能去上学。Her family is very poor. She couldnt go to school.16. 老人一天一天地等待着,但他的儿子再也没回来。The old man waited day after day, but his son never came back.17. 两天后,我发现他已经离开了这里。Two days later, I found that he had left here.18. 他们一直在笑。They were laughing all the time.19. 你睡觉前务必把所有的灯关掉。Make sure you turn off all the lights before you go to bed.20. 史密斯先生在中国居住了一辈子。Mr. Smith has lived in China all his life.21. 你愿意来吃晚饭吗?当然愿意。Would you like to come for supper?Sure! Id love to.22. 我们给您添了很多麻烦。哪里的话。Were giving you a lot of trouble.Not at all.23. 长城离这里很远。The Great Wall is far away from here.24. 他一遍又一遍地解释迟到的原因。He explained why he was late again and again.25. 你同意玛丽的意见吗?Do you agree with Mary?26. 李建国7岁就开始学英语。Li Jianguo began to learn English at the age of seven.27. 本周末他们要去参观历史博物馆。They are going to visit the History Museum this weekend.28. 因为多年无人居住,这间房子里的桌椅上都落满了灰尘。The tables and chairs are covered with dust because nobody has lived in this loom for many years.29. 他们学校的电脑和我们学校的不一样。The computers in their school are different from those in our school.30. 李华上周在家照顾奶奶没能到校上课,所以她必须努力学习以赶上其他同学。Li Hua looked after her grandmothers at home and didnt come to school last week, so she must study hard to catch up with other students31. 教师节那天,所有的老师和同学都盛装打扮。All the teachers and students were dressed up on Teachers Day.32. 即使别人明天都不去看这部电影,我也要去。Ill go to see the film tomorrow even though none of the others will go.33. 孩子们都飞快地向前跑,谁也不甘落后。All the children are running fast because nobody wants to fall behind.34. 我到处找我的书包也没找到。I had looked for my bag everywhere (here and there), but couldnt find it.35. 在学校的主楼前面有一个操场。Theres playground in front of the main building in our school.36. 你知道“鼠标”这个词用英语怎么说吗?Do you know how to say“鼠标”in English? 37. 同学遇到困难的时候,小梅总是乐于帮助他们。When her classmates are in trouble, Xiao Mei is always ready to help them.38. 尽管外面很吵闹,但她一直在房内读书,She kept on reading in her room though there was noise outside.39. 杰克跑回他的房间,到处找他的帽子。Jack ran back to his room to look for his hat.40. 玛丽没有和朋友们告别就离开了晚会。Mary didnt say goodbye to her friends and left the party.41. 司机在距离交通指示灯大约20米处开始减速。The driver began to slow down his car about 20 meters from the traffic lights.42. 格林先生每个月乘车要花费大约100美元。Mr. Green spends about 100 dollars on buses and taxies every month.43. 令我们惊奇的是她在100米赛跑中得了第一名。To our surprise, she won the first place in the 100-meter race.44. 他小时候住在农村,常常到河里去游泳。He used to go swimming in the river when he was a child living in the countryside.45. 我得首先完成作业,而不能先去踢球。I must first finish my homework instead of playing football.46. 站在你父亲旁边的那个人是谁?Who is the man standing next to your father?47. 我可以看一下那张照片吗?Can I have a look at that photo?48. 天黑了,我们停止工作吧,明天继续。Its getting dark now. Lets stop working, and well go on with it tomorrow.练习21. 不客气。/不用谢。2. 没关系。3. 该上学了。4. 你认为黑客帝国怎么样?5. 在西方国家,人们吃很多牛肉,我们也一样。6. 请问去北京图书馆怎么走?7. 你怎么了? 8. 需要帮忙吗?9. 这家旅馆是所有旅馆中最好的,10. 昨夜雨下得很大。11. 她太晚了,赶不上那班车。12. 英语和中文相比,我更喜欢英语。13. 物理没有英语有趣。14. 他买这条裤子花了50元。15. 我每天花半个小时读英语。16. 她入团已经两年了。17. 这个单词是什么意思?18. 我相信他说的话。19. 我不知道该买哪一件毛衣。20. 你们最好不要在墙上乱画。21. 快点,否则我们上课就要迟到了。22. 我和迈克都没有看过这本书。1. Youre welcome. Its a pleasure.2. Thats all right.Not at all.Never mind.It doesnt matter.3. Its time for school.Its time to go to school.4. What about the film MATRIX II ?How do you like the film MATRIX II?What do you think of the film MATRIX II?5. In western countries, people eat a lot of beef, so do we.In western countries, people eat a lot of beef, we also eat a lot of beef.In western countries, people eat a lot of beef, we eat a lot of beef, too.6. Excuse me, wheres Beijing Library?Excuse me, which is the way to Beijing Library?Excuse me, how can I get to Beijing Library?Excuse me, can you tell me the way to Beijing Library?7. Whats wrong with you?Whats the matter with you?Whats your trouble?8. What can I do for you?Can I help you?May I help you?9. This hotel is the best of all.This hotel is better than any other one.This hotel is better than the other hotels.10. It rained heavily last night.The rain was very: heavy last night.11. She was too late to catch the bus.She was so late that she couldnt catch the bus.12. I prefer English to Chinese.I like / enjoy English better than Chinese.13. Physics is not so / as interesting as English.English is more interesting than physics.Physics is less interesting than English.14. He paid fifty yuan for this pair of trousers.He spent fifty yuan on this pair of trousers.He spent fifty yuan (in) buying this pair of trousers.He bought this pair of trousers for fifty yuan.This pair of trousers cost him fifty yuan.15. It takes me half an hour to read English every day.I spend half an hour on English every day.I spend half an hour (in) reading English every day.16. She has been a League member for two years.She has been in the League for two years.She joined the League two years ago.Two years has passed since she became a League member.It has been two years since she joined the League.17. What does this word mean, please?What do you mean by this word, please?18. I believed his words.I believed what he said.19. I cant decide which sweater to buy.I cant decide which sweater I should buy.20. Youd better not draw on the wall.Dont draw on the wall, please.21. Hurry up, or well be late for class.If we dont hurry up, well be late for class.22. I havent read the book. Mike hasnt read the book either.Neither Mike nor I have read the book.练习31. 该吃晚饭了。2. 课桌上有两本书。3. 我有两个苹果。一个给你,另一个给李乎。4. 这两个城镇之间有一条河。5. 他们昨天晚上玩得很高兴。6. 那样对你的眼睛有害。7. 加强锻炼对你的身体有好处。8. 我叔叔上星期带我参观了那座工厂。9. 我昨天开会迟到了。10. 小明每天做作业花费两个小时的时间。11. 我想请他帮助我复习功课。12. 李华最喜欢英语。13. 昨天夜里11点他才回来。14. 小红和李丽都是团员。15. 去年他们花费很多钱买书。16. 该轮到张勇擦黑板了。17. 我一看见他就告诉他这件事。18. 我的钢笔不如他的好。19. 宋佳擅长英语。20. 完成这件工作花费了他两个星期的时间。21. 你最好下次不要迟到。22. 直到上午9点钟他才起床。23. 我每天花费10分钟做功课。24. 你最好马上卧床休息。25. 我们最好不要告诉他们这件事.26. 踢足球每天花费孩子们一个小时的时间。27. 她太生气了,以致说不出一句话。28. 他跑得那么快,我们都追不上他。29. 我认为他不是一个好学生。30. 孩子们!请随便吃些面包吧!31. 他停下来吃午饭。32. 这个孩子停止了哭喊。33. 吉姆太小,不能明白这件事。34. 我一看见他就想和他交朋友。35. 他昨天晚上完成工作后才回家。1. Its time for supper. / its time to have supper.2. There are two books on the desk.3. I have two apples. One is for you; the other is for Li Ping.4. There is a river between this town and that one.5. They enjoyed themselves yesterday evening. 6. Its bad for your eyes.7. Doing exercise is good for your health.8. My uncle showed me around the factory last week.9. I was late for the meeting yesterday.10. It takes Xiaoming two hours every day to do his homework.11. I want to ask him to help me with my lessons.12. Li Hua likes English best.13. He didnt come back until 11 oclock last night.14. Both Xiaohong and Li Li are League members.15. They spent much money on .books last year.16. Its Zhang Yongs turn to clean the blackboard.17. Ill tell him about it as soon as I see him.18. My pen isnt so good as his.19. Song Jia is good at English.20. It took him two weeks to finish the work.练习41. 托马斯爱迪生说过,他喜欢有思想的人。2. 我以前抽烟,但现在不抽了。3. 他们不知道要占哪儿。4. 这个想法似乎不错,但我们需要实际试验一下。5. 尽快读完这本书,以便你能开始读另一本。6. 我真不知道世界上有多少种动物。7. 假如他没作业,他将跟我们去颐和园。8. 当王先生到达电影院的时候,电影已经开始了。9. 医生建议我父亲戒烟、戒酒。10. 全世界的人都知道长城。11. 那些学生给这位年轻的教师很高的评价。12. 这棵圣诞树看上去很漂亮。13. 她讲英文和她姐姐一样好。14. 我们应该像雷锋一样乐于助人。15. 从这里乘船去上海要用24小时。16. 对他来讲单独做这件事不容易。 17. 既然你觉得身体不好,那么你最好不要去看电影了。18. 你能告诉我这次数学考试我是否及格了吗?19. 中国足球队输了这场比赛真遗憾。20. 越来越多的中国人对学习英语产生了兴趣。21. 你能告诉我怎样做模型飞机吗?22. 杰克在哪儿?他去美国了。23. 她不知道她妈妈为什么生她的气。24. 父亲阻止他的儿子玩火。25. 医生告诉我这药一天吃3次。26. 在张教授的帮助下,他们完成了这项工作o27. 我爸爸妈妈都不懂英文,所以他们决定学习英语。28. 这种布是用来做裙子的。29. 你最好不要放弃英语。30. 晚上吃这么多对你有害处。31. 他曾是一位历史老师,但现在是一位商人。32. 他妈妈为儿子而自豪。33. 他不仅是我们的老师,而且是我们的朋友。34. 我决心已定,无论什么也不会让我改变o35. 你读得越多学得越好。36. 这座桥真长,以至于坐车通过要用20分钟。37. 开会迟到是不礼貌的表现。38. 我们该去帮助王大爷打扫卫生了。39. 昨天的雨太大了,我们无法按时完成修路的工作。40. 学生们直到看见格林先生走进教室,才停止了交谈。41. 你已经连续工作8小时了,为什么不停下来休息一下呢?42. 妈妈昨天一到家就开始做饭,以便我能按时去上夜校。43. 我和杰夫无法游得像吉姆那样快。44. 上学期开学的时候,我们学校的贫困孩子都领到了新课本。45. 我父亲认为,年轻人没有老年人工作努力。46. 请你转告汤姆在任何情况下都不要害怕困难,好吗?47. 北京变得越来越美丽了,我们为此感到很骄傲。48. 不只是妈妈,还有我都喜欢在网上购物。49. 冬天北京人能吃到各种各样的新鲜蔬菜已不是什么新鲜事了。50. 不断学习,否则你就不能更多地了解这个世界。 学院留学知识竞赛考试时间及考场安排11月30日 (13:00-14:00):物理与机电工程学院、计算机科学学院物理与机电工程学院1.人最软弱的地方,是舍不得。- 舍不得一段不再精采的感情,舍不得一份虚荣,舍不得掌声。- 我们永远以为最好的日子是会很长很长的,不必那么快离开。- 就在我们心软和缺乏勇气的时候,最好的日子毫不留情地逝去了。2.这个世界上,总有一个人在某处等你。不在这里,不是此时,便会在那里,是彼时,等你。- 有一个可以想念的人你就是幸福的。3.我们再也回不去了 - 我们不可能再有一个童年;不可能再有一个初中;不可能再有一个初恋;不可能再有从前的快乐、幸福、悲伤、痛苦。- 昨天,前一秒,通通都不可能再回去。- 生命原来是一场无法回放的绝版电影!4.没有人有耐心听你讲完自己的故事,因为每个人都有自己的话要说;没有人喜欢听你抱怨生活,因为每个人都有自己的苦痛;世人多半寂寞,这世界愿意倾听,习惯沉默的人,难得几个。- 我再也不想对别人提起自己的过往,那些挣扎在梦魇中的寂寞,荒芜,还是交给时间,慢慢淡漠。- 几米5.再好的东西都有失去的一天,再深的记忆也有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年秋新北师大版数学一年级上册教学课件 第一单元 生活中的数 第7课时 快乐的午餐
- 水质实验室基础知识培训课件
- 新型储能项目安全生产方案
- 聚酰亚胺薄膜生产线项目运营管理手册
- 施工现场卫生管理方案
- 化工产业园危险化学品应急响应方案
- 一、机械能(第2课时) -苏科版九年级《物理》上册考点练习
- 影视艺术特性74课件
- 水电消防知识培训课件
- 2025版建筑工程设计与施工一体化论文集合同
- 锂离子电池正极材料研究进展
- 二手房屋买卖物品交接清单
- 技师论文 变频器的维修与保养
- 非标自动化设备项目进度表
- 诊断学教学胸部查体
- 桥梁安全事故案例警示
- YY/T 1095-2015肌电生物反馈仪
- SB/T 10460-2008商用电开水器
- GB/T 9124.1-2019钢制管法兰第1部分:PN系列
- GA 1800.2-2021电力系统治安反恐防范要求第2部分:火力发电企业
- 欣旺集团种禽养殖管理制度手册
评论
0/150
提交评论