Почему вы пишете 16-битный код, который делает системные вызовы DOS? Если вы хотите узнать, как написать 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
Что согласно тому, что я вижу здесь , равно exit(0)
. Вам не нужно менять bx
либо ...
Но. Это даже не относится к тому, что вы пытались сделать, потому что Mac OS X не является MS-DOS, не знает об API DOS, не может запускать файлы .COM
и т. Д. Я даже не знал, что он может работать 16-битный код. Вы захотите взглянуть на опцию -f elf
в nasm и захотите использовать регистры, такие как <b>e</b>ax
вместо 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. На многих платформах вашей точкой входа является символ _start
, и вы делаете системные вызовы с int 80h
или sysenter
.
Что касается отладки ... Я бы также предложил GDB. Вы можете перейти с помощью одной команды с помощью stepi
, и команда info registers
выведет состояние регистра. Команда disassemble
также полезна.
Обновление: Только что вспомнил, я не думаю, что Mac OS X использует ELF ... Ну ... Многое из того, что я написал, все еще применимо. : -)