gdb 调试nasm语法的汇编程序

首先看一个最基本的nasm语法汇编程序hello.asm: section .text

global main

main:

mov eax,4 ;4号调用

mov ebx,1 ;ebx送1表示stdout

mov ecx,msg ;字符串的首地址送入ecx

mov edx,14 ;字符串的长度送入edx

int 80h ;输出字串

mov eax,1 ;1号调用

int 80h ;结束

msg:

db "Hello World!",0ah,0dh

我 们想调用gdb进行调试,该怎么办呢?

请看下面的示例:

[root@localhost asm]# nasm -f elf hello.asm -g -F stabs

[root@localhost asm]# gcc -o hello hello.o -g

[root@localhost asm]# gdb hello

GNU gdb Red Hat Linux (6.6-8.fc7rh)

Copyright (C) 2006 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB. Type "show warranty" for details.

This GDB was configured as "i386-redhat-linux-gnu"...

Using host libthread_db library "/lib/i686/nosegneg/libthread_db.so.1".

(gdb)

说 明:

最关键的就是这一行nasm的编译命令:

[root@localhost asm]# nasm -f elf hello.asm -g -F stabs

-f elf    用来指定输出文件的格式

-F stabs 用来说明生成调试信息的格式,对于gcc来说都是用stabs,

-g    主要是激活调试信息

好了,看看如何调试:

(gdb) list 1

1 section .text

2 global main

3

4 main:

5 mov eax,4 ;4号调用

6 mov ebx,1 ;ebx送1表示stdout

7 mov ecx,msg ;字符串的首地址送入ecx

8 mov edx,14 ;字符串的长度送入edx

9 int 80h ;输出字串

10 mov eax,1 ;1号调用

(gdb) break 5

Breakpoint 1 at 0x8048380: file hello.asm, line 5.

(gdb) break 6

Breakpoint 2 at 0x8048385: file hello.asm, line 6.

(gdb) break *main

Note: breakpoint 1 also set at pc 0x8048380.

Breakpoint 3 at 0x8048380: file hello.asm, line 5.

(gdb) info break

Num Type Disp Enb Address What

1 breakpoint keep y 0x08048380 hello.asm:5

2 breakpoint keep y 0x08048385 hello.asm:6

3 breakpoint keep y 0x08048380 hello.asm:5

(gdb) delete 1

(gdb) info break

Num Type Disp Enb Address What

2 breakpoint keep y 0x08048385 hello.asm:6

3 breakpoint keep y 0x08048380 hello.asm:5

(gdb) run

Starting program: /data/workspace/asm/hello

Breakpoint 1, main () at hello.asm:5

5 mov eax,4 ;4号调用

(gdb) next

6 mov ebx,1 ;ebx送1表示stdout

(gdb) print $eax

$1 = 4

(gdb) info registers

eax 0x4 4

ecx 0x29d1c08a 701612170

edx 0x1 1

ebx 0xd94ff4 14241780

esp 0xbfc0ab0c 0xbfc0ab0c

ebp 0xbfc0ab68 0xbfc0ab68

esi 0x28bca0 2669728

edi 0x0 0

eip 0x8048385 0x8048385

eflags 0x246 [ PF ZF IF ]

cs 0x73 115

ss 0x7b 123

ds 0x7b 123

es 0x7b 123

fs 0x0 0

gs 0x33 51

(gdb) n

7 mov ecx,msg ;字符串的首地址送入ecx

(gdb) n

8 mov edx,14 ;字符串的长度送入edx

(gdb) p/x $ecx

$6 = 0x804839d

(gdb) x/5cb 0x804839d

0x804839d : 72 'H' 101 'e' 108 'l' 108 'l' 111 'o'

(gdb) n

9 int 80h ;输出字串

(gdb) n

Hello

10 mov eax,1 ;1号调用

(gdb) n

11 int 80h ;结束

(gdb) n

Program exited with code 01.

(gdb)

gdb 基本命令

gdb 支持很多的命令使你能实现不同的功能. 这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令, 表27.1列出了你在用 gdb 调试时会用到的一些命令. 想了解 gdb 的详细使用请参考 gdb 的指南页.

命  令    描  述

file    装入想要调试的可执行文件.

kill    终止正在调试的程序.

list    列出产生执行文件的源代码的一部分.

next    执行一行源代码但不进入函数内部.

step    执行一行源代码而且进入函数内部.

run    执行当前被调试的程序

quit    终止 gdb

watch    使你能监视一个变量的值而不管它何时被改变.

break    在代码里设置断点, 这将使程序执行到这里时被挂起.

make    使你能不退出 gdb 就可以重新产生可执行文件.

shell    使你能不离开 gdb 就执行 UNIX shell 命令.

还 可以用print命令显示某个寄存器的值,例如:print $eax

