Assembly 汇编语言程序-致命错误A1010

Assembly 汇编语言程序-致命错误A1010,assembly,visual-studio-2015,x86,masm,irvine32,Assembly,Visual Studio 2015,X86,Masm,Irvine32,以下是作业: 编写一个“菜单驱动”程序,从键盘读取段落,并按以下方式进行处理: 计算段落中的字符数, 数一数字数, 计算与您姓氏第三个字母相同的字母数, 数一数大写字母的数目 以特殊字符结束段落: 如果您的姓氏以A、B、C、D、E、F、G、H开头,则以#结束本段 如果您的姓氏以I、J、K、L、M、N、O、p开头,则以%结束本段 如果您的姓氏以R、S、T、U、V、W、X、Y、Z开头,则以&,结束本段 对于本练习,您需要使用子例程。阅读主要程序中的段落 处理子程序中的段落(每个计数的单独程序) 这是

以下是作业:

编写一个“菜单驱动”程序,从键盘读取段落,并按以下方式进行处理:

计算段落中的字符数, 数一数字数, 计算与您姓氏第三个字母相同的字母数, 数一数大写字母的数目

以特殊字符结束段落:

如果您的姓氏以A、B、C、D、E、F、G、H开头,则以#结束本段

如果您的姓氏以I、J、K、L、M、N、O、p开头,则以%结束本段

如果您的姓氏以R、S、T、U、V、W、X、Y、Z开头,则以&,结束本段

对于本练习,您需要使用子例程。阅读主要程序中的段落

处理子程序中的段落(每个计数的单独程序)

这是我的代码,我在最后一行遇到A1010错误(unmatched block nesting:main),我不知道为什么,请帮助。我正在使用Visual Studio 2015:

include Irvine32.inc

displayMSG MACRO MSG            

      MOV      AH, 09H

      LEA      DX, MSG

      INT      21H

      ENDM

.DATA

      para     DB 100 , ? , 100 DUP('$')

;messages for menu     

      mes1     DB 0AH, 0DH, 'MENU $'

      mes21    DB 0AH, 0DH, '1.COUNT CHARACTERS $'

      mes22    DB 0AH, 0DH, '2.COUNT WORDS $'

      mes23    DB 0AH, 0DH, '3.COUNT CAPITAL LETTERS $'

      mes24    DB 0AH, 0DH, '4.COUNT THIRD LETTER $'

      mes25    DB 0AH, 0DH, '5.EXIT $'

      mes3     DB 0AH, 0DH, 'ENTER YOUR CHOICE : $'

      mes4     DB 0AH, 0DH, 'WRONG CHOICE $'

      mes5     DB 0AH, 0DH, 'ENTER THE PARAGRAPH : $'     

      mes6     DB 0AH, 0DH, 'NUMBER OF CHARACTERS IS : $'

      mes7     DB 0AH, 0DH, 'NUMBER OF WORDS $'

      mes8     DB 0AH, 0DH, 'NUMBER OF CAPITAL LETTERS $'

      mes9 DB 0AH, 0DH, 'NUMBER OF THIRD LETTER $'

.CODE

main PROC

 start:  

      mov           ax, @data   

      mov           ds, ax

      mov           es, ax

      displayMSG    mes5 ;PROMPT THE USER TO ENTER A PARAGRAPH

      mov ah, 0ah     ; Accept PARAGRAPH

      lea dx, para

      int 21h

 ;DISPLAY MENU TO THE USER

 menu :

      displayMSG           mes1    

      displayMSG           mes21

      displayMSG           mes22

      displayMSG           mes23

      displayMSG           mes24

      displayMSG           mes25

      displayMSG           mes3     ; accept choice

      mov       ah, 01h

      int       21h

      mov       bl, al     ; userChoice BL       

      cmp       bl, 31h     ; if userChoice=1

      je        FINDCHAR          ; Find NUMBER OF CHARACTERS IN THE STRING



      cmp bl, 32h     ; if userChoice=2

      je FINDWORDS         ; FIND NUMBER OF WORDS

      cmp      bl, 33h     ; if userChoice=3

      je        FINDCAPITAL          ; FIND NUMBER OF CAPITAL LETTERS

      cmp      bl, 34h     ; if userChoice=4

      je        FINDLETTER                          

      cmp     bl, 35h     ; if userChoice=5

      je      L1     ; exit

      displayMSG           mes4     ; Wrong Choice

      jmp     menu

 FINDCHAR:    

      call FINDCHARPROC

      jmp menu

 FINDWORDS :    

      call FINDWORDSPROC

      jmp menu

 FINDCAPITAL:    

      call FINDCAPITALSPROC

      jmp menu

 FINDLETTER :    

      call FINDTHIRDPROC

      jmp menu

 L1: 
      end start
      exit

