2009-11-18 32 views
4

所以我想知道是否有任何?我知道afd在Windows上,但不知道什么关于mac?是否有OS X的汇编语言调试器?

这他如何我使用纳萨姆以下代码: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文件,我应该在这里做一些其他的文件?

回答

10

你为什么要写16位代码,使DOS系统调用?如果您想知道如何编写适用于您的操作系统的asm,请查看一些C代码中由“gcc -S”生成的代码...(请注意,以此方式生成的代码将使操作数反转,并且要组装用as代替nasm

此外,你是否知道这段代码在做什么?它读给我这个样子:

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

好像这段代码等同于:

mov bx, 15 
mov ax, 4c00 
int 21h 

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

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

更新:只记得,我不认为Mac OS X使用ELF ...嗯..我写的很多东西仍然适用。:-)

+0

我认为我正在使用的这本书主要是为DOS编写的,我已经检查过我如何在Mac上使用它。无论如何,这是有帮助的。 – itsaboutcode 2009-11-18 18:45:17

+1

我建议你使用DOSBox http://www.dosbox.com/来玩DOS东西,尽管你需要得到一个DOS编译器和一个DOS调试器。 – 2009-11-18 19:02:59

+0

OS X使用mach-o而非elf对象格式。 =) – 2009-11-19 16:48:04

7

XCode附带GNU调试器GDB

0

IDA Pro在时尚后仍能在Mac上工作(UI仍在Windows上运行;请参阅an example)。

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手册并浏览它以查找您可能有兴趣使用的其他命令。