print/d $reg  以十进制显示reg的值

print/t $reg  二进制

print/x $reg  十六进制

x命令用来显示特定内存位置的值,格式如下:

x/nyz          n是要显示的字段数,y是输出格式(c字符,x是16进制,d是十进制),z是字段长度(b字节,h半字,w32位字)

例 如,x/42cb &output就是以字符模式显示output变量前42字节的值。

原文地址 http://www.blogjava.net/jiajw0426/articles/298388.html

首先看一个最基本的nasm语法汇编程序hello.asm: section .text

global main

main:

mov eax,4 ;4号调用

mov ebx,1 ;ebx送1表示stdout

mov ecx,msg ;字符串的首地址送入ecx

mov edx,14 ;字符串的长度送入edx

int 80h ;输出字串

mov eax,1 ;1号调用

int 80h ;结束

msg:

db "Hello World!",0ah,0dh

我 们想调用gdb进行调试,该怎么办呢?

请看下面的示例:

[root@localhost asm]# nasm -f elf hello.asm -g -F stabs

[root@localhost asm]# gcc -o hello hello.o -g

[root@localhost asm]# gdb hello

GNU gdb Red Hat Linux (6.6-8.fc7rh)

Copyright (C) 2006 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB. Type "show warranty" for details.

This GDB was configured as "i386-redhat-linux-gnu"...

Using host libthread_db library "/lib/i686/nosegneg/libthread_db.so.1".

(gdb)

说 明:

最关键的就是这一行nasm的编译命令:

[root@localhost asm]# nasm -f elf hello.asm -g -F stabs

-f elf    用来指定输出文件的格式

-F stabs 用来说明生成调试信息的格式,对于gcc来说都是用stabs,

-g    主要是激活调试信息

好了,看看如何调试:

(gdb) list 1

1 section .text

2 global main

3

4 main:

5 mov eax,4 ;4号调用

6 mov ebx,1 ;ebx送1表示stdout

7 mov ecx,msg ;字符串的首地址送入ecx

8 mov edx,14 ;字符串的长度送入edx

9 int 80h ;输出字串

10 mov eax,1 ;1号调用

(gdb) break 5

Breakpoint 1 at 0x8048380: file hello.asm, line 5.

(gdb) break 6

Breakpoint 2 at 0x8048385: file hello.asm, line 6.

(gdb) break *main

Note: breakpoint 1 also set at pc 0x8048380.

Breakpoint 3 at 0x8048380: file hello.asm, line 5.

(gdb) info break

Num Type Disp Enb Address What

1 breakpoint keep y 0x08048380 hello.asm:5

2 breakpoint keep y 0x08048385 hello.asm:6

3 breakpoint keep y 0x08048380 hello.asm:5

(gdb) delete 1

(gdb) info break

Num Type Disp Enb Address What

2 breakpoint keep y 0x08048385 hello.asm:6

3 breakpoint keep y 0x08048380 hello.asm:5

(gdb) run

Starting program: /data/workspace/asm/hello

Breakpoint 1, main () at hello.asm:5

5 mov eax,4 ;4号调用

(gdb) next

6 mov ebx,1 ;ebx送1表示stdout

(gdb) print $eax

$1 = 4

(gdb) info registers

eax 0x4 4

ecx 0x29d1c08a 701612170

edx 0x1 1

ebx 0xd94ff4 14241780

esp 0xbfc0ab0c 0xbfc0ab0c

ebp 0xbfc0ab68 0xbfc0ab68

esi 0x28bca0 2669728

edi 0x0 0

eip 0x8048385 0x8048385

eflags 0x246 [ PF ZF IF ]

cs 0x73 115

ss 0x7b 123

ds 0x7b 123

es 0x7b 123

fs 0x0 0

gs 0x33 51

(gdb) n

7 mov ecx,msg ;字符串的首地址送入ecx

(gdb) n

8 mov edx,14 ;字符串的长度送入edx

(gdb) p/x $ecx

$6 = 0x804839d

(gdb) x/5cb 0x804839d

0x804839d : 72 'H' 101 'e' 108 'l' 108 'l' 111 'o'

(gdb) n

9 int 80h ;输出字串

(gdb) n

Hello

10 mov eax,1 ;1号调用

(gdb) n

11 int 80h ;结束

(gdb) n

Program exited with code 01.

(gdb)

gdb 基本命令

gdb 支持很多的命令使你能实现不同的功能. 这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令, 表27.1列出了你在用 gdb 调试时会用到的一些命令. 想了解 gdb 的详细使用请参考 gdb 的指南页.

命  令    描  述

file    装入想要调试的可执行文件.

kill    终止正在调试的程序.

list    列出产生执行文件的源代码的一部分.

next    执行一行源代码但不进入函数内部.

