linux下c/c /汇编/内核编程与调试(10)-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 893615
  • 博文数量: 113
  • 博客积分: 3160
  • 博客等级: 少校
  • 技术积分: 1801
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-19 10:09
文章分类

全部博文(113)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: linux

2012-05-30 16:47:36

9.5 一个程序解析实例    

1 . 源代码    

/*****************************************************/

/* 这是主函数,整个程序的入口,它通过链接静态库libmystring.a  */

/*   以及libtest.a和目标文件myprintf实现整个函数          */

/*****************************************************/

#define max 15

char a[] = "hello, world !\n";

int main(void)

{

  char b[max];

  

  mystrcpy(b , a);

  myprintf(b , mystrlen(b));

  test();

  return 0;

}

 

 

 

;; void myprint(char* , const char*);函数原型

;; 它作为目标文件链接到my.c

globalmyprintf;; 导出便于ld链接器识别

myprintf:

movedx, [esp   8];; 字符串的长度

movecx, [esp   4];; 字符串首地址

movebx, 1

moveax, 4

int0x80;; linux系统调用write

ret

 

 

 

 

// 这是mystrcpymystrlen函数的定义,作为静态库函数链接到my.o

char* mystrcpy(char* strdes , const char* strsrc)

{

  char* temp = strdes;

  while('\0' != *strsrc)

    {

      *temp = *strsrc;

      temp  ;

      strsrc  ;

    }

  *temp = '\0';

  return strdes;

}

 

 

int mystrlen(char* strsrc)

{

  int len = 0;

  while('\0' != *strsrc)

    {

      strsrc  ;

      len  ;

    }

 

  return len;

}

 

 

 

 

 

;; 函数void test(void);的原型,作为静态库链接到my.o

[section .data]

strtestdb"the test is successed !", 0ah

strlenequ$ - strtest

[section .text]

globaltest

test:

movedx, strlen

movecx, strtest

movebx, 1

moveax, 4

int0x80;;linux_write

movebx, 0

moveax, 1

int0x80;;linux_exit

 

 

 

 

: makefile文件的配置      

###################################################

##

## makefile for program my

##

##################################################

编译器及命令选项

cc= cc

cflags = -c

as = nasm

asflags = -f elf -g -f stabs 

ar= ar

arflags= -r

target = my

 

所有的伪目标

.phony : everything clean all finalclean

 

# make会把第一个目标作为整个文件的最终生成目标,因此这是makefile开始的地方

everything : $(target)

 

下面三个是伪目标,主要作为make的接口处理其它工作,比如清理文件

all : clean everything 

clean :

rm -f  my.o  myprintf.o mystring.o 

finalclean :

rm -f my.o myprintf.o mystring.o test.o

rm -f libmystring.a  libtest.a my

 

 

下面是依赖关系,整个makefile的核心。

my : my.o myprintf.o libmystring.a libtest.a

$(cc)  -o $@ $^ 

my.o : my.c 

$(cc) $(cflags)  -o $@ $^

myprintf.o : myprintf.asm

$(as) $(asflags) -o $@ $^

libmystring.a : mystring.c

$(cc) $(cflags) -o mystring.o $^

$(ar) $(arflags) -o $@ mystring.o

libtest.a : test.asm 

$(as) $(asflags) -o test.o $^

$(ar) $(arflags) -o $@ test.o

 

 

 

: 链接执行输出结果      

lishuo@lishuo-rev-1-0:~/test/test$ ls

 

makefile   my.c   myprintf.asm   mystring.c   test.asm   结果.txt

makefile~  my.c~  myprintf.asm~  mystring.c~  test.asm~

 

 

lishuo@lishuo-rev-1-0:~/test/test$ make 

 

cc -c  -o my.o my.c

nasm -f elf -g -f stabs  -o myprintf.o myprintf.asm

cc -c -o mystring.o mystring.c

ar -r -o libmystring.a mystring.o

ar: creating libmystring.a

nasm -f elf -g -f stabs  -o test.o test.asm

ar -r -o libtest.a test.o

ar: creating libtest.a

cc  -o my my.o myprintf.o libmystring.a libtest.a 

 

 

lishuo@lishuo-rev-1-0:~/test/test$ make

