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

Assembly 8086 TASM汇编程序-循环时出错:“0”;值超出范围“;?,assembly,x86-16,tasm,Assembly,X86 16,Tasm,在我的课堂上,我似乎总是落在小组后面,我想在我的课上的下一章“练习”组装,这是关于循环的 我写了一个小循环,从1数到10000(我想运行这个循环需要一毫秒): 几分钟前,我输入了错误的零数,破坏了程序。我想知道为什么会这样 我得到了这个错误: 汇编文件:Loop.ASM 错误循环。ASM(15)值超出范围 错误循环。ASM(24)值超出范围 错误消息:2 警告消息:无 通行证: 剩余内存:467k .MODEL SMALL .STACK 100h .DATA

在我的课堂上,我似乎总是落在小组后面,我想在我的课上的下一章“练习”组装,这是关于循环的

我写了一个小循环,从1数到10000(我想运行这个循环需要一毫秒):

几分钟前,我输入了错误的零数,破坏了程序。我想知道为什么会这样

我得到了这个错误:

汇编文件:Loop.ASM

错误循环。ASM(15)值超出范围

错误循环。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
经过一些谷歌搜索(并在阅读有关内存寄存器的书籍时摸索),结果发现有一个65535字节的硬限制。这是正确的吗?如果有人想超越这个记忆极限呢?有办法吗


我觉得很奇怪…

AX、BX、CX和DX都是16位寄存器。所以你不能在它们里面放一个大于65535的值。如果您想循环更多,请使用EAX、EBX、ECX或EDX,它们是32位寄存器


请注意,ECX和CX是x86中首选的计数寄存器。把“C”看作是“计数”的意思。如果您使用CX或ECX,您可以使用“循环”指令,该指令将减量比较(与零比较)、分支和跳转集于一身。

听起来您已经发现了为什么人们现在不经常使用16位机器。的确!可悲的是,由于我不知道的原因,这是我的学校为CIS 215课程所教的内容。使用TASM意味着他处于虚拟8086模式,无法访问ECX或任何其他扩展寄存器。@Heathunnicutt:不正确。只要您的CPU是i80386或更好,您就可以在实、虚8086和16位保护模式下自由使用32位寄存器。。。。包括.386 asmb指令或类似指令,除非你的汇编程序直接管理这些指令。我昨天问过,我的老师说我们不能在课堂上使用扩展寄存器——然后斯奈德利(这个家伙是个混蛋)说,如果我觉得“有必要”在他的课堂上数到那么高,我就必须使用标签而不是循环。他说,如果他看到扩展寄存器(以及其他“规则”),那么作业将自动获得不及格分数!我想“证明”我能做到(接受挑战!)。既然登记册不能达到那么高,你认为什么最好?双循环,用BX和CX计数?我想知道…循环CX 1000次,嵌套BX 100次,=100000?这很有趣。问一个问题(范围不广,但定义很明确),我就失去了声誉?这是怎么回事?有人只是觉得自己像个傻瓜,或者觉得“这个傻瓜很蠢”,觉得有必要给我的代言人打电话?并不是说我特别在意,但当一切都说了又做了,我希望通过回答我有经验的领域的问题来获得可观的声誉。哦……互联网……傻瓜和英雄的家园。
    .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