2014-07-12 2 views
-1

어셈블리 루프 명령어를 연구 한 후. OS X에서 작동하는지 여부를 테스트하고 싶습니다.

.data 
output: 
    .asciz "The value is: %d\n" 
.text 
.globl _main 
_main: 
    movq $0xffffffff, %rcx 
    movq $0, %rax 
loop1: 
    addq %rcx, %rax 
    loop loop1 
done: 
    subq $8, %rsp 
    leaq output(%rip), %rdi 
    movq %rax, %rsi 
    call _printf 
    addq $8, %rsp 

    subq $8, %rsp 
    movq $0, %rdi 
    call _exit 

이 코드 단편은 정확하게 올바르게 작동합니다. 그러나 lldb를 사용하여 단계별로 테스트했을 때 이상한 메시지가 쏟아졌습니다. lldb가 인쇄되었습니다.

a.out`___lldb_unnamed_function1$$a.out: 
-> 0x1fa4: addq %rcx, %rax 
    0x1fa7: loop 0x1fa4     ; ___lldb_unnamed_function1$$a.out 

a.out`done at main_64.s:16: 
    0x1fa9: subq $0x8, %rsp 
    0x1fad: leaq 0x6c(%rip), %rdi   ; output 

무엇이 잘못 되었나요? 루프 명령을 지원하지 않습니까?

또한 %rcx==0x2 일 때 주소 0x1fa4에 중단 점을 설정하기 위해 br s -a 0x1fa4 -c '$rcx==0x2'을 사용했지만 프로그램을 다시 계속 한 후 lldb가 제어 불능 상태였습니다. 프롬프트가 즉시 인쇄되었고 CPU가 높게 나타났습니다. 나는 p/x $rcx을 입력하려고했지만 아무 것도 얻지 못했습니다. 누가 무슨 일이 일어 났는지 말해 줄 수 있니? 고마워요!

답변

1

___lldb_unnamed_function1 기호 정보가 누락 된 것 같습니다. 오류 메시지가 아닙니다. 이 문제를 해결하려면 디버깅 옵션을 사용하여 어셈블리 소스를 컴파일하십시오.

설정 한 중단 점은 RCX0x2이되었을 때만 실행을 중지 할 조건이 있습니다. CPU가 많이 감소했기 때문에 CPU가 높았고 RCX이 0이 된 후에 프로세서는 다음 명령을 계속 수행했습니다.

+0

답변 해 주셔서 감사합니다. –