views:

394

answers:

5

So i was wondering if there is any? I know afd on windows but not sure anything about mac?

And this his how i am using nasam on the following code: 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

On windows i know a debugger name afd which help me to step through each statement but not sure how i can do this using gdb.

And neither i am able to execute this .com file, am i supposed to make some other file here?

+6  A: 

XCode ships with GDB, the GNU Debugger.

DrJokepu
A: 

IDA Pro does work on the Mac after a fashion (UI still runs on Windows; see an example).

Nicholas Riley
+7  A: 

Why are you writing 16-bit code that makes DOS syscalls? If you want to know how to write asm that's applicable to your OS, take a look the code generated by "gcc -S" on some C code... (Note that code generated this way will have operands reversed, and is meant to be assembled with as instead of nasm)

Further, are you aware what this code is doing? It reads to me like this:

ax = 5
bx = 10
ax += bx
bx = 15
ax += bx
ax = 0x4c00
int 21h

Seems like this code is equivalent to:

mov bx, 15
mov ax, 4c00
int 21h

Which according to what I see here, is exit(0). You didn't need to change bx either...

But. This doesn't even apply to what you were trying to do, because Mac OS X is not MS-DOS, does not know about DOS APIs, cannot run .COM files, etc. I wasn't even aware that it can run 16 bit code. You will want to look at nasm's -f elf option, and you will want to use registers like eax rather than ax.

I've not done assembly programming on OS X, but you could theoretically do something like this:

extern exit
global main
main:
    push dword 0
    call exit

    ; This will never get called, but hey...
    add esp, 4
    xor eax, eax
    ret

Then:

nasm -f elf foo.asm -o foo.o
ld -o foo foo.o -lc

Of course this is relying on the C library, which you might not want to do. I've omitted the "full" version because I don't know what the syscall interface looks like on Mac. On many platforms your entry point is the symbol _start and you do syscalls with int 80h or sysenter.

As for debugging... I would also suggest GDB. You can advance by a single instruction with stepi, and the info registers command will dump register state. The disassemble command is also helpful.

Update: Just remembered, I don't think Mac OS X uses ELF... Well.. Much of what I wrote still applies. :-)

asveikau
I think the book which i am using is written primarily for DOS, i have check out how i can use it on mac. Thanks anyway it was helpful.
itsaboutcode
I suggest you use DOSBox http://www.dosbox.com/ for playing around with DOS stuff, although you'll need to get a DOS compiler and a DOS debugger too.
Adam Rosenfield
OS X uses the mach-o, not elf, object format. =)
Stephen Canon
+1  A: 

As others have said, use GDB, the gnu debugger. In debugging assembly source, I usually find it useful to load a command file that contains something like the following:

display/5i $pc
display/x $eax
display/x $ebx
...

display/5i will display 5 instructions starting with the next to be executed. You can use the stepi command to step execution one instruction at a time. display/x $eax displays the contents of the eax register in hex. You will also likely want to use the x command to examine the contents of memory: x/x $eax, for example, prints the contents of the memory whose address is stored in eax.

These are a few of many commands. Download the GDB manual and skim through it to find other commands you may be interested in using.

Stephen Canon
A: 

i dowloded an afd debugger but it is for 32 bit and in window 7 its not working so kindly help me

john