2012-04-03 6 views
1

Ich versuche meine Zeichenfolge unten für Vokale zu scannen und ihre Anzahl zu erhöhen. Allerdings gibt es mir Break-und unbehandelt Ausnahmefehler. Es scheint nur die Nummer des ersten Vokal (a) in der Zeichenfolge zurückzugeben. Die Gesamtzahl der Vokale sollten 491.Assembly Sprache Scannen lange Zeichenfolge für die Zählung der Vokale

// Calculated Values: 492 total vowel counter. 
// 


#include "stdafx.h" 
#include <iostream> 

using namespace std; 


int main(int argc, char* argv[]) 
{ 
// your properly formatted assembly language data here 
char Decl[] = "We hold these truths to be self-evident, that " 
       "all men are created equal, that they are " 
       "endowed by their Creator with certain " 
       "unalienable Rights, that among these are " 
       "Life, Liberty and the pursuit of Happiness. " 
       "That to secure these rights, Governments are " 
       "instituted among Men, deriving their just " 
       "powers from the consent of the governed, " 
       "That whenever any Form of Government becomes " 
       "destructive of these ends, it is the Right of " 
       "the People to alter or to abolish it, and to " 
       "institute new Government, laying its foundation " 
       "on such principles and organizing its powers in " 
       "such form, as to them shall seem most likely to " 
       "effect their Safety and Happiness. Prudence, " 
       "indeed, will dictate that Governments long " 
       "established should not be changed for light and " 
       "transient causes; and accordingly all epxerience " 
       "hath shewn, that mankind are more disposed to " 
       "suffer, while evils are sufferable, than to " 
       "right themselves by abolishing the forms to " 
       "which they are accustomed. But when a long train " 
       "of abuses and usurpations, pursuing invariably " 
       "the same Object evinces a design to reduce them " 
       "under absolute Despotism, it is their right, " 
       "it is their duty, to throw off such Government " 
       "and to provide new Guards for their future " 
       "security. Such has been the patient sufferance " 
       "of these Colonies; and such is now the " 
       "necessity which constrains them to alter their " 
       "former Systems of Government. The history of " 
       "the present King of Great Britain is a history " 
       "of repeated injuries and usurpations, all " 
       "having in direct object the establishment of " 
       "an absolute Tyranny over these States. To " 
       "prove this, let Facts be submitted to a " 
       "candid world. Entered by Thomas Berny "; 

char Vowels[] = "aeiouAEIOU"; 
unsigned short int TotalVowels = 0; 

    __asm { 
// your syntatically correct assembly language code here 
// column alignment markers below (to guide you) 
//  |  |    | 
     mov  esi, 0   ;clear esi index register 
check1: cld      ;set left to right scan 
     lea  edi, Decl  ;location of string to scan 
     mov  cx, 1649  ;number of chars to scan +1 
     mov  al, Vowels[esi] ;particular vowels 
more1: 
repne scasb     ;scan byte by byte 
     cmp  cx, 0   ;see if end of string 
     je  nocnt1   ;if so, dont increment counter 
     inc  TotalVowels  ;otherwise increment 
nocnt1: cmp  cx, 0   ;see if end of string 
     ja  more1   ;if not, continue scanning 
     inc  esi    ;point to next vowel 
     cmp  esi, 10   ;done all vowels? 
     jl  check1   ;if not, do another 

    } 
     cout << "The number of vowels is: " << TotalVowels; 
    return(0); 
} 
+2

Sie sollten nicht die zweite cmp cx, 0: wenn Sie haben TotalVowels inkrementiert, Sie wissen, dass Sie nicht am Ende der Zeichenfolge sind und können zu mehr springen1 ohne den Vergleich; Wenn der erste CMP sagt, dass Sie am Ende der Saite sind, springen Sie direkt zu Inc esi. –

Antwort

0

Verwenden ecx statt cx sein. Sie lassen die oberen 16 Bits von ecx nicht initialisiert und rep scasb stoppt nicht am beabsichtigten Ende der Zeichenfolge, stattdessen geht es weiter und weiter und weiter ...

+0

wow ich wusste, dass es ein Problem mit der einfachen Größe war. Vielen Dank. es funktioniert, aber es hört auf, ich denke, weil es nur wiederholt, bis cx = 0. cx, oder ecx wird jedes Mal dekrementiert – user1193717

+0

My trusty Intel Handbuch sagt, dass im 32-Bit-Modus speziell ECX von der REPxx-Präfix-Familie verwendet wird. –