step    执行一行源代码而且进入函数内部.

run    执行当前被调试的程序

quit    终止 gdb

watch    使你能监视一个变量的值而不管它何时被改变.

break    在代码里设置断点, 这将使程序执行到这里时被挂起.

make    使你能不退出 gdb 就可以重新产生可执行文件.

shell    使你能不离开 gdb 就执行 UNIX shell 命令.

还 可以用print命令显示某个寄存器的值,例如:print $eax

print/d $reg  以十进制显示reg的值

print/t $reg  二进制

print/x $reg  十六进制

x命令用来显示特定内存位置的值,格式如下:

x/nyz          n是要显示的字段数,y是输出格式(c字符,x是16进制,d是十进制),z是字段长度(b字节,h半字,w32位字)

例 如,x/42cb &output就是以字符模式显示output变量前42字节的值。

原文地址 http://www.blogjava.net/jiajw0426/articles/298388.html


相关内容

  • 10 个免费的 C/C++ 集成开发环境
  • 感谢mogujie的投递 新闻来源:oschina 集成开发环境(IDE)可以给程序员提供很大的帮助.大多数的IDE包含编译器和解释器.例如微软的 Visual Studio 本身内置的编译器和解释就是很好的例子,Eclipse 是另一个很好的例子.鼓励程序员使用IDE的主要原因是开发软件应用程序的 ...

  • 软件项目经理简历样板
  • 软件项目经理简历模板 姓名:****** 性别:男 电子邮箱:*******@139.com 联系电话:139************ 现居住地:重庆市*********号 国籍:中国 学历:学士 毕业学校:*****大学 专业:工业电气自动化.计算机应用 求职方向:项目经理或相关职位 工作经验 十 ...

  • 全国计算机等级考试三级嵌入式系统模拟题完整全套
  • 一.嵌入式系统开发的基础知识 (1)特点: 1.嵌入式系统的特点.分类.发展与应用,熟悉嵌入式系统的逻辑组成. 专用性 隐蔽性 (嵌入式系统是被包装在内部) 资源受限(要求小型化.轻型化.低功耗及低成本,因此软硬件资源受到限制) 高可靠性(任何误动作都可能会产生致命的后果) 软件固化(软件都固化在只 ...

  • 2014年自考软件开发工具资料笔记
  • 软件开发工具资料笔记 第1章 绪论 1.1 软件开发工具的由来 1.软件产品的(质量)(效率)(价格)已成为各方面关注的十分重要的问题.(多选题) 2.名词解释:软件开发工具 在高级程序设计语言的基础上,为提高软件的质量和效率,从规划.分析.设计.测试.成文和管理各方面,对软件开发者提供各种不同程度 ...

  • 嵌入式系统开发论文
  • 嵌入式系统开发论文 学院:电气与控制工程学院 专业:微电子学 1102 班 姓名:殷 波 学号:11 0 6 0 8 0 2 25 一. 嵌入式系统简介 嵌入式操作系统是指以应用为中心.以计算机技术为基础,软件硬件可裁剪.适应应用系统对功能.可靠性.成本.体积.功耗严格要求的专用计算机系统.嵌入式系 ...

  • 北京质数科技有限公司LinuxC笔试题
  • 北京质数科技有限公司LinuxC 笔试题 简介: 1. 笔试题是根据本人回忆写下来的,仅供参考: 2. 平时大家要多写代码,把每天的作业做完,笔试应该没什么问题: 3. 技术面试的一些体会: a) 会就是会,不会就是不会,不要瞎编乱造,撒谎只会给面试官留下不好的印 象: b) 技术面试的问题大都来自 ...

  • 计算机综合实践报告
  • 实验一 DEBUG调试工具熟悉.使用 一. 实验题目 熟悉.使用DEBUG 调试工具 二. 实验日期:2013/12/16 三. 实验目的 1. 了解并逐步熟悉汇编语言的编辑方法及特点. 2. 复习8088汇编语言的段结构.常用的指令与伪指令.存储空间的分配等. 3. 掌握汇编语言的编辑.汇编及连接 ...

  • uClinux系统分析
  • 简介 Linux是一种很受欢迎的操作系统,它与Unix系统兼容,开放源代码.它原本被设计为桌面系统,现在广泛应用于服务器领域.而更大的影响在于它正逐渐的应用于嵌入式设备.uClinux正是在这种氛围下产生的.在uClinux这个英文单词中u表示Micro,小的意思,C表示Control,控制的意思, ...

  • 开发一个最简单的"操作系统"全过程
  • 开发一个最简单的"操作系统"全过程 "FC简单"引导扇区初探 v0.1 =========================== 作者:Weichao Liu [写在前面gaga] 写一个PC 机的引导程序比我们想象的容易很多,事实上所需要了解的只是知道PC 机 ...