所以我想知道是否有?我在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文件,我应该在这里制作一些其他文件吗?
答案 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
根据我看到的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 80h
或sysenter
进行系统调用。
至于调试......我也建议使用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)。