“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.ascii .section .text 6 .globl _startmovl $4, %eax 9movl $1, %ebx10 movl $output, %ecx11movl $13, %edx12int $0x8013 14 #success exit15movl $1, %eax16movl $0, %ebx17int $0x80

汇编并且链接这个过程

数据段

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

NOTE

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

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

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

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

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

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

  

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

内存分布图

观察

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

静态符号

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

  

NOTE

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

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

bss段

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

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

总结

造物之前,必先造人。

“C语言” 读书札记(五)之[让我们一起学习汇编吧!(段)]

相关文章:

你感兴趣的文章:

标签云: