OS X有没有任何汇编语言调试器?

4

我想知道是否有适用于Mac的类似于Windows上的AFD的软件?

以下是我如何在代码中使用NASM:nasm a.asm -o a.com -l a.lst。

[org 0x100]
mov ax, 5
mov bx, 10
add ax, bx
mov bx, 15
add ax, bx
mov ax, 0x4c00
int 0x21 

在Windows操作系统中,我知道有一个名为“afd”的调试器,可以帮助我逐条执行语句,但我不确定如何在使用gdb时实现这一点。
而且我也无法执行此“.com”文件,我是否需要创建其他文件?
4个回答

11

为什么要编写调用DOS的16位代码?如果你想知道如何编写适用于你的操作系统的汇编代码,请查看一下由“gcc -S”生成的某些C代码的代码...(请注意,以这种方式生成的代码将反转操作数,应该使用as而不是nasm进行汇编)

此外,你知道这段代码在做什么吗?它给我的印象是:

ax = 5
bx = 10
ax += bx
bx = 15
ax += bx
ax = 0x4c00
int 21h

看起来这段代码等价于:

mov bx, 15
mov ax, 4c00
int 21h
根据我在这里看到的内容,退出程序的命令是exit(0)。你不需要改变bx。但这甚至与你试图做的事情无关,因为Mac OS X不是MS-DOS,不知道DOS API,不能运行.COM文件等。我甚至不知道它能否运行16位代码。你需要查看nasm的-f elf选项,并使用像eax这样的寄存器,而不是ax。我在OS X上没有做过汇编编程,但你理论上可以做这样的事情:
extern exit
global main
main:
    push dword 0
    call exit

    ; This will never get called, but hey...
    add esp, 4
    xor eax, eax
    ret

那么:

nasm -f elf foo.asm -o foo.o
ld -o foo foo.o -lc

当然,这依赖于C库,可能不是您想要做的。我省略了“完整”版本,因为我不知道Mac上的系统调用接口是什么样子的。在许多平台上,入口点是符号_start,您可以使用int 80hsysenter进行系统调用。

至于调试... 我也建议使用GDB。您可以用stepi单步执行指令,info registers命令将转储寄存器状态。disassemble命令也很有用。

更新:刚刚想起来,我不认为Mac OS X会使用ELF格式... 好吧.. 我写的大部分内容仍然适用。 :-)


我认为我正在使用的书主要是为DOS编写的,我已经查看了如何在Mac上使用它。无论如何,谢谢,这很有帮助。 - itsaboutcode
1
我建议您使用DOSBox http://www.dosbox.com/ 来玩弄DOS相关的东西,尽管您还需要获取一个DOS编译器和一个DOS调试器。 - Adam Rosenfield

7

Xcode自带GDB,即GNU调试器。
Xcode 4及更高版本则改为自带LLDB。


@JohnClements在2011年被LLDB取代,自Xcode 4以来如此。 - Cœur

1

正如其他人所说,使用GDB,即gnu调试器。在调试汇编源代码时,我通常发现加载一个包含以下内容的命令文件非常有用:

display/5i $pc
display/x $eax
display/x $ebx
...

display/5i 命令将显示下一个要执行的 5 条指令。您可以使用 stepi 命令逐条执行指令。 display/x $eax 命令以十六进制显示 eax 寄存器的内容。您还可能需要使用 x 命令来检查内存内容:x/x $eax,例如,打印存储在 eax 中地址的内存内容。

这些是许多命令中的一部分。下载 GDB 手册并浏览其中的内容,找到其他您可能感兴趣使用的命令。


0

IDA Pro 在 Mac 上也能运行,但是界面仍然需要在 Windows 上运行(可以参考一个例子)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接