你为什么要写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 80h
或sysenter
进行系统调用。
至于调试...我也建议GDB。您可以使用stepi
的单个指令前进,并且info registers
命令将转储寄存器状态。 disassemble
命令也很有帮助。
更新:只记得,我不认为Mac OS X使用ELF ...嗯..我写的很多东西仍然适用。:-)
我认为我正在使用的这本书主要是为DOS编写的,我已经检查过我如何在Mac上使用它。无论如何,这是有帮助的。 – itsaboutcode 2009-11-18 18:45:17
我建议你使用DOSBox http://www.dosbox.com/来玩DOS东西,尽管你需要得到一个DOS编译器和一个DOS调试器。 – 2009-11-18 19:02:59
OS X使用mach-o而非elf对象格式。 =) – 2009-11-19 16:48:04