2009-11-18 5 views
4

그래서 나는 무엇이 있는지 궁금해하고 있었습니까? 나는 창문에 afd하지만 맥에 대해 아무것도 몰라?OS X 용 어셈블리 언어 디버거가 있습니까?

그리고이 그의 방법은 다음 코드에 nasam을 사용하고 있습니다 : 내가하는 데 도움이 디버거 이름 AFD을 알고 창에

[org 0x100] 
mov ax, 5 
mov bx, 10 
add ax, bx 
mov bx, 15 
add ax, bx 
mov ax, 0x4c00 
int 0x21 

a.lst NASM a.asm -o a.com -l 각 문을 단계별로 실행하지만 gdb를 사용하여 어떻게 수행 할 수 있는지 잘 모르겠습니다.

이 .com 파일을 실행할 수 없으며 여기에 다른 파일을 만들어야하나요?

답변

10

DOS 시스템 호출을하는 16 비트 코드를 작성하는 이유는 무엇입니까? 자신의 OS에 해당하는 asm을 작성하는 방법을 알고 싶다면 일부 C 코드에서 "gcc -S"으로 생성 된 코드를 살펴보십시오 (이 방법으로 생성 된 코드는 피연산자가 반대로되어 어셈블됩니다. nasm 대신 as으로 표시됩니다.

이 코드의 기능을 알고 있습니까? 그것은이 같은 날에 읽는 : 나는 here를 참조 내용에 따라, exit(0)

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

어느 :이 코드는 동일합니다 같은

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

이 보인다. bx을 변경할 필요가 없습니다.

하지만. Mac OS X은 MS-DOS가 아니고, 도스 API에 대해 모르거나, .COM 파일을 실행할 수 없기 때문에, 심지어는 16 비트를 실행할 수 있다는 것을 알지 못했기 때문에 암호. nasm의 -f elf 옵션을보고 싶은데 ax 대신 eax과 같은 레지스터를 사용하고 싶을 것입니다.

내가 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 

:이 C 라이브러리에 의존 물론

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

을, 너는 그러고 싶지 않을지도 모른다. 필자는 Mac에서 syscall 인터페이스가 어떤 모습인지 모르기 때문에 "전체"버전을 생략했습니다. 많은 플랫폼에서 엔트리 포인트는 _start이며, 시스템 콜은 int 80h 또는 sysenter입니다.

디버깅은 ... GDB를 제안합니다. stepi을 사용하여 단일 명령으로 진행할 수 있으며 info registers 명령은 레지스터 상태를 덤프합니다. disassemble 명령도 유용합니다.

업데이트 : Mac OS X이 ELF를 사용한다고 생각하지 않습니다. 글쎄요 ... 내가 썼던 대부분은 여전히 ​​적용됩니다.:-)

+0

제가 사용하는 책은 주로 DOS 용으로 작성된 것으로 생각합니다. Mac에서 어떻게 사용할 수 있는지 확인해 보았습니다. 어쨌든 덕분에 도움이되었습니다. – itsaboutcode

+1

나는 도스 박스를 http://www.dosbox.com/와 함께 사용하는 것이 좋습니다. 도스 컴파일러와 DOS 디버거도 필요합니다. –

+0

OS X은 elf가 아닌 mach-o 형식을 사용합니다. =) –

7

XCode는 GDB 인 GNU 디버거와 함께 제공됩니다.

0

IDA Pro은 패션 후에도 작동합니다 (UI는 여전히 Windows에서 실행되며, an example 참조).

1

다른 사람들이 말했듯이, gnu 디버거 인 GDB를 사용하십시오.

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

display/5i이 실행 될 다음으로 시작하는 5 개 지시 사항을 표시합니다 : 어셈블리 소스를 디버깅, 난 보통 유용한 다음과 같은 것을 포함하는 명령 파일을로드 찾을 수 있습니다. stepi 명령을 사용하면 한 번에 한 명령 씩 실행할 수 있습니다. display/x $eax은 eax 레지스터의 내용을 16 진수로 표시합니다. x 명령을 사용하여 메모리의 내용을 검사 할 수도 있습니다. 예를 들어 x/x $eax은 주소가 eax에 저장된 메모리의 내용을 인쇄합니다.

다음은 많은 명령 중 일부입니다. GDB 매뉴얼을 다운로드하고 그것을 훑어보고 사용하고자하는 다른 명령을 찾으십시오.