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
如果转载请注明来源,如有错误之处,请及时指出。
分享到:
相关推荐
(依照实验内容,逐条撰写实验过程与实验所得结果:包括程序总体设计,核心数据结构及算法流程,调试过程。请附上核心代码,及注意格式排版的美观。实验提交时,以上为评分依据,请不删除本行) 程序总体设计 核心...
(2)掌握在LC-3仿真平台下汇编语言代码的设计输入和调试过程。 (3)掌握利用汇编语言解决问题的思路,加深对底层硬件的理解。 试验问题: 1)程序起始地址 x3000 2)在x4000处开始存放16个学生成绩,成绩为0~100的...
可能是最快的算法alpha-blend汇编源代码,排序算法数据结构.doc
MATLAB-遗传算法-多车场-开放式-带时间窗-多商品-VRP问题,解压后直接运行。MATLAB-遗传算法-多车场-开放式-带时间窗-多商品-VRP问题,解压后直接运行。
数据结构,算法与应用 ---C++语言描述(代码与习题答案)数据结构,算法与应用 ---C++语言描述(代码与习题答案)
粒子群算法及其工业应用-钱锋著,是本电子书,讲解的比较详细
代码是关于神经网络中BP算法的程序,没有调库。根据公式写的算法。数据集是鸢尾花数据集,直接运行main文件,即可看到实验结果。 pre函数为预测函数。
本资源采用标准粒子群算法对3-5-3多项式进行轨迹优化,目标函数为时间最优,程序为matlab代码,仅供学习参考
国科大-算法设计与分析-卜东波-2017-2018期末考试试卷国科大-算法设计与分析-卜东波-2017-2018期末考试试卷
第四章 MCS-51汇编语言程序设计第四章 MCS-51汇编语言程序设计4.1 汇编语言程序设计概述单片机原理及系统设计单片机原理及系统设计汇编语言和高级语言的
DES算法的汇编语言程序,包括算法描述及功能实现!
包含空间谱估计理论与算法(王永良)课本对应各章的matlab程序 MATLAB程序:第2章_空间谱估计基础; 第3章_线性预测算法;第4章_多重信号分类算法;第5章_最大似然及子空间拟合算法;第6章_旋转不变子空间算法;第7...
MATLAB 智能算法超级学习手册-程序代码
数据结构算法与应用--C++语言描述(代码与习题答案)!!
ECC算法校验工具ECC算法校验工具ECC算法校验工具
8086汇编语言程序设计汇编源码,实现排序算法演示器(冒泡排序,插入排序,选择排序),可以循环输入,输入0则将数组元素直接输出,并以逗号间隔;输入1则使用冒泡排序,输入2使用插入排序,输入3使用选择排序,输入...
易语言16轮TEA加密算法汇编教程
采用wK算法处理RADARSAT-1的数据,核心代码未公开。成像效果见http://blog.csdn.net/Destiny0321/article/details/65448250
header.asm:汇编的主要头文件,包含了一些通用的宏和变量声明,其中有调试用的宏DEBUG_INFO,这个需要有Irvine16.inc,此文件包含在Intel汇编语言程序设计里。要用调试的话,在汇编的时候加上DEBUG的宏定义就可以。...