![](https://img-blog.csdnimg.cn/direct/126280ba96784c2aaf3f65cacca97bbb.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
《汇编的角度——C语言》
文章平均质量分 92
本书分为十六个章节,共计44个示例代码和180个实验。每个示例代码同时使用C语言、汇编语言两种语言实现,同时对照C语言的反汇编代码(编译器翻译的汇编代码)进行解析,再现了C语言代码编译后的汇编语句及其执行过程。对于C语言的执行过程眼见为实,一目了然。一言以蔽之,学习汇编语言是真正理解C语言的必经之路
bcdaren
这个作者很懒,什么都没留下…
展开
-
新书推荐:11.6 调用约定
函数调用约定。原创 2024-06-02 08:07:29 · 513 阅读 · 0 评论 -
11.3 指针和函数
传入的是指针,但操作的是指针指向的对象进行操作,比如代码中:int* height指向的对象是&n_XiaoMing,间接的对n_XiaoMin进行操作。上述代码中,我们使用的函数是scanf_s,这是scanf函数的安全形式,scanf_s函数只有当参数是字符串时,需要再增加一个存放字符串缓冲区长度的参数,防止缓冲区大小不足时发生溢出。scanf函数是为主调函数中定义的对象保存的值,假如它只接收到变量的值,是无法进行保存的,scanf函数接收的是指针(指向对象的地址),由该。*px = *py;原创 2024-06-01 07:31:14 · 818 阅读 · 0 评论 -
新书推荐:9.5堆栈图解析生命周期
每个函数都有生命周期,每个变量也有自己的生命周期,局部变量的生命周期,通过画堆栈图,我们可以很明确的看出每个变量的生命周期。每个函数都有他自己的生命周期,在实验八十中,main函数有自己的生命周期,funtion函数也有自己的生命周期。main函数的生命周期是程序结束,funtion函数的生命周期是执行到return i;程序中,if/else语句块分别设置了3个while语句死循环结构,由flag全局变量的条件语句控制,全局变量编译的时候就已经确定了内存地址和宽度,并且存在于整个程序的生命周期。原创 2024-05-31 07:33:53 · 796 阅读 · 0 评论 -
新书推荐:7.5 goto、break、continue语句
示例二十六代码分析汇编解析示例二十七代码分析汇编解析。原创 2024-05-29 07:20:18 · 890 阅读 · 0 评论 -
新书推荐:7.3 for语句
实验四十九中的代码将表达式2放置在循环语句块内,使用if语句判断条件,当i>10时,执行break语句,退出循环。条件表达式“i原创 2024-05-27 07:38:14 · 914 阅读 · 0 评论 -
新书推荐:7.1 do while语句
示例二十二代码分析汇编解析■do{语句块;}while(表达式)■●执行do循环体内的语句块;●判断while语句里的表达式,表达式为真继续下次循环,若为假则跳出循环;原创 2024-05-27 07:34:13 · 553 阅读 · 0 评论 -
新书推荐:5.1 逻辑运算符
示例十六代码分析汇编解析。原创 2024-05-22 06:55:42 · 1047 阅读 · 0 评论 -
新书推荐:6.1 if语句
计算机语言和人类语言类似,人类语言是为了解决人与人之间交流的问题,而计算机语言是为了解决程序员与计算机之间交流的问题。程序员编写的程序就是计算机的控制指令,控制计算机的运行。借助于编译工具,可以将各种不同的编程语言的源程序转换为计算机可以执行的机器语言。计算机程序是计算机的控制指令,控制计算机完成特定的功能。我们编写源程序的过程和建造房屋的过程类似,大致分为五个步骤。第一步:设计程序的架构,类似于房屋设计。先设计好图纸之后再进行下一步的建造工作。第二步:准备程序需要的数据,相当于建造房屋的原材料。原创 2024-05-24 07:03:10 · 1161 阅读 · 0 评论 -
新书推荐:6.2 else if语句
示例代码二十代码分析汇编解析■if(表达式1)statement1else if(表达式2)statement2else if(表达式3)statement3……elsestatementN解析:如果表达式1非0,则执行statement1,执行完退出语句;如果表达式2非0,则执行statement2,执行完退出语句;如果表达式3非0,则执行statement3,执行完退出语句;如果表达式4非0,则执行statement4,执行完退出语句;……原创 2024-05-24 07:10:50 · 1081 阅读 · 0 评论 -
新书推荐:4.4 关系运算符
printf函数输出的结果就是关系表达式的结果,用真和假来表示。由于变量i和变量j为int类型的有符号整数,对应的汇编数据类型为sdword,因此只能使用有符号数JCC指令:jg(大于)、jge(大于等于)、jl(小于)、jle(小于等于)、jz(等于)、jnz(不等于)。使用了jle指令,而汇编代码中使用的是jg指令,其实二者的逻辑是相同的,并不影响结果的判断。关系表达式的结果保存在eax寄存器中,作为printf函数的参数输出。原创 2024-05-22 06:52:19 · 819 阅读 · 0 评论 -
新书推荐:4.2 赋值运算符
赋值与相等运算符错误赋值运算符是单等号“=”,但是与数学中的“=”号不是一个意思,在C语言中表示赋值的意思。运算顺序是从右往左赋值。我们看这一行代码:int i = 2;//将常量值2存储到int 类型变量i地址处,而不是i等于2。原创 2024-05-21 07:25:17 · 259 阅读 · 0 评论 -
新书推荐:4.3 算术运算符
源代码中使用sdword ptr指定变量i为有符号32位正数更准确,反汇编代码中使用dword ptr表示变量i为32位整数,如果变量i是正整数肯定不会影响结果的正确性。idiv指令是有符号数除法指令,进行除法运算之前,使用cdq指令先将32位被除数eax扩展为64位edx:eax(eax的符号位扩展到edx),然后除以保存在ebx寄存器中的除数,商保存在eax中,余数(模)保存在寄存器edx中。赋值给j之后,i--相当于,i = i - 1;//先计算括号内的表达式,1-1=0,结果为假(0),输出3。原创 2024-05-21 07:24:11 · 734 阅读 · 0 评论 -
新书推荐:4.1 运算符与表达式
运算符表达式优先级。原创 2024-05-19 08:01:43 · 982 阅读 · 0 评论 -
新书推荐:3.7 数据类型转换
数据类型转换的目的是通用数据类型,该数据类型亦是转换结果的数据类型。将整数类数据类型的值转换为浮点型时,如果数据类型转换后的结果在数值范围内不能正确表示,那么会根据编译器定义的方法取大于或小于原值的最接近的近似值作为转换结果。将整数类数据类型转换为位数更少的有符号整数时,以及将无符号整数转换为位数相同的有符号整数时,如果不能正确表示转换后的值,则此时的操作由编译器而定。将整数类数据类型转换为位数更少的无符号整数时,除以比位数较少的数据类型可表示的最大符号数大1的数,所得的非负余数就是转换后的值。原创 2024-05-19 07:59:25 · 1066 阅读 · 0 评论 -
新书推荐:3.6 enum枚举类型
示例十一代码分析汇编解析。原创 2024-05-17 07:37:57 · 761 阅读 · 0 评论 -
新书推荐:3.5 char类型
char类型是比较古怪的,int\short\long类型如果在使用时不指定signed还是unsigned时都默认是signed,但char不一样,编译器可以实现为带符号的,也可以实现不带符号的。翻译为汇编语句为:mov byte ptr [c],1,这里使用的是临时强制指定数据宽度为byte类型。翻译为汇编语句为:mov byte ptr [c], 0FFh,编译器将-1转换为补码形式存储。在MASM汇编器中,sbyte类型为8位有符号整型,等同于C语言中的char类型,取值范围为-128~127。原创 2024-05-17 07:35:45 · 886 阅读 · 0 评论 -
新书推荐:3.4 浮点型
很多实数,如1/10(0.1)或1/100(0.01),不能用有限个二进制数字位表示,这样的分数只能近似表示为若干以2的幂为分母的分数之和。第一个足够大的余数时10000,在除以1010之后,余数时110,在末尾添加一个0,新的被除数是1100,除以1010后,余数是10,……这是因为单精度浮点数的指数必须以8位无符号整数格式存储,不可以是负数或0,因此指数部分存储时的取值范围必须是1~254之间,单精度浮点数指数的实际值可以是-126~127之间,与127相加后的取值范围刚好是1~254之间。原创 2024-05-15 07:47:44 · 840 阅读 · 0 评论 -
新书推荐:3.3 整型
还有一点就是正数是以它自身形式存储的,而负数是以补码的形式存储的,参见《X86汇编基础教程》预备知识,此处不再赘述,直接写出-1原码、反码、补码。在很多情况下,程序员处于习惯的原因,使用有符号整数数据类型显示无符号整数,但是建议采用规范的编码格式,避免不必要的错误。变量i为unsigned int无符号整数类型,存储时编译器将-1转换为补码然后存储到内存中,无符号整数将32位全部看作是数值位,因此按照无符号整数格式输出的0xffffffff的十进制数为4294967295。因为C语言默认就是有符号类型的。原创 2024-05-15 07:34:05 · 622 阅读 · 0 评论 -
新书推荐:3.1 数据类型的知识
示例六源代码代码分析汇编解析。原创 2024-05-13 07:13:51 · 792 阅读 · 0 评论 -
新书推荐:2.4 输入和显示
表示在变量j的存续期间,不可以修改变量j的值,把变量j当作是常量看待,其实并没有改变变量j的真实属性,即变量j并不会因此而变成一个常量,不会改变变量j的存储区。程序员在无意中修改了本来不该被修改的变量的值,特别是对全局变量的无意修改。在C语言中,没有办法通过指令来区分取变量地址还是取值,因此变量名表示该地址处存储的值,变量名前添加地址符&表示变量地址,地址前添加*号(解引用运算符)表示取该地址处的值。全局变量是相对于全局区内的偏移地址,局部变量是相对于栈区的偏移地址,常量字符串是相对于常量区的偏移地址。原创 2024-05-13 07:12:15 · 691 阅读 · 0 评论 -
新书推荐:2.3 常量
示例四源代码代码分析汇编解析。原创 2024-05-11 08:54:11 · 621 阅读 · 0 评论 -
新书推荐:2.2 变量
不确定值:因为计算机存储介质并不是空白的,相反存放了很多以前运行的无用数据,当我们生成变量时,系统会分配内存空间,而分配的内存空间是之前遗留下来无用的数据的空间,有可能未被初始化为0。0xcc:因为在main函数内声明的变量a和b是局部变量,其内存空间在堆栈内分配,在main函数初始化时,编译器自动给堆栈空间内分配了0D8H个字节的局部变量空间,并且将其全部初始化为0xcc(36h个0CCCCCCCCh)。中的等号“=”表示把右边的常量值1赋给左边的变量a,可以通过“=”来改变变量的值。原创 2024-05-11 08:46:40 · 752 阅读 · 0 评论 -
新书推荐:2.1 显示计算结果
push两个实参入栈,每个实参占用4个字节,一共占用8个字节,执行call指令时,压入32位返回地址,执行ret指令时,将返回地址pop到指令指针寄存器eip中。第二个实参为一个整数算术表达式“11+22”,由编译器计算出结果,并替换第一个参数中的“%d”。上述代码先计算11+22的和,保存在累加器eax中,然后压入堆栈传参,接着将格式化常量字符串的偏移地址入栈,最后call指令调用printf函数。2、请读者分析2-1-4.c、2-1-5.c、2-1-6.c、2-1-7.c的反汇编代码。原创 2024-05-10 08:09:55 · 638 阅读 · 0 评论 -
新书推荐:1.3 第一个程序HelloWorld
本节必须掌握的知识点: 示例一源代码 编译、执行和注释 代码分析原创 2024-05-09 07:44:23 · 755 阅读 · 1 评论 -
【新书推荐】3.4 浮点型
本节必须掌握的知识点: 示例九 代码分析 汇编解析 浮点数的输出精度 【补充内容】原创 2024-01-25 16:39:03 · 963 阅读 · 0 评论 -
【新书推荐】3.3 整型
本书分为十六个章节,共计44个示例代码和180个实验。每个示例代码同时使用C语言、汇编语言两种语言实现,同时对照C语言的反汇编代码(编译器翻译的汇编代码)进行解析,再现了C语言代码编译后的汇编语句及其执行过程。对于C语言的执行过程眼见为实,一目了然。 汇编语言可以让我们清晰的理解C语言是如何从汇编语言演化而来的。C语言是对汇编语言的进一步简化,C语言的语法更趋向于人类语言。借助于C语言编译器将C语言自动翻译为汇编语言。与此同理,借助于越来越强大和智能的编译工具,我们又发明了众多更趋向于人类语言的其他高级语原创 2024-01-24 17:02:45 · 746 阅读 · 0 评论 -
【新书推荐】3.2 数据类型的分类
本节必须掌握的知识点: 基本数据类型 定义变量数据类型 示例七 代码分析 汇编解析原创 2024-01-23 16:51:29 · 1130 阅读 · 0 评论 -
【新书推荐】3.1 数据类型的知识
本节必须掌握的知识点: 示例六源代码 代码分析 汇编解析原创 2024-01-22 18:13:55 · 871 阅读 · 0 评论 -
【新书推荐】2.4 输入和显示
本节必须掌握的知识点: 示例五源代码 代码分析 汇编解析原创 2024-01-21 17:10:03 · 859 阅读 · 0 评论 -
【新书推荐】2.3 常量
本节必须掌握的知识点: 示例四源代码 代码分析 汇编解析原创 2024-01-20 17:33:34 · 775 阅读 · 0 评论 -
【新书推荐】2.2 变量
本节必须掌握的知识点: 示例三源代码 代码分析 汇编解析原创 2024-01-19 16:47:57 · 875 阅读 · 0 评论 -
【新书推荐】2.1 显示计算结果
本节必须掌握的知识点: 示例二源代码 代码分析 汇编解析原创 2024-01-18 16:40:10 · 917 阅读 · 0 评论 -
【新书推荐】1.3 第一个程序HelloWorld
1.3 第一个程序HelloWorld本节必须掌握的知识点: 示例一源代码 编译、执行和注释 代码分析原创 2024-01-17 08:23:38 · 900 阅读 · 0 评论 -
【新书推荐】1.1 VS开发工具
C语言开发环境原创 2024-01-16 17:34:57 · 835 阅读 · 0 评论