make: 没有什么可以做的为 `everything'

 

 

lishuo@lishuo-rev-1-0:~/test/test$ ./my

hello, world !

the test is successed !

 

 

 

 

 

4 : 可执行文件反汇编    

my:     file format elf32-i386

08048404 

:

 8048404:55                  push   �p

 8048405:89 e5                mov    %esp,�p

 8048407:83 e4 f0             and    $0xfffffff0,%esp

 804840a:83 ec 30             sub    $0x30,%esp

 804840d:65 a1 14 00 00 00    mov    %gs:0x14,�x

 8048413:89 44 24 2c          mov    �x,0x2c(%esp)

 8048417:31 c0                xor    �x,�x

 8048419:c7 44 24 04 14 a0 04 movl   $0x804a014,0x4(%esp)

 8048420:08 

 8048421:8d 44 24 1d          lea    0x1d(%esp),�x

 8048425:89 04 24             mov    �x,(%esp)

 8048428:e8 5b 00 00 00       call   8048488 

 804842d:8d 44 24 1d          lea    0x1d(%esp),�x

 8048431:89 04 24             mov    �x,(%esp)

 8048434:e8 85 00 00 00       call   80484be 

 8048439:89 44 24 04          mov    �x,0x4(%esp)

 804843d:8d 44 24 1d          lea    0x1d(%esp),�x

 8048441:89 04 24             mov    �x,(%esp)

 8048444:e8 27 00 00 00       call   8048470 

 8048449:e8 a2 00 00 00       call   80484f0 

 804844e:b8 00 00 00 00       mov    $0x0,�x

 8048453:8b 54 24 2c          mov    0x2c(%esp),�x

 8048457:65 33 15 14 00 00 00 xor    %gs:0x14,�x

 804845e:74 05                je     8048465 

 8048460:e8 bb fe ff ff       call   8048320 <__stack_chk_fail@plt>

 8048465:c9                   leave  

 8048466:c3                   ret    

 8048467:90                   nop

 8048468:90                   nop

 8048469:90                   nop

 804846a:90                   nop

 804846b:90                   nop

 804846c:90                   nop

 804846d:90                   nop

 804846e:90                 nop

 804846f:90                 nop

08048470 :

 8048470:8b 54 24 08          mov    0x8(%esp),�x

 8048474:8b 4c 24 04          mov    0x4(%esp),�x

 8048478:bb 01 00 00 00       mov    $0x1,�x

 804847d:b8 04 00 00 00       mov    $0x4,�x

 8048482:cd 80                int    $0x80

 8048484:c3                   ret    

 8048485:90                   nop

 8048486:90                   nop

 8048487:90                   nop

08048488 :

 8048488:55                   push   �p

 8048489:89 e5                mov    %esp,�p

 804848b:83 ec 10             sub    $0x10,%esp

 804848e:8b 45 08             mov    0x8(�p),�x

 8048491:89 45 fc             mov    �x,-0x4(�p)

 8048494:eb 13                jmp    80484a9 

 8048496:8b 45 0c             mov    0xc(�p),�x

 8048499:0f b6 10             movzbl (�x),�x

 804849c:8b 45 fc             mov    -0x4(�p),�x

 804849f:88 10                mov    %dl,(�x)

 80484a1:83 45 fc 01          addl   $0x1,-0x4(�p)

 80484a5:83 45 0c 01          addl   $0x1,0xc(�p)

 80484a9:8b 45 0c             mov    0xc(�p),�x

 80484ac:0f b6 00             movzbl (�x),�x

 80484af:84 c0                test   %al,%al

 80484b1:75 e3                jne    8048496 

 80484b3:8b 45 fc             mov    -0x4(�p),�x

 80484b6:c6 00 00             movb   $0x0,(�x)

 80484b9:8b 45 08             mov    0x8(�p),�x

 80484bc:c9                   leave  

 80484bd:c3                   ret    

080484be :

 80484be:55                   push   �p

 80484bf:89 e5                mov    %esp,�p

 80484c1:83 ec 10             sub    $0x10,%esp

 80484c4:c7 45 fc 00 00 00 00 movl   $0x0,-0x4(�p)

 80484cb:eb 08                jmp    80484d5 

 80484cd:83 45 08 01          addl   $0x1,0x8(�p)

 80484d1:83 45 fc 01          addl   $0x1,-0x4(�p)

 80484d5:8b 45 08             mov    0x8(�p),�x

 80484d8:0f b6 00             movzbl (�x),�x

 80484db:84 c0                test   %al,%al

 80484dd:75 ee                jne    80484cd 

 80484df:8b 45 fc             mov    -0x4(�p),�x

 80484e2:c9                   leave  

 80484e3:c3                   ret    

 80484e4:90                   nop

 80484e5:90                   nop

 80484e6:90                   nop

 80484e7:90                   nop

 80484e8:90                   nop

 80484e9:90                   nop

 80484ea:90                   nop

 80484eb:90                   nop

 80484ec:90                   nop

 80484ed:90                   nop

 80484ee:90                   nop

 80484ef:90                   nop

080484f0 :

 80484f0:ba 18 00 00 00       mov    $0x18,�x

 80484f5:b9 24 a0 04 08       mov    $0x804a024,�x

 80484fa:bb 01 00 00 00       mov    $0x1,�x

 80484ff:b8 04 00 00 00       mov    $0x4,�x

 8048504:cd 80                int    $0x80

 8048506:90                   nop

 8048507:90                   nop

 8048508:90                   nop

 8048509:90                   nop

 804850a:90                   nop

 804850b:90                   nop

 804850c:90                   nop

 804850d:90                   nop

 804850e:90                   nop

 804850f:90                   nop

 

 

 

 

 

 

 

参考文档:

 

 

1: 《linux命令,编辑器与shell编程》 mark g. sobell

2: 《linux命令,编辑器与shell编程实例大全》 杨明华 谭厉 于重重 著

3: 《linux命令详解词典》 施威研究室 著

4:  ubuntu下解压文件常用的方法

5:  linux的一些安装文件的命令:aptdpkg

6:  emacs命令大全

7:  王垠的凯发app官方网站主页

8:  emacs24

9:  linux环境下c编程指南(第二版)

10: gcc中文手册

11: gcc技术参考大全 胡恩华译

12: nasm中文手册

13 《跟我一起写makefile》 陈皓

14: 《链接器与加载器》 john r . levine著  李勇译

阅读(2673) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图