Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2151673
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2011-09-10 01:31:50

在看《深入分析Linux内核源码》时有下面这句话:

  1. 2.6.2 AT&T汇编语言的相关知识
  2. 在Linux源代码中,以.S为扩展名的文件是“纯”汇编语言的文件。这里,我们结合具体的例子再介绍一些AT&T汇编语言的相关知识。
  3. 1.GNU汇编程序GAS(GNU Assembly和连接程序
  4. 当你编写了一个程序后,就需要对其进行汇编(assembly)和连接。在Linux下有两种方式,一种是使用汇编程序GAS和连接程序ld,一种是使用gcc。我们先来看一下GAS和ld:
  5. GAS把汇编语言源文件(.o)转换为目标文件(.o),其基本语法如下:
  6. as filename.s -o filename.o
  7. 一旦创建了一个目标文件,就需要把它连接并执行,连接一个目标文件的基本语法为:
  8. ld filename.o -o filename

  9. 这里 filename.o是目标文件名,而filename 是输出(可执行) 文件。
  10. GAS使用的是AT&T的语法而不是Intel的语法,这就再次说明了AT&T语法是Unix世界的标准,你必须熟悉它。

  11. 如果要使用GNC的C编译器gcc,就可以一步完成汇编和连接,例如:
  12. gcc -o example example.S


对上面这段话不太理解,测试一下:

每个程序包括三个文件

共用的头文件include/header.h  

  1. include/header.h
  2. #define BOOT_FLAG 0x3132 ;这个BOOT_FLAG将在.s 或 .S中引用,测试一下

1.1  cpuid.S

  1. #include "header.h" ;用大S引用头文件时,同 C 用 #include

  2. .section .data
  3. output:
  4. .asciz "BOOT_FLAG:****\n"
  5. .section .text
  6. .globl main ;直接编译为可执行文件需要把entry由_start改为main
  7. main:
  8. nop
  9. movl $BOOT_FLAG, %eax
  10. movl $output, %edi
  11. movl %eax, 10(%edi)
  12. movl $4, %eax
  13. movl $1, %ebx
  14. movl $output, %ecx
  15. movl $15, %edx
  16. int $0x80
  17. movl $1, %eax
  18. movl $0, %ebx
  19. int $0x80

1.2  Makefile

  1. CC=gcc
  2. CC_FLAG= -Iinclude
  3. TAR=cpuid
  4. ALL:$(TAR)
  5. cpuid:cpuid.S
  6. gcc -g -Iinclude -o cpuid cpuid.S
  7. clean:
  8. rm *.o $(TAR)

2.1 cpuid.S

  1. #include "header.h" ;用大S引用头文件时,同 C 用 #include

  2. .section .data
  3. output:
  4. .ascii "BOOT_FLAG:****\n"
  5. .section .text
  6. .globl _start ;不直接编译成可执行文件时entry为_start
  7. _start:
  8. nop
  9. movl $BOOT_FLAG, %eax
  10. movl $output, %edi
  11. movl %eax, 10(%edi)
  12. movl $4, %eax
  13. movl $1, %ebx
  14. movl $output, %ecx
  15. movl $15, %edx
  16. int $0x80
  17. movl $1, %eax
  18. movl $0, %ebx
  19. int $0x80

2.2 Makefile

  1. CC=gcc
  2. CC_FLAG= -Iinclude
  3. LD=ld
  4. TAR=cpuid
  5. ALL:$(TAR)
  6. cpuid:cpuid.o
  7. $(LD) -o $@ $^
  8. cpuid.o:cpuid.S
  9. $(CC) $(CC_FLAG) -gstabs -o $@ -c $^
  10. clean:
  11. rm *.o $(TAR)

3.1 cpuid.s

  1. .include "header.h" ;用小s引用头文件时, .include

  2. .section .data
  3. output:
  4. .ascii "BOOT_FLAG:****\n"
  5. .section .text
  6. .globl _start ;不直接编译成可执行文件时entry为_start
  7. _start:
  8. nop
  9. movl $BOOT_FLAG, %eax
  10. movl $output, %edi
  11. movl %eax, 10(%edi)
  12. movl $4, %eax
  13. movl $1, %ebx
  14. movl $output, %ecx
  15. movl $15, %edx
  16. int $0x80
  17. movl $1, %eax
  18. movl $0, %ebx
  19. int $0x80


3.2 Makefile

  1. AS=as
  2. AS_FLAG= -Iinclude
  3. LD=ld
  4. TAR=cpuid
  5. ALL:$(TAR)
  6. cpuid:cpuid.o
  7. $(LD) -o $@ $^
  8. cpuid.o:cpuid.s
  9. $(AS) $(AS_FLAG) -gstabs -o $@ $^
  10. clean:
  11. rm *.o $(TAR)


总结:

用small_s时,引用头文件 .include "filename.h"

用big_S时,引用头件 #include "filename.h“

当用gcc 直接编译时,需要把entry 由_start ,改为main


 inc_t.rar   


注:发现新版博客字体太难看了!唉。

阅读(2132) | 评论(0) | 转发(1) |
0

上一篇:没有了

下一篇:linux使用--TQ2440使用总结

给主人留下些什么吧!~~