c语言多个源文件一起汇编,“C语言” 读书札记之[让我们一起学汇编]

介绍

这几天满脑子都是寄存器,存储器——主要是卡在汇编语言上了,所以博文进度比较缓慢。

今天就先讲讲如何定义数据元素吧?因为汇编语言程序最重要的任务之一就是处理对象。

d304a3d862d062a4bc231eec801072ec.png

三个最常用的段:

1、数据段:数据段声明带有初始值的数据元素。这些数据元素用作汇编语言程序中的变量。

2、bbs段:bbs段声明使用零(或者null)值初始化的数据元素。这些数据元素常用做汇编语言程序中的缓冲区。

3、文本段:在可执行程序内声明指令码的地方。

1、定义段

GNU汇编器使用.section命令语句声明段。语法:.section 类型(.data,.bss,.text)

以下是汇编语言程序的布局。

728968843374c685a083abcc496508d7.png

2、定义起始点

1)当汇编语言程序被转换为可执行文件时,链接器必须知道指令中的起始点是什么

GNU汇编器声明一个默认标签,或者说标识符,它应该用作应用程序的入口点。_start便签用于标明程序应该从这条指令开始运行。

2)除了应用程序中声明起始标签之外,还需要为外部应用程序提供入口点。这是使用.globl命令完成的。

了解上述信息就可以为所有汇编语言程序创建基础模板。如下:

561317f041ee01c6becb1720bdaa4acc.png

有了这样的模板,就准备好了开始编写汇编语言程序。

3、创建简单程序

我们来演示上面那些组件如何组合在一起使用。

先写个简单的"hello,world“,很多语言不都这么搞吗?我也不免俗。——其他部分我会在后期的文章中说明。

.section .data

output:

.ascii"hello,world\n"

.section .text

.globl _start

_start:

movl $4, %eax

movl $1, %ebx

movl $output, %ecx

movl $13, %edx

int$0x80

#success exit

movl $1, %eax

movl $0, %ebx

int$0x80

3107968702c0b49c884da7fb7c04ffeb.png汇编并且链接这个过程

734380bff89e2e066aa19ce2e58512dd.png

95fff30b0c444042de0c1c16c7daf479.png

数据段

1)数据段定义的数据元素都保留在内存中。

NOTE

用.data数据段定义的任何数据元素可以按照读取和写入模式访问。

用.rodata数据段定义的任何数据元素只能按照只读(read-only)模式访问。——因此使用ro前缀。

2)数据段定义数据元素需要用到两个语句:

一个标签:像C语言中变量名称,用作引用数据元素所使用的标记。——标签对处理器是没有意义的,它只是汇编器试图访问内存位置时用作引用指针的一个位置。(机器码中使用bit表示这个标记)

一个命令:定义数据元素保留多少个字节。

81a1778bcb94010000e82e8536b3ba71.png

3)下表介绍为特定数据元素类型保留内存的不同命令。

178e4cd95e4282b289e4c0468e3cd622.png

4)我们来观察一下在内存中分布情况,为了表达更清楚,我再写一个例子。

c446e5d9c530520c812918a9932f3509.png

3107968702c0b49c884da7fb7c04ffeb.png内存分布图

8dc48ae6b7df82814d1bcc2aaa164ee0.png

观察

按照数据段中定义数据元素的顺序,每个数据元素被存放到内存中。带有多个值的元素按照命令中列出的顺序存放(如msg和length)

12752d42aee7572c600b156fa7a56169.png

静态符号

.equ命令用于把常量(呵呵,这个不用说,常量吗?在程序中是不能改动的,这也是它最大的特色)设置为可以在文本段(我们可以理解为指令段)中使用的符号。设置方法如下

3f0d5da4f142574c9dd910fb137acf11.png

NOTE .equ命令可以出现在数据段的任何位置,但是为了方便阅读,最好集中定义在最前或最后。

以上两种都是定义在数据段中,这也是在汇编中经常使用的方法。下面介绍另外一种段声明——bbs段。

bss段

bbs段只声明原始内存部分。

GNU汇编器使用两个命令声明缓冲区。

b776d5074e53c11087e6bcb9c498db37.png

c1519106eb9b8f115cee7400a057d2a1.png

1945a3b516d77618e8255e089321f12c.png

46830813bbe933a51b84bfd2a9f6b67e.png

总结

我一直在想从哪个角度能输入剖析C语言,很多资料显示从汇编和机器语言角度去理解C语言,方能真正明白。我也看了很多资料,觉得应该从最最基础的方面进行。所以今天先谈到这里。——要知后事如何,下回分解。

这两天参考的资料

《汇编语言》——这书主要是针对windows 平台,语法使用的是intel语法。而我的平台,也是我的工作平台,习惯平台是linux,而linux采用的是“AT&T语法“。所以我也就看了前几章有关硬件方面的内容(但是也没看懂多少东西,呵呵)。

《汇编语言程序设计》——这书是我侧重点看的,直接跳到第二部分基础语言部分进行研究。

《Linux C编程一站式学习》——这书我着重看了几遍“x86汇编程序基础”。收益匪浅。

《深入理解计算机系统》——这书我也是轻微的看了一下,很多地方还是没有怎么弄懂。我还得多看几遍。

【编辑推荐】

【责任编辑:张伟 TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值