2016-10-21 4 views
-1

NASM에서 코딩하는 동안 문제가 발생했습니다 (이 언어는 초보자입니다). 참조로 패스를 사용하고 있습니다. [ebp-2] (카운터 역할)의 값이 [ebp + 4] (사용자 번호)의 값과 같을 때 코드가 종료되어야합니다. 나는 'checked'가 5 번 인쇄되기를 기대하지만, 출력은 무한 루프이거나 n 번 인쇄 된 'checked'입니다. NASM 참조로 전달

문제가 일어나고있는 내 코드의 일부이다 :

find_prime: 
     mov ebp, esp 
     sub esp, 2 

     mov ecx, [ebp+4]  ;ecx contains address of ebp+4  
     mov word [ebp-2], 1 ;[ebp-2] as counter 

     while1_begin: 
      mov bx, [ebp-2] 
      cmp bx, [ecx]  ;check if bx < [ecx] 
      je terminate  ;if bx = [ecx] terminate 

      mov eax, 4 
      mov ebx, 1 
      mov ecx, pri  ;pri contains 'checked' 
      mov edx, priLen 
       int 80h 

      inc word [ebp-2] 
      jmp while1_begin 

     while1_end: 
      jmp terminate 

     add esp, 2 
     ret 4 
+1

'mov ecx, [ebp + 4]'는 ebp + 4의 값을 ecx로 이동합니다. 주소를 원한다면'lea ecx, [ebp + 4]'를 의미합니까? 이것이 최소의 예가 아니기 때문에 알기가 어렵습니다. 그 행에 대한 귀하의 의견은 약간 모호합니다. –

+0

당신은 이것이 지나가다고 말하지만 당신의 단어와 코드는 가치에 의한 것임을 나타냅니다. –

+0

'add/sub esp, 2' ... 나는 적어도 단어 4에 그것을 덧붙일 것이다. (단어 [ebp-2]에 접근하는 것은 아마 [ebp-4]라는 단어만큼이나 좋을 것이다. 경계 정렬). 정렬되지 않은 스택을 사용하는'int 80h '와 함께 작동한다면 아마 괜찮을 것이다 (또는 성능 만 아프다). – Ped7g

답변

0
  1. 입니다 당신의 알고리즘이 지나치게 복잡
  2. 을 종료하기 때문에 귀하의 코드도 조립하지 않습니다 이렇게 구조화 될 수 있습니다. 당신이 전달 된 값은 항상보다 큰 것 알고있는 경우이 예제도 압축 할 수 있습니다 크기 현명한 : 그것은 요구 사항이지만 EBP에게

    push ebp 
        mov  ebp, esp 
        mov  ecx, [ebp+8] 
    
    L1: jcxz done 
        dec  ecx 
        push ecx 
        .... Do printing here 
        pop  ecx 
        jmp  L1 
    
    done: 
        leave 
        ret  4 
    

참고를 유지하기 위해 좋은 생각입니다

  • 하지 않음 0이 아니거나리스가 0이 아닙니다.

    실제 문제는 루프 내에서 ECX를 보존하지 못하는 것뿐입니다.

  • +0

    * 어디에서 끝내기 때문에 코드가 어셈블되지 않습니다 * 그게 무슨 뜻입니까? – fuz

    +0

    @FUZxxl'terminate '라는 장소에 대한 조건부 및 절대 jmp가 있습니다. 레이블은'terminate :'입니다. –

    +0

    OP가 그의 질문에 썼다 _ 이것은 내 코드의 ** 부분이다 ** –