为什么要编写调用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
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 80h
或sysenter
进行系统调用。
至于调试... 我也建议使用GDB。您可以用stepi
单步执行指令,info registers
命令将转储寄存器状态。disassemble
命令也很有用。
更新:刚刚想起来,我不认为Mac OS X会使用ELF格式... 好吧.. 我写的大部分内容仍然适用。 :-)