8086 TASM汇编程序 - 循环时出错:“值超出范围”?

时间:2012-04-27 22:42:22

标签: assembly x86-16 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

错误 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

经过一些谷歌搜索(并在书中阅读有关内存寄存器的内容),结果证明存在65,535字节的硬限制。它是否正确?如果有人想要超出此内存限制怎么办?有办法吗?

这对我来说似乎很奇怪......

1 个答案:

答案 0 :(得分:2)

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

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