![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
pk_20140716
缘起于BIOS,发展于内核,直至进程启动,电脑的世界开启了!
展开
-
语法树
int a,b,c,d;d=(a+b)*c原创 2019-12-03 13:20:15 · 201 阅读 · 0 评论 -
怎样高效写汇编代码
C语言中有变量的概念,而汇编里没有。变量指定了内存中占用的字节数,对它的读写可以通过其地址来引用 ,所以我们可以像C语言一样定义数据类型,并将变量名写入汇编代码中。之后在将变量名替换为地址。举例.section .rodata .LC0:.string "%d,%d\n".text.global mainmain: pushl %ebp movl %esp,%ebp sub...原创 2019-12-02 11:04:55 · 136 阅读 · 0 评论 -
从C语言到汇编(三)函数实现之局部变量
以sum函数为例int sum(int a,int b){ return a+b;}它的汇编代码.text.global sumsum: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax addl 12(%ebp),%eax leave ret然后是main函数int main(void){ int a; int b=...原创 2019-11-21 10:41:29 · 217 阅读 · 0 评论 -
从C语言到汇编(三)函数实现之参数传递和函数返回值
以sum函数为例int sum(int a,int b){ return a+b;}它的汇编代码.text.global sumsum: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax addl 12(%ebp),%eax leave ret然后是main函数int main(void){ int a; int b=...原创 2019-11-21 10:27:40 · 869 阅读 · 0 评论 -
从C语言到汇编(三)函数实现之栈帧
X86下C语言函数使用栈帧来实现传入参数和处理局部变量的。每个函数开始前都将执行pushl %ebpmovl %esp,%ebp结束时都将执行leaveret以sum函数为例int sum(int a,int b){ return a+b;}它的汇编代码.text.global sumsum: pushl %ebp movl %esp,%ebp movl ...原创 2019-11-21 09:57:41 · 151 阅读 · 0 评论 -
从C语言到汇编(三)循环语句
while语句是3种循环语句的一种。如果条件满足则不断执行。看代码。#include <stdio.h>int main(void){ int x=0; while(x*x<1000) { printf("%d\n",x*x); x++; } return 0;}看汇编代码。.section .rodata .LC0:.string "%d\n...原创 2019-11-20 13:33:45 · 221 阅读 · 0 评论 -
从C语言到汇编(三)if语句
if从最简单的if语句开始。#include <stdio.h>int main(void){ int a; scanf("%d",&a); if((a&1)==0) { printf("is even!"); } return 0;}最简单的if语句如上。我们将其转化为汇编。.section .rodata .LC0:.strin...原创 2019-11-20 12:46:49 · 760 阅读 · 0 评论 -
从C语言到汇编(二)输入输出函数
日常运行程序时,我们经常要用到输入输出函数。输入经常来自于键盘,输出经常用于屏幕。而C语言标准库提供了相应的函数scanf和printf。scanf函数和printf函数的函数原型是:int scanf(const char *format, ...);int printf(const char *format, ...);可以看出它们都是参数可变的函数。举个例子。#include ...原创 2019-11-19 16:56:55 · 392 阅读 · 0 评论 -
从C语言到汇编(二)类型装换
在C语言中,很多情况会进行隐式的算术类型转换。一般来说,如果二元运算符的两个操作数具有不同的类型,那么在进行运算之前先要把“较低”的类型提升为“较高”的类型。运算的结果为较高的类型。转换规则:首先,如果任何一个操作数为long double类型,则将另一个操作数转换为long double 类型。否则,如果任何一个操作数为double类型,则将另一个操作数转换为double类型。否则,如果任...原创 2019-11-16 10:47:07 · 191 阅读 · 0 评论 -
从C语言到汇编(二)表达式
C语言变量,常量,运算符组成表达式。在这里我写上几个重要的表达式以及其汇编代码。数字交换int main(void){ int a=1; int b=0; int tmp; tmp=a; a=b; b=tmp; return 0;}汇编代码.text.global mainmain: pushl %ebp movl %esp,%ebp subl $...原创 2019-11-15 17:30:02 · 120 阅读 · 0 评论 -
从C语言到汇编(二)++/--运算
相信C语言的使用者对++/–运算符不会陌生吧。又是前缀,又是后缀的++/–一定让你感到困惑吧!其实以前我也是这样的,不过在学习了汇编以后,我看了C语言生成的汇编代码,这才彻底的理解了++/–运算符。先从最简单的++运算符开始吧。int main(void){ int a=0; a++; ++a; return 0;}汇编代码.text.global mainmain...原创 2019-11-15 17:10:32 · 145 阅读 · 0 评论 -
从C语言到汇编(二)位运算
从C语言到汇编(二)算术运算存储程序式计算机以二进制来表示数据和指令。所以,我们可以对二进制位进行一些操作。这些操作包括了与(&),或(|),异或(^),取反(~),算术左移(<<),逻辑左移(<<),算术右移(>>),逻辑右移(>>)。与与运算01000101可以用与操作来屏蔽某些位。#i...原创 2019-11-14 16:41:04 · 255 阅读 · 0 评论 -
从C语言到汇编(二)算术运算
变量,常量,运算符可以构成表达式,表达式也可以构成语句。本文将详细介绍加(+),减(-),乘(*),除(/),取余(%)运算符。加#include <stdio.h>int main(void){ int a=10; int b=20; int c; c=a+b; printf("sum=%d\n",c); return 0;}sum=30c语言代码...原创 2019-11-14 11:45:03 · 209 阅读 · 1 评论 -
从C语言到汇编(一)变量
变量和常量是程序处理的两种基本数据对象。声明语句说明变量的名字及类型,也可以指定变量的初始值。变量占用了内存的一块区域,不同数据类型的变量占用的字节大小各不相同。类型字节大小char1short2int4long4char *4float4double8以上是C语言基本数据类型占用字节大小。在32位环境下。声明变量需...原创 2019-11-13 12:06:46 · 392 阅读 · 1 评论