Assembly 汇编语言程序-致命错误A1010
以下是作业: 编写一个“菜单驱动”程序,从键盘读取段落,并按以下方式进行处理: 计算段落中的字符数, 数一数字数, 计算与您姓氏第三个字母相同的字母数, 数一数大写字母的数目 以特殊字符结束段落: 如果您的姓氏以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: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开头,则以&,结束本段 对于本练习,您需要使用子例程。阅读主要程序中的段落 处理子程序中的段落(每个计数的单独程序) 这是
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 conflictmov 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:)