(94): 致命错误 A1010: 不匹配的块嵌套: main
Posted
技术标签:
【中文标题】(94): 致命错误 A1010: 不匹配的块嵌套: main【英文标题】:(94): fatal error A1010: unmatched block nesting : main 【发布时间】:2016-06-01 08:19:19 【问题描述】:INCLUDE Irvine32.inc
.data
org 100h ; set location counter to 100h
.code
main PROC
jmp CodeStart
DataStart:
max dw " "
space db " ", 0
CodeStart:
mov bx, 1
call IsPrime
cmp dx, 0
LoopStart:
; must be a prime
mov ax, bx
call print_num
; print a space
mov si, offset space
call print_string
add bx, 1
cmp bx, max
jle LoopStart
ret
IsPrime PROC
; uses a loop to determine if number in bx is prime
; upon return if bx not prime dx will be 0, otherwise dx > 0
; we only have to test divisors from 2 to bx/2
; prepare to divide dx:ax / 2
mov ax, bx
mov dx, 0
mov cx, 2
div cx
; move result into si for loop
mov si, ax
; assume the value is prime
mov dx, 1
; start loop at 2
mov cx, 2
PrimeLoop:
; compare loop count(in cx) and max loop value (in si)
cmp cx, si
; jump out of loop if count(cx) > si
ja StopLabel
; divide test value (in bx) by loop count (in cx)
mov ax, bx
mov dx, 0
div cx
; check remainder (in dx), if zero then we found a divisor
; and the number cannot be prime
cmp dx, 0
; if dx = 0 then we found a divisor and can stop looking
je StopLabel
; increment count
add cx, 1
jmp PrimeLoop
StopLabel:
ret
IsPrime ENDP
END IsPrime
我遇到此错误的问题在我的最后一行中说?任何人都可以阐明可能是什么问题吗?
【问题讨论】:
这是您的第二个问题,与您的first one 非常相似。虽然我们很乐意提供帮助,但我认为您确实需要开始培养一些解决问题的技能。当您遇到无法修复的错误时,首先删除功能块,直到它消失。然后一一放回去。一旦你知道了故障块,编写一个新的最小源来重现错误。这是minimal reproducible example,它很好地隔离了错误。 首先删除IsPrime
,看看你是否能发现任何不对称。如果您认为需要提出更多问题,请花一些时间对formatting 充满信心。
为什么有数据放在代码段,而不是放在它所属的数据段?为什么在这个程序中使用org 100h
?
【参考方案1】:
END
指令后面不应有任何内容。该指令指示整个文件的结尾,而不是特定范围,因此您无需命名范围。(尽管您可以选择在END
后面加上入口点过程的名称,在您的情况下为main
,根据我的经验,这不是必需的并且很少这样做。)
请注意,这与ENDP
(结束过程)形成对比,后者以即将结束的过程的名称为前缀(以PROC
指令开头的过程)。
最后三行应该是这样的:
IsPrime ENDP ; end the IsPrime procedure
END ; end of the entire file
如果您根据每个行的范围缩进,您的代码将显着更容易阅读。此外,我怀疑这会让您找到自己的“不匹配的块嵌套”错误。
例如,您还会注意到ENDP
过程没有ENDP
指令!
一个更正(并且格式很好!)的版本:
INCLUDE Irvine32.inc
.data
org 100h ; set location counter to 100h
.code
;;;;;;;;;;;;;;;;;;;;;;;;
;; Main
;;;;;;;;;;;;;;;;;;;;;;;;
main PROC
jmp CodeStart
DataStart:
max dw " "
space db " ", 0
CodeStart:
mov bx, 1
call IsPrime
cmp dx, 0
LoopStart:
; must be a prime
mov ax, bx
call print_num
; print a space
mov si, offset space
call print_string
add bx, 1
cmp bx, max
jle LoopStart
ret
main ENDP
;;;;;;;;;;;;;;;;;;;;;;;;
;; IsPrime
;;;;;;;;;;;;;;;;;;;;;;;;
IsPrime PROC
; uses a loop to determine if number in bx is prime
; upon return if bx not prime dx will be 0, otherwise dx > 0
; we only have to test divisors from 2 to bx/2
; prepare to divide dx:ax / 2
mov ax, bx
mov dx, 0
mov cx, 2
div cx
; move result into si for loop
mov si, ax
; assume the value is prime
mov dx, 1
; start loop at 2
mov cx, 2
PrimeLoop:
; compare loop count(in cx) and max loop value (in si)
cmp cx, si
; jump out of loop if count(cx) > si
ja StopLabel
; divide test value (in bx) by loop count (in cx)
mov ax, bx
mov dx, 0
div cx
; check remainder (in dx), if zero then we found a divisor
; and the number cannot be prime
cmp dx, 0
; if dx = 0 then we found a divisor and can stop looking
je StopLabel
; increment count
add cx, 1
jmp PrimeLoop
StopLabel:
ret
IsPrime ENDP
END
【讨论】:
根据documentation,END
允许有一个操作数,即入口点地址。那可能应该是main
而不是IsPrime
。以上是关于(94): 致命错误 A1010: 不匹配的块嵌套: main的主要内容,如果未能解决你的问题,请参考以下文章
“[致命错误]:1:120:不允许匹配“[xX][mM][lL]”的处理指令目标。” [复制]
运行时:goroutine 堆栈超过 1000000000 字节限制,致命错误:打印嵌套结构时堆栈溢出
“致命错误:已达到 '100' 的最大函数嵌套级别,正在中止!”的解决方案在 PHP 中
cocos2d/cmake/Modules/CocosConfigDepend.cmake:94 (endmacro) 的 CMake 错误:流控制语句未正确嵌套