2016-12-09 18 views
-1

私のループに問題があり、そのコードが長く、エラーjump destination too far : by 3 byte(s)が出ます。 ı除去時:ジャンプ先が遠すぎます: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 label1 

ラベルは手の届かないところにある場合は、このような何か行うことができます。

label1: 

<lots of code> 

loop tmp1 
jmp tmp2 
tmp1: 
    jmp label1 
tmp2: 

か、他はありません条件ジャンプに基づいて、異なる構文を使用します範囲の制限。

+0

ありがとうございました。まあ、例えばjsのようなジャンプ命令の種類によってはエラーですか?またはıラベルを貼るだけでいいですか? – zahit

+0

'js'と他の条件式は_used_が早いx86モデルでこの同じ制限を持つようになりましたが、今や永遠に符号付き32ビットブランチ範囲を持つものには2つのバリエーションがあります。ほとんどのアセンブラは、自動的にニーモニックから正しいジャンプサイズを選択します。 –

+3

LOOPとJMPの読みにくい難しい構文の代わりに 'dec ecx/jnz label1'を代わりに表示するのはなぜですか? BTWでは、JCC rel32は少なくとも386までサポートされていたので、32ビットコードでは避ける必要はありません。 –

関連する問題