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

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

全部博文(113)

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

分类: linux

2012-05-23 12:18:46

5 nasm 汇编编译及调试
 
 
 
 
5.1 nasm简介
 

nasm 是一个为可移植性与模块化而设计的一个 80x86 的汇编器,即网际汇编。它支持相当多的目标文件格式,包括 linux 'netbsd/freebsd','a.out','elf','coff',微软 16位的'obj''win32'。它还可以输出纯二进制文件。它的语法设计得相当的简洁易懂,masm语法很相似,如果你熟悉masm格式汇编的话,你会很容易上手的。如果你需要了解它的语法和用法,请参阅nasm中文手册。

 

 

 

5.2 nasm命令行语法格式

nasm -f   [-o ]

下面是几种常用的命令:

生成elf格式的目标文件命令: nasm -f elf test.asm

生成二进制文件: nasm test.asm -o test.bin

生成.com文件: nasm test.asm -o test.com

生成可用于gdb调试的文件:nasm -f elf test.asm -g -f stabs

 

 

5.3 gdb调试nasm汇编
 

下面两行命令将使得nasm格式汇编可以在gdb中调试。

nasm -f elf test.asm -l test.lst -g -f stabs

gcc -g -o test test.o

注释:-f elf  设定输出文件为linux下的elf格式

     -g      激活调试信息

     -f stabs 说明生成调试信息的格式

     -l test.lst  生成一个.lst文件,里面包含源代码以及地址等信息,可以帮助你查看错误

 

 

下面是我的调试过程:

 

 

lishuo@lishuo-rev-1-0:~$ gdb test

