我似乎总是落后于班上的小组,我想在我的班级的下一章“练习”,这是关于循环的。
我写了这个小循环来计算从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字节的硬限制。它是否正确?如果有人想要超出此内存限制怎么办?有办法吗?
这对我来说似乎很奇怪......
答案 0 :(得分:2)
AX,BX,CX和DX是16位寄存器。因此,您不能在其中添加大于65,535的值。如果要循环更多,请使用32位寄存器的EAX,EBX,ECX或EDX。
请注意,ECX和CX是x86中首选的计数寄存器。将“C”视为“计数”。如果您使用CX或ECX,您可以使用“LOOP”指令进行减量比较(反对零),分支和跳转一次。