在看《深入分析Linux内核源码》时有下面这句话:
-
2.6.2 AT&T汇编语言的相关知识
-
在Linux源代码中,以.S为扩展名的文件是“纯”汇编语言的文件。这里,我们结合具体的例子再介绍一些AT&T汇编语言的相关知识。
-
1.GNU汇编程序GAS(GNU Assembly和连接程序
-
当你编写了一个程序后,就需要对其进行汇编(assembly)和连接。在Linux下有两种方式,一种是使用汇编程序GAS和连接程序ld,一种是使用gcc。我们先来看一下GAS和ld:
-
GAS把汇编语言源文件(.o)转换为目标文件(.o),其基本语法如下:
-
as filename.s -o filename.o
-
一旦创建了一个目标文件,就需要把它连接并执行,连接一个目标文件的基本语法为:
-
ld filename.o -o filename
-
-
这里 filename.o是目标文件名,而filename 是输出(可执行) 文件。
-
GAS使用的是AT&T的语法而不是Intel的语法,这就再次说明了AT&T语法是Unix世界的标准,你必须熟悉它。
-
-
如果要使用GNC的C编译器gcc,就可以一步完成汇编和连接,例如:
-
gcc -o example example.S
对上面这段话不太理解,测试一下:
每个程序包括三个文件
共用的头文件include/header.h
-
include/header.h
-
#define BOOT_FLAG 0x3132 ;这个BOOT_FLAG将在.s 或 .S中引用,测试一下
1.1 cpuid.S
-
#include "header.h" ;用大S引用头文件时,同 C 用 #include
-
-
.section .data
-
output:
-
.asciz "BOOT_FLAG:****\n"
-
.section .text
-
.globl main ;直接编译为可执行文件需要把entry由_start改为main
-
main:
-
nop
-
movl $BOOT_FLAG, %eax
-
movl $output, %edi
-
movl %eax, 10(%edi)
-
movl $4, %eax
-
movl $1, %ebx
-
movl $output, %ecx
-
movl $15, %edx
-
int $0x80
-
movl $1, %eax
-
movl $0, %ebx
-
int $0x80
1.2 Makefile
-
CC=gcc
-
CC_FLAG= -Iinclude
-
TAR=cpuid
-
ALL:$(TAR)
-
cpuid:cpuid.S
-
gcc -g -Iinclude -o cpuid cpuid.S
-
clean:
-
rm *.o $(TAR)
2.1 cpuid.S
-
#include "header.h" ;用大S引用头文件时,同 C 用 #include
-
-
.section .data
-
output:
-
.ascii "BOOT_FLAG:****\n"
-
.section .text
-
.globl _start ;不直接编译成可执行文件时entry为_start
-
_start:
-
nop
-
movl $BOOT_FLAG, %eax
-
movl $output, %edi
-
movl %eax, 10(%edi)
-
movl $4, %eax
-
movl $1, %ebx
-
movl $output, %ecx
-
movl $15, %edx
-
int $0x80
-
movl $1, %eax
-
movl $0, %ebx
-
int $0x80
2.2 Makefile
-
CC=gcc
-
CC_FLAG= -Iinclude
-
LD=ld
-
TAR=cpuid
-
ALL:$(TAR)
-
cpuid:cpuid.o
-
$(LD) -o $@ $^
-
cpuid.o:cpuid.S
-
$(CC) $(CC_FLAG) -gstabs -o $@ -c $^
-
clean:
-
rm *.o $(TAR)
3.1 cpuid.s
-
.include "header.h" ;用小s引用头文件时, .include
-
-
.section .data
-
output:
-
.ascii "BOOT_FLAG:****\n"
-
.section .text
-
.globl _start ;不直接编译成可执行文件时entry为_start
-
_start:
-
nop
-
movl $BOOT_FLAG, %eax
-
movl $output, %edi
-
movl %eax, 10(%edi)
-
movl $4, %eax
-
movl $1, %ebx
-
movl $output, %ecx
-
movl $15, %edx
-
int $0x80
-
movl $1, %eax
-
movl $0, %ebx
-
int $0x80
3.2 Makefile
-
AS=as
-
AS_FLAG= -Iinclude
-
LD=ld
-
TAR=cpuid
-
ALL:$(TAR)
-
cpuid:cpuid.o
-
$(LD) -o $@ $^
-
cpuid.o:cpuid.s
-
$(AS) $(AS_FLAG) -gstabs -o $@ $^
-
clean:
-
rm *.o $(TAR)
总结:
用small_s时,引用头文件 .include "filename.h"
用big_S时,引用头件 #include "filename.h“
当用gcc 直接编译时,需要把entry 由_start ,改为main
inc_t.rar
注:发现新版博客字体太难看了!唉。
阅读(2132) | 评论(0) | 转发(1) |