-
“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
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
JavaScript判断两个数组相等的四类方法
js如何操作video标签
React实战--利用甘特图和看板,强化Paas平
【记录】正则替换的偏方
前端下载 Blob 类型整理
抽象语法树AST必知必会
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程