linux汇编之程序结构
2017-03-31 16:35
190 查看
理论
程序组成:数据段:是可选的,数据段声明带有初始值的数据元素,这些数据元素用作汇编语言程序中的变量
bss段:是可选的,bss段声明使用0或者null值初始化的数据元素,这些数据元素最常用作汇编语言程序中的缓冲区。
文本段:所有的汇编语言程序中都必须有文本段,这里是可执行程序内声明指令码的地方。
定义段
gun汇编器使用.section命令语句声明段。.section语句只使用一个参数---它声明的段的类型。
有以下几种段类型:
.section .data
.section .bss
.section .text
定义起始点
当汇编语言程序被转换为可执行文件时,连接器必须知道指令码中的起始点是什么。
为了解决这一个问题,gun汇编器声明一个默认标签,或者说标识符,它应该用作应用程序的入口点。
_start标签用于表明程序应该从这条指令开始运行。
因此,汇编语言的模版应该是这样的:
.section .data
<initialized data here>
.section .bss
<uninitialized data here>
.section .text
.globl _start
_start:
<instruction ode goes here>
除了在应用程序中声明起始标签这外,还需要为外部应用程序提供入口点。这就是使用.globl命令完成。
.globl命令声明外部程序可以访问的程序标签。
例子
[root@proEnv33 asm]# vim cpuid.s[root@proEnv33 asm]# cat cpuid.s #cpud.s Sample program to extrac the processor Vendor ID .section .data output: .ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n" #上面声明了一个变量,变量名为output,并且其为ascii类型的字符,这一个字符是预定义的,是放到内存当中的。 .section .text .globl _start _start: movl $0,%eax #初始化eax寄存器为0 cpuid #执行cpuid命令 movl $output,%edi #这时output变量是指针,把output变量的内存位置加载到edi寄存器当中 movl %ebx, 28(%edi) movl %edx, 32(%edi) movl %ecx, 36(%edi) #上面是从三个寄存在器得到相应的值,分别放到变量的xxx位置上。 movl $4,%eax #指定eax的系统调用值,也就是指定系统调用函数,4代表着调用系统的write函数。 movl $1,%ebx #寄存器ebx指定要写入的文件描述符 movl $output,%ecx #寄存器ecx指定字符串的开头 movl $42, %edx #寄存器edx指定字符串的长度 int $0x80 #生成一个0x80的软中断 movl $1, %eax #调用系统退出函数1(退出函数) movl $0, %ebx #寄存器ebx包含程序返回给shell的退出代码值。 int $0x80 #生成一个0x80的软中断
[root@proEnv33 asm]# as -o cpuid.o cpuid.s
[root@proEnv33 asm]# ld -o cpuid cpuid.o
[root@proEnv33 asm]# ls
cpuid cpuid.o cpuid.s
[root@proEnv33 asm]# ./cpuid
The processor Vendor ID is 'GenuineIntel'
相关文章推荐
- Linux下的汇编程序设计
- Win32汇编教程二 Win32汇编程序的结构和语法
- 反汇编linux程序
- [Linux Jee] Linux部署多个实例的分布式程序时的目录结构
- Linux程序存储结构与进程结构
- Win32汇编教程二 Win32汇编程序的结构和语法
- Linux下的一个简单汇编程序, .long声明数据的长度问题!
- 如何在Linux环境下编DSP的汇编或线性汇编程序
- Linux显示文件树形结构信息的小程序
- 【汇编】Linux 下汇编程序开发
- Linux下最简单的汇编程序
- AT&T汇编---第一个linux汇编程序
- Linux下的一个简单汇编程序, .long声明数据的长度问题!
- [转载]Linux程序存储结构与进程结构
- 汇编程序的结构——Hello World !
- Linux下最简单的汇编程序
- ARM汇编语言中的程序结构
- Linux下汇编程序及系统调用的深入分析
- 跨平台(Windows+Linux)的Socket通讯程序(二)—结构
- linux 程序存储结构与进程结构