1

我在班上似乎总是落后于小组,我想为我班上关于循环的下一章“练习”。

我写了这个从 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) 值超出范围。

ERROR 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

经过一些谷歌搜索(并在阅读有关内存寄存器的书上摸索)后,事实证明存在 65,535 个字节的硬限制。这个对吗?如果有人想超越这个内存限制怎么办?有没有办法做到这一点?

只是对我来说似乎很奇怪......

4

1 回答 1

2

AX、BX、CX 和 DX 是 16 位寄存器。因此,您不能在其中输入大于 65,535 的值。如果要循环更多,请使用 EAX、EBX、ECX 或 EDX,它们是 32 位寄存器。

请注意,ECX 和 CX 是 x86 中的首选计数寄存器。将“C”视为“计数”的意思。如果您使用 CX 或 ECX,您可以使用“LOOP”指令进行减量比较(相对于零)、分支和跳转全部合二为一。

于 2012-04-27T23:05:30.370 回答