(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的主要内容,如果未能解决你的问题,请参考以下文章

cad2018卸载不干净,安装打开后出现致命错误怎么办?

“[致命错误]:1:120:不允许匹配“[xX][mM][lL]”的处理指令目标。” [复制]

运行时:goroutine 堆栈超过 1000000000 字节限制,致命错误:打印嵌套结构时堆栈溢出

“致命错误:已达到 '100' 的最大函数嵌套级别,正在中止!”的解决方案在 PHP 中

cocos2d/cmake/Modules/CocosConfigDepend.cmake:94 (endmacro) 的 CMake 错误:流控制语句未正确嵌套

指定的初始化向量 (IV) 与此算法的块大小不匹配