您的位置:首页 > 运维架构 > Linux

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'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: