-
“C语言” 读书札记(五)之[让我们一起学习汇编吧!(段)]
介绍
这几天满脑子都是寄存器,存储器——主要是卡在汇编语言上了,所以博文进度比较缓慢。
今天就先讲讲如何定义数据元素吧?因为汇编语言程序最重要的任务之一就是处理对象。
段
三个最常用的段:
1、数据段:数据段声明带有初始值的数据元素。这些数据元素用作汇编语言程序中的变量。
2、bbs段:bbs段声明使用零(或者null)值初始化的数据元素。这些数据元素常用做汇编语言程序中的缓冲区。
3、文本段:在可执行程序内声明指令码的地方。
1、定义段
GNU汇编器使用.section命令语句声明段。
语法:.section 类型(.data,.bss,.text)
以下是汇编语言程序的布局。
2、定义起始点
1)当汇编语言程序被转换为可执行文件时,链接器必须知道指令中的起始点是什么
GNU汇编器声明一个默认标签,或者说标识符,它应该用作应用程序的入口点。_start便签用于标明程序应该从这条指令开始运行。
2)除了应用程序中声明起始标签之外,还需要为外部应用程序提供入口点。这是使用.globl命令完成的。
了解上述信息就可以为所有汇编语言程序创建基础模板。如下:
有了这样的模板,就准备好了开始编写汇编语言程序。
3、创建简单程序
我们来演示上面那些组件如何组合在一起使用。
先写个简单的"hello,world“,很多语言不都这么搞吗?我也不免俗。——其他部分我会在后期的文章中说明。
1 .section .data 2 output: 3 .ascii "hello,world\n" 4 5 .section .text 6 .globl _start 7 _start: 8 movl $4, %eax 9 movl $1, %ebx 10 movl $output, %ecx 11 movl $13, %edx 12 int $0x80 13 14 #success exit 15 movl $1, %eax 16 movl $0, %ebx 17 int $0x80
汇编并且链接这个过程
数据段
1)数据段定义的数据元素都保留在内存中。
NOTE用.data数据段定义的任何数据元素可以按照读取和写入模式访问。用.rodata数据段定义的任何数据元素只能按照只读(read-only)模式访问。——因此使用ro前缀。
2)数据段定义数据元素需要用到两个语句:
一个标签:像C语言中变量名称,用作引用数据元素所使用的标记。——标签对处理器是没有意义的,它只是汇编器试图访问内存位置时用作引用指针的一个位置。(机器码中使用bit表示这个标记)
一个命令:定义数据元素保留多少个字节。
3)下表介绍为特定数据元素类型保留内存的不同命令。
4)我们来观察一下在内存中分布情况,为了表达更清楚,我再写一个例子。
内存分布图
观察
按照数据段中定义数据元素的顺序,每个数据元素被存放到内存中。带有多个值的元素按照命令中列出的顺序存放(如msg和length)。
静态符号
.equ命令用于把常量(呵呵,这个不用说,常量吗?在程序中是不能改动的,这也是它最大的特色)设置为可以在文本段(我们可以理解为指令段)中使用的符号。设置方法如下
NOTE.equ命令可以出现在数据段的任何位置,但是为了方便阅读,最好集中定义在最前或最后。
以上两种都是定义在数据段中,这也是在汇编中经常使用的方法。下面介绍另外一种段声明——bbs段。
bss段
bbs段只声明原始内存部分。
GNU汇编器使用两个命令声明缓冲区。
总结
我一直在想从哪个角度能输入剖析C语言,很多资料显示从汇编和机器语言角度去理解C语言,方能真正明白。我也看了很多资料,觉得应该从最最基础的方面进行。所以今天先谈到这里。——要知后事如何,下回分解。
这两天参考的资料
《汇编语言》——这书主要是针对windows 平台,语法使用的是intel语法。而我的平台,也是我的工作平台,习惯平台是linux,而linux采用的是“AT&T语法“。所以我也就看了前几章有关硬件方面的内容(但是也没看懂多少东西,呵呵)。
《汇编语言程序设计》——这书是我侧重点看的,直接跳到第二部分基础语言部分进行研究。
《Linux C编程一站式学习》——这书我着重看了几遍“x86汇编程序基础”。收益匪浅。
《深入理解计算机系统》——这书我也是轻微的看了一下,很多地方还是没有怎么弄懂。我还得多看几遍。
题外话
电子计算机的机器指令是一列二进制的数字,计算机将指令转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。CPU是计算机的核心部件,控制整个计算机的运作并进行运算。1、地址总线的宽度决定了CPU的寻址能力;2、数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量。3、控制总线的宽度决定了CPU对系统中其他器件的控制能力。单元换算:1B = 8b 1KB = 1024B 1MB = 1024KB 1GB = 1024MB
出 处:https://www.cnblogs.com/baochuan/archive/2012/06/28/2564489.html
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式