exit
main ENDP  

;procedure THAT FINDS NUMBER OF CHARACTERS

FINDCHARPROC proc 

      displayMSG    mes6

      mov dl, para+1     ; NUMBER OF CHARACTERS IN THE PARAGRAPH

      or   dl, 30h

      mov ah, 02h          ; DISPLAY THE CHARACTERS COUNT                         

      int 21h

      ret

FINDCHARPROC ENDP

;find number of WORDS in the paragraph

FINDWORDSPROC   proc    

      mov dl,00h

      mov       ch, 00h                     

      lea       esi, para+2        

      mov       cl, para+1   

      mov bl,20h        ;ASCII value of space

loopAn:

      dec cl

      cmp       cl, 00h

      je        printWordCount

      cmp bl, [esi] ;check if character is space

      je   incWordCnt        

      inc esi      

      jne      loopAn

incWordCnt:

      inc dl

      inc esi

      jmp loopAn

printWordCount:

      displayMSG    mes7

      or   dl,30h

      mov ah,02h

      int 21h

      ret      

FINDWORDSPROC ENDP

;find number of CAPITAL letters in the paragraph

FINDCAPITALSPROC   proc     

      mov dl,00h

      mov       ch, 00h                     

      lea       esi, para+2     ; USER INPUTTED PARAGRAPH  

      mov       cl, para+1         

loopAgn:

      dec cl

      cmp       cl, 00h

      je        printcapitalCount

      mov al, byte ptr[esi]

      cmp al,"A"    ;check if character is capital

      jb   nextChar

      cmp al,"Z"    ;check if character is capital

      ja   nextChar   

      inc esi

      inc dl       

      jne      loopAgn

nextChar:

      inc esi

      jmp loopAgn

printcapitalCount :

      displayMSG    mes8

      or   dl,30h

      mov ah,02h

      int 21h

      ret      

FINDCAPITALSPROC ENDP

;count the number of third letter present in the paragraph

FINDTHIRDPROC   proc     

      mov dl,00h

      mov       ch, 00h                     

      lea       esi, para+2     ; DESTINATION STRING     

      mov       cl, para+1

      call      ReadChar   ;get THIRD letter of your name    

loopTemp:

      dec cl

      cmp       cl, 00h

      je        printCount

      cmp al, [esi] ;check if character is your third letter

      je   incCnt     

      inc esi      

      jne      loopTemp

incCnt:

      inc dl

      inc esi

      jmp loopTemp

printCount :

      displayMSG    mes9

      or   dl,30h

      mov ah,02h

      int 21h

      ret      

FINDTHIRDPROC ENDP

END main

除了多余的
结束-开始
,在我看来,您似乎正在尝试使用32位汇编程序编译16位汇编程序,这是行不通的。(结合这一点,我猜开头包含的文件也应该是
Irvine16.inc
,而不是
Irvine32.inc

您必须使用16位汇编程序项目,请参见


但是,如果您有64位版本的Windows,则无法以本机方式运行程序。您需要使用虚拟机或运行并测试您的程序。

您在
L1
处有
end-start
。不知道您想在那里做什么,您可能应该删除它。好的,我删除了它,但是现在我在第59行得到了这个错误:error 2004 symbol type conflict
mov ax,@data
请在问题中标记第59行。第59行是
mov ax,@data
start:
之后的第一行唯一有效地址是
[esi]
,所以我不确定它是16位代码。不过,我并没有浪费时间真的去阅读那个巨大的双倍行距DOS代码转储。哦,现在我看到了关于段垃圾的评论,是的,也许其中一些确实来自一个16位的例子。好吧,你是对的,这似乎是一个奇怪的混合体,因为有失败的行和段寄存器,
int 21h
调用,以及过度使用小于32位的寄存器,但也
esi
…使用8位寄存器并不太糟糕,尤其是如果您在编写部分寄存器后没有读取更宽的寄存器。不过,我刚刚注意到
LEA DX,MSG
。您是对的,这是一个巨大的红旗,只有我可以n 16位。
int21h
是否在32位模式下工作?似乎是这样说的。很高兴我从未处理过DOS:)