汇编语言学习(二)

来源:互联网 发布:在线c语言编译 编辑:程序博客网 时间:2024/05/18 00:14

一  简单的程序范例

     我认为学习一门最快的方式,就是不断的去使用。在使用的过程中你会逐渐加深理解,掌握精髓。如果仅仅的是在书本文字层面,你了解到的只能是字面知识。

     正如前面介绍的一样,汇编语言由定义好的段构成,每个段都有不同的目的。三个最常用的段: 数据段,bss段,文本段。 所有的汇编语言程序都必须有文本段,这是放代码的地方。数据段声明带有初始值的数据元素,有点像c中的变量。bss段声明使用零值初始化的数据元素。

    GNU汇编器使用.section命令语句声明段。.section只使用一个参数--它声明的段类型。_start标签用于表明程序入口(c中main)。.globl命令声明外部程序可以访问的标签。

    汇编的代码模版:

        .section .data

            <init data>

        .section .bus

            <uninit data>

        .section .text

            .globl _start

            _start:

               <code>

    代码模版中data跟bss都是可选的,如果不定义数据,就不需要使用。

    接下来我们来创建一个简单的汇编程序,就像c语言的hello world一样。(直接copy的书本)

    .section .data

         output:

             .ascii  "ID is  'XXXXXXXXXXXX'\n"

    .section .text

        .globl _start

        _start:

           movl $0, %eax

           cupid

           movl $output, %edi

           movl %ebx, 7(%edi)

           movl %edx, 11(%edi)

           movl %ecx, 15(%edi)

           movl $4, %eax

           movl $1, %ebx

           movl $output, %ecx

           movl $21, %edx

           int $0x80

           movl $1, %eax

           movl $0, %ebx

           int $0x80

    建议在32位机器上编译执行,防止一些兼容性错误。刚开始学习,对于一些奇奇怪怪的错误还不能很好的处理。我们先学习基础的。这段代码的是显示电脑cpu id信息的。保存了代码到文件cpuid.s。 然后编译链接:as -o cpuid.o cpuid.s; ld -o cpuid cpuid.s。在linux环境下编译哦,我们使用的是GNU工具。GNU是通用汇编器,使用gcc也可以编译汇编程序。但是有个问题要注意,GNU查找_start为程序的开始位置,但是gcc使用main作为开始位置,所以使用gcc编译是要把_start替换成main。 你可以试试看。


二  定义数据

  程序最重要的任务之一就是处理数据对象,在每个汇编语言中,都必须管理某种类型的数据元素。

  程序的数据段(.data)是最常见的定义数据元素的位置。在这个段中声明的任何数据元素都可以被指令读取和写入。在数据段中定义数据元素需要用到两个语句:一个标签和一个命令。数据使用的内存大小取决于你定义的数据类型。数据类型有.ascii, .asciz, .byte, .double, .float, .int等等,不作一一说明了。下面我们来看几个例子:

      output:

          .ascii "ID is 'XXXXXXXX'\n"

      定义个字符串,把这个字符串放到一个15个字节的内存中,并且把第一个字节赋值给output这个标签。

      pi:

          .flaot 3.14159

      sizes:

          .long 100, 150, 200, 250

      这个就是数组的概念了。访问的时候,依次加4个字节。使用size+8来访问200,并且读取4个字节(一个长整数)。

  静态符号就是把常量设置成在本段中使用的符号,有点c中宏定义的感觉。使用.equ定义静态变量: .equ CALL , 0x80 

  在bss段中定义数据元素无需声明特定的数据类型,只要声明所需要的内存即可。声明命令有两个:

      .comm    声明为初始化的数据的通用内存区

      .lcomm    声明为初始化的数据的本地通用内存区域

      命令格式:  .comm symbol, length

  在bss中声明的内存,并不在编译的程序中。例如.comm buffer, 1000,二进制bin文件的大小不包含这1000个字节。

  到这里,我们了解数据的定义,后续我们开始了解怎样移动数据。

    

0 0
原创粉丝点击