2012-04-27 10 views
0

私はいつも私のクラスでグループの背後にあるように見えます。私はループについての私のクラスの次の章で "練習"したいと思いました。8086 TASMアセンブラ - ループ時のエラー: "値が範囲外です"?

私は(私は実行するために、ミリ秒のすべてを取るだろう考え出した)1〜10,000カウントするために、この小さなループを書いた:

.MODEL SMALL 

    .STACK 100h 

    .DATA 
    Finished DB 10, 13, 'Loop x 10,000 finished. Congratulations! $', 10, 13 

    .CODE 

    MAIN PROC 

      MOV AX, @data    
      MOV DS, AX 

      MOV CX, 10000    
      MOV BX, 0     

    StrtLoop:       

      INC BX     

    LOOP StrtLoop      

      CMP BX, 10000     
      JE DispMsg    


      JMP SkipMsg    

    DispMsg:       
      MOV AH, 09H    
      MOV DX, OFFSET Finished 
      INT 21H 
    SkipMsg:       
      MOV AL, 0h    
      MOV AH, 4CH 
      INT 21H 

    MAIN ENDP 
    END MAIN 

私は数分前にゼロの数を誤って入力し、壊れましたプログラム。なぜこのようなことが起こったのだろうと思っていた。範囲外Loop.ASM

ERROR loop.ASM(15)値:

組み立てファイル:

私はこのエラーを得ました。

エラー loop.ASM(24)値が範囲外です。

エラーメッセージ:2

警告メッセージ:なし

渡します

残りメモリ:467k

.MODEL SMALL 

    .STACK 100h 

    .DATA 
    Finished DB 10, 13, 'Loop x 100000 finished. Congratulations! $', 10, 13 

    .CODE 

    MAIN PROC 

      MOV AX, @data    
      MOV DS, AX 

      MOV CX, 100000    
      MOV BX, 0     

    StrtLoop:       

      INC BX     

    LOOP StrtLoop      

      CMP BX, 100000    
      JE DispMsg    


      JMP SkipMsg    

    DispMsg:       
      MOV AH, 09H    
      MOV DX, OFFSET Finished 
      INT 21H 
    SkipMsg:       
      MOV AL, 0h    
      MOV AH, 4CH 
      INT 21H 

    MAIN ENDP 
    END MAIN 
一部のGoogle検索後

(およびメモリについて読んブック手探りレジスタ)、65,535バイトのハード制限があることが分かります。これは正しいです?もし誰かがこの記憶限界を超えたいと思ったら?それを行う方法はありますか?それはちょうど私には奇妙に思える

...

+3

最近、人々が16ビットマシンを頻繁に使用しない理由を発見したように聞こえます。 –

+0

本当に!悲しいことですが、これは私の学校がCIS 215コースで教えるものです。 – SalarianEngineer

答えて

2

AX、BX、CXとDXは、16ビットのレジスタです。したがって65,535を超える値を入れることはできません。さらにループする場合は、EAX、EBX、ECXまたはEDX(32ビットレジスタ)を使用します。

ECXとCXがx86の優先カウントレジスタであることに注意してください。 "C"は "カウント"を意味すると考えてください。 CXまたはECXを使用する場合、デクリメント比較(ゼロに対して)、ブランチおよびジャンプを1つにする「LOOP」命令を使用できます。

+1

彼は16ビットコードを書いているので、EAXはありません。 –

+0

TASMを使うと、彼は仮想8086モードにあり、ECXや他の拡張レジスタにアクセスすることができません。 –

+1

@HeathHunnicutt:そうではありません。 CPUがi80386以上であれば、実際の仮想8086および16ビットの保護モードで自由に32ビットレジスタを使用できます。 –

関連する問題