是否有OS X的汇编语言调试器?

时间:2009-11-18 18:00:10

标签: macos assembly debugging

所以我想知道是否有?我在Windows上知道afd,但对mac不确定吗?

这就是他如何在以下代码中使用nasam: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 个答案:

答案 0 :(得分:11)

为什么要编写使DOS系统调用的16位代码?如果您想知道如何编写适用于您的操作系统的asm,请查看“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

根据我看到的hereexit(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上的syscall界面是什么样的。在许多平台上,您的输入点是符号_start,您可以使用int 80hsysenter进行系统调用。

至于调试......我也建议使用GDB。您可以通过stepi的单个指令前进,info registers命令将转储寄存器状态。 disassemble命令也很有帮助。

更新:记住,我不认为Mac OS X使用ELF ......嗯......我写的大部分内容仍然适用。 : - )

答案 1 :(得分:7)

XCode附带了GDB,即GNU调试器。

答案 2 :(得分:1)

正如其他人所说,使用gnu调试器GDB。在调试程序集源代码中,我通常发现加载包含以下内容的命令文件很有用:

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

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

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

答案 3 :(得分:0)

IDA Pro可以在Mac上运行(UI仍在Windows上运行;请参阅an example)。