问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

linux 下的 nasm 用什么工具调试?或者说怎么做才能调试它,我用gdb不太会用,我想调试写出来的com文件

发布网友 发布时间:2022-04-27 00:26

我来回答

1个回答

热心网友 时间:2023-11-13 19:59

Linux 下调试汇编代码既可以用 GDB、DDD 这类通用的调试器,也可以使用专门用来调试汇编代码的 ALD(Assembly Language Debugger)。
从调试的角度来看,使用 GAS 的好处是可以在生成的目标代码中包含符号表(symbol table),这样就可以使用 GDB 和 DDD 来进行源码级的调试了。要在生成的可执行程序中包含符号表,可以采用下面的方式进行编译和链接:

[xiaowp@gary code]$ as --gstabs -o hello.o hello.s
[xiaowp@gary code]$ ld -o hello hello.o

执行 as 命令时带上参数 --gstabs 可以告诉汇编器在生成的目标代码中加上符号表,同时需要注意的是,在用 ld 命令进行链接时不要加上 -s 参数,否则目标代码中的符号表在链接时将被删去。
汇编程序员通常面对的都是一些比较苛刻的软硬件环境,短小精悍的ALD可能更能符合实际的需要,因此下面主要介绍一下如何用ALD来调试汇编程序。首先在命令行方式下执行ald命令来启动调试器,该命令的参数是将要被调试的可执行程序:

[xiaowp@gary doc]$ ald hello
Assembly Language Debugger 0.1.3Copyright (C) 2000-2002 Patrick Alken
hell ELF Intel 80386 (32 bit), LSB, Executable, Version 1 (current)
Loading debugging symbols...(15 symbols loaded)
ald>

当 ALD 的提示符出现之后,用 disassemble 命令对代码段进行反汇编:

ald> disassemble -s .text
Disassembling section .text (0x08048074 - 0x08048096)
08048074 BA0F000000 mov edx, 0xf
08048079 B998900408 mov ecx, 0x8049098
0804807E BB01000000 mov ebx, 0x1
08048083 B804000000 mov eax, 0x4
08048088 CD80 int 0x80
0804808A BB00000000 mov ebx, 0x0
0804808F B801000000 mov eax, 0x1
08048094 CD80 int 0x80

上述输出信息的第一列是指令对应的地址码,利用它可以设置在程序执行时的断点:

ald> break 0x08048088
Breakpoint 1 set for 0x08048088

断点设置好后,使用 run 命令开始执行程序。ALD 在遇到断点时将自动暂停程序的运行,同时会显示所有寄存器的当前值:

ald> run
Starting program: hello
Breakpoint 1 encountered at 0x08048088
eax = 0x00000004 ebx = 0x00000001 ecx = 0x08049098 edx = 0x0000000Fesp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000
ds = 0x0000002B es = 0x0000002B fs = 0x00000000 gs = 0x00000000
ss = 0x0000002B cs = 0x00000023 eip = 0x08048088 eflags = 0x00000246
Flags: PF ZF IF
08048088 CD80 int 0x80

如果需要对汇编代码进行单步调试,可以使用 next 命令:

ald> next
Hello, world!
eax = 0x0000000F ebx = 0x00000000 ecx = 0x08049098 edx = 0x0000000Fesp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000
ds = 0x0000002B es = 0x0000002B fs = 0x00000000 gs = 0x00000000
ss = 0x0000002B cs = 0x00000023 eip = 0x0804808F eflags = 0x00000346
Flags: PF ZF TF IF
0804808F B801000000 mov eax, 0x1

若想获得 ALD 支持的所有调试命令的详细列表,可以使用 help 命令:

ald> help
Commands may be abbreviated.
If a blank command is entered, the last command is repeated.
Type `help <command>'' for more specific information on <command>.
General commands
attach clear continue detach disassemble
enter examine file help load
next quit register run set
step unload window write
Breakpoint related commands
break delete disable enable ignore
lbreak tbreak
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
社会消费品零售总额反映什么问题社会消费品零售总额反映什么 我的头发发质很软 不想每天做头发 是烫发根还是怎么 就能让头发蓬起来... ...的时候如果想让软化完头顶的头发能蓬起来一些,应该可以做到吧?那... 我拿建设银行卡在邮政夸行转给农业银行可不可以 ...银行卡在自助取款机上可不可以跨行转账到农业银行卡上。可以的话手 ... 邮政银行卡转农业银行卡帐号怎么转(在自动取款上转) 邮政卡自助取款机内给外省农业银行卡转账需要多久到账 请问广州D1857在广州哪个站 薄壁不锈钢管什么型号的氩弧焊机能焊 韶关常年平均温度是多少 c-free怎么看进程 gdb调试中怎么查看其中一行的汇编代码 iar disassemble 其中的每列各代表什么意思? 用c-free5.0编译一个C程序后,如何用c-free查看这个程序的反汇编代码呢?像OD一样查看 如何快速查看将C反汇编的代码 GDB如何显示以下内容?我输入R,显示断点,但未显示LEGEND及以下内容,_百度问一问 如何鉴别建盏是否添加过化学原料 (Linux)很多程序在运行时需要指定运行时参数,那么如何在gdb中设置... CPU和CPUID是什么关系? linux里文件如何进行文件脱壳 文档转换为pdf 怎么转换pdf文档 苹果手机怎么修改点不进去 苹果手机怎么改? 爱吹牛,说自己有很能力特别强,自己狂妄是躁狂症的表现吗?这种精神症重庆歌乐山精神病医院能治吗? 苹果手机的微信怎么修改 喜欢吹牛的人是什么心理 苹果手机怎么改? 男朋友特别爱吹牛逼。显得自己很厉害? 苹果手机怎么改第二次 鬼泣HD合集是不是不管哪个平台都没有中文版? 鬼泣3特别版PC和PS3都有中文吗? 鬼泣4只有PC ps4鬼泣hd怎么设置中文啊,哪位大佬知道 鬼泣HD和鬼泣4有中文版吗 我想入手鬼泣HD合集版,请问这个有中文的吗? 什么时候有中文版的鬼泣合集HD 鬼泣hd是什么东西 深圳有几个区?哪个区租房比较安全? 如何评价《鬼泣HD》这款游戏? 深圳哪个区的房子比较便宜 深圳哪个区房比较好? 为什么鬼泣hd不能用win10玩? 关东煮&#xF362;如何做? 深圳买房哪个区比较好? 鬼泣系列有几部游戏? 鬼泣:HD合集的介绍 鬼泣HD配置要求介绍 鬼泣HD配置要求高吗 想要在深圳买房,买哪个区比较好 鬼泣HD合集中的1,2,3和原版的1,2,3有何不同?除了画面 在深圳,在哪个区好啊,要去找工作,刚毕业哦。哪个区房子租便宜,工作又好找呢?? 鬼泣HD合集出了吗?