gnu gdb (ubuntu/linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02

凯发app官方网站 copyright (c) 2012 free software foundation, inc.

license gplv3 : gnu gpl version 3 or later <

this is free software: you are free to change and redistribute it.

there is no warranty, to the extent permitted by law.  type "show copying"

and "show warranty" for details.

this gdb was configured as "i686-linux-gnu".

for bug reporting instructions, please see:

<

reading symbols from /home/lishuo/test...done.

(gdb) list  <=======================列出源代码

1

2;  test.asm  

3;

4; assemble:nasm -f elf -l hello.lst  hello.asm -g -f stabs

5; link:gcc -g -o hello  hello.o

6; run:        ./test 

7; output is:this is a test !

8

9section .data这里存放数据

10msg:db "this is a test !",10

(gdb) <======================= 回车接着执行list命令

11len:equ $-msg

12

13

14section .text这是代码段

15

16global main导出main可以让链接器识别

17main:

18

19movedx,len显示字符串的长度

20movecx,msg字符串的地址

(gdb) 

21movebx,1

22moveax,4

23int0x80

24

25movebx,0

26moveax,1

27int0x80

(gdb) b 17    <========================break的简写,设置断点,在源代码的17

breakpoint 1 at 0x80483c0: file test.asm, line 17.

(gdb) b 20

breakpoint 2 at 0x80483c5: file test.asm, line 20.

(gdb) b 21

breakpoint 3 at 0x80483ca: file test.asm, line 21.

(gdb) b 22

breakpoint 4 at 0x80483cf: file test.asm, line 22.

(gdb) b 25

breakpoint 5 at 0x80483d6: file test.asm, line 25.

(gdb) b main  <========================在函数main处设置断点

note: breakpoint 1 also set at pc 0x80483c0.

breakpoint 6 at 0x80483c0

(gdb) b 24

note: breakpoint 5 also set at pc 0x80483d6.

breakpoint 7 at 0x80483d6: file test.asm, line 24.

(gdb) info b  <========================显示断点信息

num     type           disp enb address    what

1       breakpoint     keep y   0x080483c0 test.asm:17

2       breakpoint     keep y   0x080483c5 test.asm:20

3       breakpoint     keep y   0x080483ca test.asm:21

4       breakpoint     keep y   0x080483cf test.asm:22

5       breakpoint     keep y   0x080483d6 test.asm:25

6       breakpoint     keep y   0x080483c0 

7       breakpoint     keep y   0x080483d6 test.asm:24

(gdb) delete 6  <======================删除断点6

(gdb) info b

num     type           disp enb address    what

1       breakpoint     keep y   0x080483c0 test.asm:17

2       breakpoint     keep y   0x080483c5 test.asm:20

3       breakpoint     keep y   0x080483ca test.asm:21

4       breakpoint     keep y   0x080483cf test.asm:22

5       breakpoint     keep y   0x080483d6 test.asm:25

7       breakpoint     keep y   0x080483d6 test.asm:24

(gdb) r   <=========================开始执行,调试开始

starting program: /home/lishuo/test 

breakpoint 1, 0x080483c0 in main ()

(gdb) n  <====================由于nasm的一些原因,单步执行ns都不能使用

single stepping until exit from function main,

which has no line number information.

breakpoint 2, 0x080483c5 in main ()

(gdb) s

single stepping until exit from function main,

which has no line number information.

breakpoint 3, 0x080483ca in main ()

(gdb) print $eax  <=======================打印寄存器的值

$1 = 1

(gdb) info r   <==========================显示所有的寄存器值

eax            0x11

ecx            0x804a010134520848

edx            0x1117

ebx            0xb7fc2ff4-1208209420

esp            0xbffff2fc0xbffff2fc

ebp            0x00x0

esi            0x00

edi            0x00

eip            0x80483ca0x80483ca 

eflags         0x200246[ pf zf if id ]

cs             0x73115

ss             0x7b123

ds             0x7b123

es             0x7b123

fs             0x00

gs             0x3351

(gdb) disassemble  <========================反汇编

dump of assembler code for function main:

   0x080483c0 < 0>:mov    $0x11,�x

   0x080483c5 < 5>:mov    $0x804a010,�x

=> 0x080483ca < 10>:mov    $0x1,�x

   0x080483cf < 15>:mov    $0x4,�x

   0x080483d4 < 20>:int    $0x80

   0x080483d6 < 22>:mov    $0x0,�x

   0x080483db < 27>:mov    $0x1,�x

   0x080483e0 < 32>:int    $0x80

   0x080483e2 < 34>:nop

   0x080483e3 < 35>:nop

   0x080483e4 < 36>:nop

   0x080483e5 < 37>:nop

   0x080483e6 < 38>:nop

   0x080483e7 < 39>:nop

   0x080483e8 < 40>:nop

   0x080483e9 < 41>:nop

   0x080483ea < 42>:nop

   0x080483eb < 43>:nop

   0x080483ec < 44>:nop

   0x080483ed < 45>:nop

   0x080483ee < 46>:nop

   0x080483ef < 47>:nop

---type  to continue, or q  to quit---

end of assembler dump.

(gdb) x/5cb 0x804a010   <================显示内存地址0x804a010开始的一段内存的值

0x804a010 :84 't'104 'h'105 'i'115 's'32 ' '

(gdb) set disassembly-flavor intel  <==========设置以intel汇编形式显示

(gdb) disassemble main

dump of assembler code for function main:

   0x080483c0 < 0>:mov    edx,0x11

   0x080483c5 < 5>:mov    ecx,0x804a010

=> 0x080483ca < 10>:mov    ebx,0x1

   0x080483cf < 15>:mov    eax,0x4

   0x080483d4 < 20>:int    0x80

   0x080483d6 < 22>:mov    ebx,0x0

   0x080483db < 27>:mov    eax,0x1

   0x080483e0 < 32>:int    0x80

   0x080483e2 < 34>:nop

   0x080483e3 < 35>:nop

   0x080483e4 < 36>:nop

   0x080483e5 < 37>:nop

   0x080483e6 < 38>:nop

   0x080483e7 < 39>:nop

   0x080483e8 < 40>:nop

   0x080483e9 < 41>:nop

   0x080483ea < 42>:nop

   0x080483eb < 43>:nop

   0x080483ec < 44>:nop

   0x080483ed < 45>:nop

   0x080483ee < 46>:nop

   0x080483ef < 47>:nop

---type  to continue, or q  to quit---

end of assembler dump.

(gdb) x/90xb main     <===============显示main开始的内存的内容

0x80483c0 

:0xba0x110x000x000x000xb90x100xa0

0x80483c8 

:0x040x080xbb0x010x000x000x000xb8

0x80483d0 

:0x040x000x000x000xcd0x800xbb0x00

0x80483d8 

:0x000x000x000xb80x010x000x000x00

0x80483e0 

:0xcd0x800x900x900x900x900x900x90

0x80483e8 

:0x900x900x900x900x900x900x900x90

0x80483f0 <__libc_csu_init>:0x550x570x560x530xe80x690x000x00

0x80483f8 <__libc_csu_init 8>:0x000x810xc30xfb0x1b0x000x000x83

0x8048400 <__libc_csu_init 16>:0xec0x1c0x8b0x6c0x240x300x8d0xbb

0x8048408 <__libc_csu_init 24>:0x200xff0xff0xff0xe80x830xfe0xff

0x8048410 <__libc_csu_init 32>:0xff0x8d0x830x200xff0xff0xff0x29

0x8048418 <__libc_csu_init 40>:0xc70xc1

(gdb) info stack   <=========================显示堆栈信息

#0  0x080483ca in main ()

(gdb) q          <====================退出正在调试的程序

a debugging session is active.

inferior 1 [process 2587] will be killed.

quit anyway? (y or n) n

not confirmed.

(gdb) c       <==============继续调试到下一个断点

continuing.

breakpoint 4, 0x080483cf in main ()

(gdb) c

continuing.

this is a test !

breakpoint 5, 0x080483d6 in main ()

(gdb) c

continuing.

[inferior 1 (process 2587) exited normally]

(gdb) q   <==================退出gdb调试

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