频道栏目
首页 > 网络 > 云计算 > 正文

linux汇编之程序结构

2017-04-04 09:17:00           
收藏   我要投稿
linux汇编之程序结构:数据段:是可选的,数据段声明带有初始值的数据元素,这些数据元素用作汇编语言程序中的变量。

bss段:是可选的,bss段声明使用0或者null值初始化的数据元素,这些数据元素最常用作汇编语言程序中的缓冲区。

文本段:所有的汇编语言程序中都必须有文本段,这里是可执行程序内声明指令码的地方。

 

定义段

gun汇编器使用.section命令语句声明段。.section语句只使用一个参数---它声明的段的类型。

有以下几种段类型:

.section .data

.section .bss

.section .text

 

定义起始点

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

为了解决这一个问题,gun汇编器声明一个默认标签,或者说标识符,它应该用作应用程序的入口点。

_start标签用于表明程序应该从这条指令开始运行。

因此,汇编语言的模版应该是这样的:

.section .data

.section .bss

.section .text

.globl _start

_start:

除了在应用程序中声明起始标签这外,还需要为外部应用程序提供入口点。这就是使用.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'


上一篇:python3的数据透视表
下一篇:hive提取等号后面的值
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站