你爲什麼要寫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