2016-04-26 4 views
1

ist die Zuordnung:Assembly Language-Programm - schwerwiegender Fehler A1010

schreiben „menu-driven“ Programm, das einen Absatz von der Tastatur liest und verarbeitet es in der folgenden Art und Weise:

Zähle die Anzahl der Zeichen im Absatz, Zählen Sie die Anzahl der Wörter, . Zählen Sie die Anzahl der Buchstaben, die mit dem dritten Buchstaben Ihres Nachnamens übereinstimmen, . Zählen Sie die Anzahl der Großbuchstaben.

den Absatz mit Sonderzeichen beenden:

Wenn Ihr Nachname beginnt mit A, B, C, D, E, F, G, H, um den Absatz mit # beenden,

Wenn Ihr Nachname beginnt mit I, J, K, L, M, N, O, P Beendet den Absatz mit%,

Wenn Ihr Nachname mit R, S, T, U, V, W, X, Y, Z beginnt Beenden Sie den Absatz mit &,

Für diese Übung müssen Sie Unterprogramme verwenden. Lesen Sie den Abschnitt im Hauptverfahren.

Absatz in Unterroutinen verarbeiten (separate Prozedur für jede Zählung).

Hier ist mein Code, ich bekomme einen A1010 Fehler (unübertroffene Blockverschachtelung: Haupt) auf der letzten Zeile und ich kann nicht herausfinden warum, bitte helfen. Ich bin mit 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 
+0

Sie haben 'end start' bei' L1'. Keine Ahnung was du da machen wolltest, solltest du wahrscheinlich entfernen. – Jester

+0

Ok, ich habe das entfernt, aber jetzt bekomme ich diesen Fehler in Zeile 59: Fehler 2004 Symboltyp Konflikt 'mov ax, @ data' – cantoX

+0

Bitte markieren Sie Zeile 59 in der Frage. – Jester

Antwort

2

Zusätzlich zum überflüssig end startpointed out by commenter Jester, es mir sieht aus wie Sie versuchen, Montag 16-Bit zu kompilieren einen 32-Bit-Assembler, die nicht funktionieren. (In diesem Zusammenhang, ich denke, die eingebundenen Datei am Anfang auch Irvine16.inc statt Irvine32.inc sein sollte.)

Sie haben ein Projekt 16-Bit-Assembler verwenden, finden Sie http://kipirvine.com/asm/gettingStartedVS2015/index.htm#16-bit

Allerdings, wenn Sie eine haben 64-Bit-Version von Windows, können Sie Ihr Programm nicht nativ ausführen. Sie müssten eine virtuelle Maschine oder DOSBox verwenden, um Ihr Programm auszuführen und zu testen.

+0

Die einzige effektive Adresse ist' [esi] ', also bin ich mir nicht sicher, ob es 16-Bit-Code ist. Ich verschwendete nicht meine Zeit damit, wirklich diesen riesigen doppelten DOS-Code-Dump zu lesen. Oh, jetzt sehe ich die Kommentare über Segment-Mist, ja vielleicht kamen einige davon von einem 16-Bit-Beispiel. –

+0

OK, Sie haben Recht, es scheint eine seltsame Mischung von Dingen zu sein, denn es gibt die fehlerhafte Zeile und das Zeug mit Segmentregistern, 'int 21h' Aufrufe sowie die übermäßige Verwendung von Registern kleiner als 32 Bit, aber auch ' esi' ... – CherryDT

+0

Mit 8bit Regs ist nicht so schlecht, esp. wenn Sie nach dem Schreiben eines partiellen Reg. Ich habe gerade "LEA DX, MSG" bemerkt. Du hast Recht, das ist eine riesige rote Flagge und nur in 16bit machbar. Funktioniert 'int 21h' im 32-Bit-Modus? https://en.wikipedia.org/wiki/DOS_Protected_Mode_Interface Scheint so zu sein. So froh, dass ich mich nie mit DOS beschäftigen musste :) –

Verwandte Themen