c语言学习资料:流程控制、函数、调用约定、外部符号
流程控制。
我们学程序有三种结构,顺序选择循环,不是只有C才有这样的结构,编译原理课上讲正则表达式等价于正则文法等价于有穷自动机。顺序结构相当于正则表达式的自然连接,选择结构就是正则表达式的选择符号,循环结构就是闭包或者说克林星号(*)。严格的汇编用分支语句老老实实控制流程,而宏汇编家用.if .while来实现,好吧,即便不是模仿C,也算是模仿某种类Pascal语言好了。而且因为.if后面是表达式,宏汇编又不得不引入简单的表达式机制,从这点上来讲,C确实很像宏汇编家用的那种语言。

关于任意地址跳转的那种能力,我会在稍后来讨论,现在我们知道这个放在C里面是有用的,在现在版本的GNU C里面至少我们可以void *a[4]={&&label1, &&label2, &&label3, 0x12343210}; goto *a[N];
函数,调用约定,外部符号
我个人而言不喜欢MASM的.invoke伪指令,习惯于直接push或者mov参数然后call,
然后看看情况调整栈帧指针。别忘了严格的汇编其实是不需要非要用栈传参的------可以只用寄存器,事实上,只要你愿意,C也是可以用寄存器传参数的。这意味着C可以调用non-trivial或者说一般的汇编程序的代码,但是汇编程序为了在POSIX和Ansi C的系统下重复使用,却不得不遵守C的调用约定以及字符串惯例( (unsigned char)0或者(unsigned short)0或者其他这样的)结尾。C和用汇编代码写成的程序,形成机器码以后,生成的外部符号从这个角度讲并没有多少不一致的地方,从某种意义上讲,你调用的对象,传参像C的风格,返回值像C的风格,寄存器维护惯例像C的风格,为什么一定要认为他是汇编的而不能是C的呢?
本文来源 我爱IT技术网 http://www.52ij.com/jishu/1059.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
