2009-11-18 70 views
4

所以我想知道是否有任何?我知道afd在Windows上,但不知道什麼關於mac?是否有OS X的彙編語言調試器?

這他如何我使用納薩姆以下代碼: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 

在Windows上,我知道一個調試器名稱AFD這幫助我逐句通過每個語句,但不知道我如何使用gdb做到這一點。

既不能執行這個.com文件,我應該在這裏做一些其他的文件?

回答

10

你爲什麼要寫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 80hsysenter進行系統調用。

至於調試...我也建議GDB。您可以使用stepi的單個指令前進,並且info registers命令將轉儲寄存器狀態。 disassemble命令也很有幫助。

更新:只記得,我不認爲Mac OS X使用ELF ...嗯..我寫的很多東西仍然適用。:-)

+0

我認爲我正在使用的這本書主要是爲DOS編寫的,我已經檢查過我如何在Mac上使用它。無論如何,這是有幫助的。 – itsaboutcode 2009-11-18 18:45:17

+1

我建議你使用DOSBox http://www.dosbox.com/來玩DOS東西,儘管你需要得到一個DOS編譯器和一個DOS調試器。 – 2009-11-18 19:02:59

+0

OS X使用mach-o而非elf對象格式。 =) – 2009-11-19 16:48:04

7

XCode附帶GNU調試器GDB

0

IDA Pro在時尚後仍能在Mac上工作(UI仍在Windows上運行;請參閱an example)。

1

正如其他人所說的,使用gnu調試器GDB。在調試彙編源,我通常發現用於加載包含類似於下面的一個命令文件:

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

display/5i將顯示5個指令開始與將要執行的下一個。您可以使用stepi命令逐步執行一條指令。 display/x $eax以十六進制顯示eax寄存器的內容。您也可能想要使用x命令來檢查內存的內容:x/x $eax,例如,打印其地址存儲在eax中的內存的內容。

這些是許多命令中的一部分。下載GDB手冊並瀏覽它以查找您可能有興趣使用的其他命令。