`
deepfuture
  • 浏览: 4400205 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80067
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70036
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103338
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:285761
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15005
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67553
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32135
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45982
社区版块
存档分类
最新评论

算法下午茶系列-重温汇编(2)[调试汇编]

 
阅读更多

 Linux 平台的标准汇编器是 GAS,它是 GCC 所依赖的后台汇编工具,通常包含在 binutils 软件包中,

--gstabs 告诉汇编器在生成的目标代码中加上符号表,我们首先完成汇编: 

as -gstabs -o hello.o hello.s

汇编器产生的目标代码必须经过链接器的处理才能生成可执行代码 ,Linux 使用 ld 作为标准的链接程序,它同样也包含在 binutils 软件包中。我们接着进行链接:

 ld -o hello hello.o

有了符号表,我们就好进行调试。

先运行一下,看看效果:

 ./hello

hello,world

ABCD

GDB做为LINUX程序员的一个重要的调试工具,同样适用于汇编编写的程序,我们用GDB对上面代码进行一些简单的调试操作

首先打开hello程序:

 gdb hello

 

GNU gdb (GDB) 7.1-ubuntu

Copyright (C) 2010 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

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 "x86_64-linux-gnu".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>...

Reading symbols from /home/deepfuture-lx/private/mytest/hello...done.

然后,我们可以使用list命令列出源代码

(gdb) list

1 .section .data#初始化的变量

2 output:

3   .ascii "hello,world\n"

4   #要打印的字符串,.data为初始化值的变量。output是标签,指示字符串开始的位置,ascii为数据类型

5 .section .bss#未初始化的变量,由0填充的缓冲区

6   .lcomm num,20

7   #lcomm为本地内存区域,即本地汇编外的不能进行访问。.comm是通用内存区域。

8 .section .text#汇编语言指令码

9   .globl _start#启动入口

10   _start:

 

使用break命令设置断点

(gdb) break 17

Breakpoint 1 at 0x4000c6: file hello.s, line 17.

运行至断点

(gdb) run

Starting program: /home/deepfuture-lx/private/mytest/hello 

hello,world

 

Breakpoint 1, _start () at hello.s:17

继续运行下条语句

17   movl $0,%eax

(gdb) next

18   movl $num,%edi

 

显示所有寄存器的值

(gdb) info registers

rax            0x0 0

rbx            0x1 1

rcx            0x60011c 6291740

rdx            0xc 12

rsi            0x0 0

rdi            0x0 0

rbp            0x0 0x0

rsp            0x7fffffffe2d0 0x7fffffffe2d0

r8             0x0 0

r9             0x0 0

r10            0x0 0

r11            0x0 0

r12            0x0 0

r13            0x0 0

r14            0x0 0

r15            0x0 0

rip            0x4000cb 0x4000cb <_start+27>

eflags         0x202 [ IF ]

cs             0x33 51

ss             0x2b 43

ds             0x0 0

es             0x0 0

fs             0x0 0

---Type <return> to continue, or q <return> to quit---

gs             0x0 0

(gdb) next

19   movl $65,1(%edi)#A 的ascii

 

按十六进制格式输出edi寄存器的值。/x表示16进制,/d表示10进制,/t表示二进制

(gdb) print/x $rdi

$3 = 0x600128

继续运行

(gdb) next

20   movl $66,2(%edi)#B 的ascii 

 

显示某个内存位置的值,x/nyz,其中n为字段数,y为格式(c为字符,d为10进制,x为16进制),z为字段长度(b为字节,n为16位字,w为32位字)

(gdb) next

21   movl $67,3(%edi)#C 的ascii 

(gdb) x/3cb &num

0x600128 <num>: 0 '\000' 65 'A' 66 'B'

(gdb) next

22   movl $68,4(%edi)#D 的ascii

(gdb) next

23   movl $10,5(%edi)#\n的ascii 

(gdb) next

25   movl $4,%eax#调用的系统功能,4为write    

(gdb) x/4cb &num

0x600128 <num>: 0 '\000' 65 'A' 66 'B' 67 'C'

退出gdb

(gdb)quit

 

 如果转载请注明来源,如有错误之处,请及时指出。

 

分享到:
评论

相关推荐

    可能是最快的算法alpha-blend汇编源代码,排序算法数据结构.doc

    可能是最快的算法alpha-blend汇编源代码,排序算法数据结构.doc

    计算机系统1-汇编语言实验.docx

    本文档是关于计算机系统的汇编语言实验报告,旨在通过 LC-3 汇编语言设计实现相关程序,熟悉和理解 LC-3 的汇编语言指令格式,并掌握在 LC-3 仿真平台下汇编语言代码的设计输入和调试过程。 知识点1:汇编语言基础 ...

    做好的沈美明主编IBM-PC汇编实验详细报告

    2. **实验环境**:包括使用的硬件平台(如IBM-PC兼容机)、软件工具(如汇编器、链接器、调试器)等。 3. **基础知识**:可能涵盖汇编语言的基本语法,如指令集、寄存器使用、数据类型和操作符等。 4. **实验内容*...

    IBM-PC汇编语言程序设计

    7. **调试与反汇编**:了解使用汇编语言调试工具,如DEBUG,以及如何将机器码反汇编回汇编语言代码。 8. **高级主题**:书中可能还会涉及高级汇编技术,如宏指令、自定义汇编器宏、堆栈操作、动态内存分配、多任务...

    汇编语言-使用汇编实现的飞机大战小游戏-纯汇编实现.zip

    汇编程序的调试相对复杂,因为没有高级语言那样丰富的调试工具。开发者可能需要借助单步执行、查看内存、设置断点等手段进行调试。此外,由于游戏的交互性和随机性,测试工作也显得尤为重要。 通过这个汇编语言实现...

    实验报告-实验二-熟悉汇编程序建立及其调试方式.docx

    实验报告的主题是“实验二-熟悉汇编程序建立及其调试方式”,主要目的是让学习者掌握汇编语言的编程环境设置、程序编写以及调试技巧。在描述中,虽然没有具体的内容,但可以推断该实验涉及了汇编语言的上机实践,...

    清风汇编-易语言汇编学习.rar

    2. **钩子技术**:通过汇编实现函数钩子,可以拦截游戏的特定函数调用,插入自定义代码,达到改变游戏行为的目的。 3. **速度优化**:对于计算密集型的代码段,如碰撞检测、AI算法,汇编可以编写出高效且运行速度快...

    Ubuntu下的x86-64汇编(x86-64 Assembly Language with Ubuntu)

    - **核心概念**:编写汇编语言程序需要熟悉一系列开发工具,包括编译器、链接器等。 - **实际应用**:通过亲手编写和调试汇编程序,可以增强对整个编译过程的理解。 - **1.3.3 提高算法开发技能** - **核心概念**...

    IBM-PC 汇编语言程序设计(第五版)Peter Abel著 沈美名等译

    9. **调试和优化**:汇编语言程序员需要掌握调试技巧,如使用DEBUG工具或集成开发环境(IDE)来检查内存、跟踪程序执行。同时,优化汇编代码以提高性能也是重要的技能。 除了书本内容,提供的压缩包文件中可能包含...

    [CH04]MCS-51汇编语言程序设计1

    第四章 MCS-51汇编语言程序设计主要探讨了如何使用汇编语言来编写针对MCS-51系列单片机的程序。汇编语言是一种低级编程语言,它的指令直接对应于计算机的机器指令,因此对于单片机的硬件控制具有很高的效率。相比...

    《粒子群算法及其工业应用-钱锋著pdf

    粒子群算法及其工业应用-钱锋著,是本电子书,讲解的比较详细

    IBM-PC汇编语言实验报告有源代码

    这个实验旨在帮助学生深入理解汇编语言编程,掌握IBM-PC架构下汇编语言的设计、编写、调试和运行过程。 一、实验方法 在汇编语言编程中,实验方法通常包括使用特定的编程工具,如字处理程序(如WordStar或记事本)...

    IBM-PC汇编语言程序设计第二版

    4. 编程技术:解释如何用汇编语言实现各种算法和程序结构,比如循环、分支、子程序、宏指令等。 5. 高级概念:探讨更高级的汇编编程概念,比如中断处理、多任务处理、内存管理和优化技术。 6. 实例和练习:提供...

    第六节-汇编语言程序设计-讲课内容一概述-编写汇编语言程优秀文档.ppt

    2. 确定解决模型的算法 3. 按算法画出程序流程图 4. 按流程图编写程序 5. 上机调试,运行程序 二、判断程序质量的标准 判断程序质量的标准包括: 1. 程序的正确性 2. 程序的可读性 3. 程序的执行时间 4. 程序所占...

    4-01 汇编语言编程概述.zip

    此外,资料可能还会讨论汇编语言的调试技巧和反汇编技术,这些都是成为熟练汇编程序员必不可少的技能。 总的来说,汇编语言编程虽然挑战重重,但其深度和实用性使其成为每一个计算机专业人士的宝贵知识库。无论你是...

    DES算法的汇编语言程序

    在汇编语言中实现DES算法,可以充分利用位操作指令,使得位操作更为便捷。8031系列微控制器具有16个可位寻址的寄存器,可以用来存放128位数据,从而实现DES的转置功能。对于迭代运算和循环控制,虽然相对复杂,但是...

    破解软件教程入门篇2--汇编语言[定义].pdf

    2. **高效性**:汇编语言编写的程序通常运行速度较快,因为它们直接对应硬件操作,没有中间层解释。同时,生成的可执行文件体积小,适合编写小巧高效的程序。 3. **复杂性**:虽然汇编语言提高了可读性,但相比高级...

    算法技术概述,汇编

    【算法技术概述,汇编】 在信息技术领域,算法扮演着至关重要的角色,它们是解决问题和优化任务的关键工具。本文将探讨几种重要的算法类型,包括统计分析类算法、聚类算法和分类算法,以及它们在实际问题中的应用。...

    空间谱估计理论与算法------程序.rar

    包含空间谱估计理论与算法(王永良)课本对应各章的matlab程序 MATLAB程序:第2章_空间谱估计基础; 第3章_线性预测算法;第4章_多重信号分类算法;第5章_最大似然及子空间拟合算法;第6章_旋转不变子空间算法;第7...

Global site tag (gtag.js) - Google Analytics