汇编语言学习(二)
来源:互联网 发布:在线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个字节。
到这里,我们了解数据的定义,后续我们开始了解怎样移动数据。
- 汇编语言学习笔记(二)
- 汇编语言学习二
- 汇编语言学习(二)
- 汇编语言学习(二)
- win32汇编语言学习之二
- 《汇编语言》学习(二)寄存器
- 汇编语言学习笔记(二)
- 王爽之《汇编语言》学习重点二
- 王爽之《汇编语言》学习重点二
- 王爽之《汇编语言》学习重点二
- AT&T 汇编语言学习笔记二
- 【学习笔记之汇编语言】【二】寄存器
- 汇编语言基础知识学习笔记(二)
- 汇编语言二
- 汇编语言-学习
- 学习汇编语言
- 学习汇编语言!
- 学习汇编语言
- 一元多项式的乘法与加法运算 PTA02-线性结构1
- javascript dom 操作
- C enum用法
- 合并k个有序链表
- ubuntu 安装 jdk+myeclipse
- 汇编语言学习(二)
- iOS之短信,邮件,通信录技术的完美实现
- opencv文件读写(二)使用多种方式及用法
- 【Netty4 简单项目实践】五、Netty4接收HTTP文件上传
- MapReduce Intro
- MIT 6.828 学习笔记4 Lab2实验报告
- Problem E: 输入两个整数,进行四则运算并输出结果
- Android面试题——Java面向对象思想
- STL算法_heap算法篇