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

算法下午茶系列-重温汇编(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

 

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

 

分享到:
评论

相关推荐

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

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

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

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

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

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

    汇编语言代码大全--精通汇编

    8. **调试技巧**:学会使用汇编级别的调试工具,如GDB,能帮助你更深入地理解程序的执行流程和问题所在。 在《汇编语言代码大全》中,你可以找到各种各样的实例,涵盖了上述知识点的不同方面。通过阅读和运行这些...

    IBM-PC汇编语言程序设计

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

    天书夜读--汇编语言

    2. **1-2 循环** - **循环结构分析**:通过对循环的汇编代码进行解读,帮助理解循环是如何实现的。 - **优化技巧**:介绍了一些常见的循环优化方法,比如循环展开等。 3. **1-3 判断与分支** - **条件判断指令**...

    IBM-PC 汇编语言课后答案

    根据给定文件的信息,我们可以提炼出关于IBM-PC汇编语言程序设计的多个知识点,主要围绕着《IBM-PC汇编语言程序设计》第二版教材(清华大学沈美明版)中的概念、指令以及编程实践。以下是对这些知识点的详细解析: ...

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

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

    MATLAB-遗传算法-多车场-开放式-带时间窗-多商品-VRP问题

    《MATLAB实现遗传算法解决多车场开放式时间窗多商品VRP问题详解》 在物流配送、资源调度等领域,车辆路径规划(Vehicle Routing Problem, VRP)问题是一个经典的优化问题,它涉及到如何有效地安排车辆从一个或多个...

    4-03 汇编语言源程序的汇编.zip

    2. **汇编过程** - **汇编器**:它是将汇编语言源程序转换成机器语言的目标代码的工具。 - **源程序**:用汇编语言编写的程序,包含指令和伪指令。 - **目标代码**:经过汇编器处理后的中间结果,以二进制形式...

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

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

    SUN 公司内部培训资料 IA-32 汇编语言手册

    汇编语言程序由一系列指令组成,每条指令对应于机器语言中的一个或多个字节。指令通常包含操作码(表示操作类型)和操作数(表示数据或地址)。例如,在 IA-32 架构下,“mov eax, 1”这条指令表示将数值 1 移动到...

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

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

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

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

    e语言-易语言16轮TEA加密算法汇编教程

    本教程聚焦于16轮TEA(Tiny Encryption Algorithm)加密算法的汇编实现。 TEA加密算法是由David Wheeler和John Kelsey在1994年提出的,它是一种简单的块加密算法,适用于快速计算和微控制器。TEA的基本思想是通过对...

    IBM-PC汇编语言程序设计答案

    这些技能是编写和调试汇编程序的基础,也是深入理解计算机底层工作原理的基石。在编程实践中,这些基础技能对于优化代码性能、解决低级问题、进行系统开发等都具有极其重要的意义。 综上所述,《IBM-PC汇编语言程序...

    crc-8-16汇编程序

    在汇编语言中实现CRC-8,我们需要定义这个生成多项式,并通过一系列位操作(如移位和异或)来计算校验和。 CRC-16则提供更强的校验能力,适用于更复杂的数据传输环境,例如以太网帧的校验。它使用16位的生成多项式...

    DES算法的汇编语言程序

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

    learn-assembly-language-汇编语言资源

    汇编语言的学习资源通常包括语言基础、指令集、汇编过程、调试技巧等内容。 在提供的压缩包文件中,包含了三个文件:“LICENSE”,“readme.txt”和“笔记-汇编语言程序设计”。这些文件可能涵盖了汇编语言学习资源...

    易语言adler32算法汇编

    学习和理解易语言中的adler32算法汇编源码,不仅可以提升你在易语言编程方面的技能,还能加深对校验和算法的理解,以及对汇编语言如何与高级语言结合使用的认识。这对于系统级编程和性能优化工作非常有帮助。在实际...

Global site tag (gtag.js) - Google Analytics