2016-12-09 16 views
-1

У меня проблема с моей петлей, код, содержащийся в ней, длинный, и он дает мне ошибку jump destination too far : by 3 byte(s). Когда ı удалите:jump destination too far: by 3 byte

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 label1 

если метка находится вне досягаемости вы можете сделать что-то вроде этого:

label1: 

<lots of code> 

loop tmp1 
jmp tmp2 
tmp1: 
    jmp label1 
tmp2: 

или же использовать другую конструкцию на основе условных переходов, которые не имеют ограничение диапазона.

+0

Большое вам спасибо. Ну, ошибка в зависимости от типа команды перехода, например, js? Или мне нужно просто положить ярлыки? – zahit

+0

'js' и другие условные прыжки _used_, чтобы иметь те же ограничения на ранних моделях x86, но теперь, поскольку навсегда существовало два варианта тех, у которых есть подписанный 32-битный диапазон ветвей. Большинство ассемблеров автоматически выбирают правильный размер прыжка только из мнемоники. –

+3

Почему бы просто не отобразить 'dec ecx/jnz label1' в качестве альтернативы вместо этой ужасной труднодоступной конструкции с LOOP и JMP? BTW, JCC rel32 был поддержан, по крайней мере, уже в 386, поэтому вам не нужно избегать этого в 32-битном коде. –