2016-12-09 9 views
-1

내 루프에 문제가있어서 코드가 길어서 오류 jump destination too far : by 3 byte(s)이 발생합니다. ı 제거시 :건너 뛰기 대상이 너무 멀습니다 : by 3 바이트

mov edx,offset str1 
call writestring 

이 부분은 PROC 아래에 있으며 오류가 없습니다. 그러나 ı이 문자열 사용자가 음수를 입력해야 메시지를 보낼 수 있습니다. 내가 어떻게 할 수있는?

INCLUDE Irvine32.inc 

.data 

    money  dword 200,100,50,20,10,5,1 
    str1  byte  "Enter the amounts for each value of money : ",0 
    str2  byte  "The sum of your moneys are:",0 
    total  dword 0 
    buffer  dword 1000 dup(0),0  
    str3  byte  "Do not enter neg number ",0 

.code 
main PROC 
    mov edx,offset str1 
    call writestring 
    call crlf 
    mov ecx,lengthof money 
    mov esi,0 
    mov edi,0 

start1: 
    jmp continue 
    don: 
    push ecx 


    mov edx,ecx 
    mov edx,0 

    mov edx,7 
    sub edx,ecx 
    mov ecx,edx 
    mov edi,0 
    mov esi,0 
     start2: 

      mov eax,money[esi] 
      call writedec 
      mov ebx,eax 
      mov al,'x' 
      call writechar 
      mov eax,buffer[edi] 
      call writedec 
      call crlf 
      add esi,4 
      add edi,4 

     loop start2 

    pop ecx 
    continue: 

    ;************************************************** 
    mov edx,0 
    mov eax,money[esi] 
    call writedec 
    mov ebx,eax 
    mov al,'x' 
    call writechar 
    call readint 
    ;*************************************************** 

    sub eax,0 
    js don 
    mov buffer[edi],eax 
    ;************************* 
    mul ebx 
    add total,eax  ;we add each the multiplication to total. 
    add esi,4   ;increases the index by 4.(because of dword type) 
    add edi,4 


loop start1 

    mov edx,offset str2 
    call writestring 
    mov eax, total 
    call writedec 

    exit 
main ENDP 
END main 
+0

오류가 어떤 명령을 의미합니까? – duskwuff

+0

mov edx, offset str1 call writestring – zahit

+1

코드는 LOOP 명령을 사용하지 않아야하는 이유의 좋은 예입니다. –

답변

1

loop에는 제한된 범위가 있습니다. 다음 명령어의 시작부터 측정 된 명령어 스트림에서 최대 127 바이트 또는 128 바이트까지만 점프 할 수 있습니다.

이 문제를 해결하려면 다음과 같이하십시오. 이없는 조건 점프에 따라 다른 구조를

label1: 

<lots of code> 

loop tmp1 
jmp tmp2 
tmp1: 
    jmp label1 
tmp2: 

또는 다른 사용하는 대신

label1: 

<lots of code> 

loop label1 

라벨이 손이 닿지 않는 경우, 당신은 이런 식으로 뭔가를 할 수 범위 제한.

+0

정말 고마워요. 예 js와 같은 점프 명령의 유형에 따라 오류가 있습니까? 또는 ı 레이블 만 붙이면됩니까? – zahit

+0

'js'와 다른 조건부 _used_는 초기 x86 모델에서 이와 동일한 제한을 갖지만 이제는 서명 된 32 비트 분기 범위를 가진 두 가지 변종이 영원히 남았습니다. 대부분의 어셈블러는 니모닉에서 자동으로 올바른 점프 크기를 선택합니다. –

+3

왜 LOOP와 JMP를 사용하기에는 끔찍한 읽기 어려운 구조 대신'dec ecx/jnz label1'을 대신 사용하는 것이 좋을까요? BTW, JCC rel32는 적어도 386부터 지원되었으므로 32 비트 코드에서는 피할 필요가 없습니다. –