1

私はいつもクラスでグループに遅れをとっているように見えます.アセンブリに関する私のクラスの次の章に向けて「練習」したかったのですが、それはループに関するものです.

1 から 10,000 までカウントするこの小さなループを作成しました (実行に 1 ミリ秒かかると考えました)。

    .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

エラー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 バイトのハード リミットがあることがわかりました。これは正しいです?誰かがこのメモリ制限を超えたいと思ったらどうしますか? それを行う方法はありますか?

私には奇妙に思えます...

4

1 に答える 1

2

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

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

于 2012-04-27T23:05:30.370 に答える