2012-04-03 3 views
1

Я пытаюсь отсканировать свою строку ниже для гласных и увеличить их количество. Тем не менее, это дает мне ошибку и необработанные ошибки исключения. Кажется, он возвращает только число первого гласного (a) в строке. Общее число гласных должно быть 491.Сложная строка сканирования языка для подсчета гласных

// 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

Вам не нужно будет использовать второй cmp cx, 0: if вы увеличили TotalVowels, вы знаете, что не находитесь в конце строки и можете перейти к более 1 без сравнения; если первый cmp говорит, что вы в конце строки, прыгайте прямо к inc esi. –

ответ

0

Использование ecx вместо cx. Вы оставляете верхние 16 бит ecx uninitialized, а rep scasb не останавливается на намеченном конце строки, вместо этого он продолжает и продолжает ...

+0

wow я знал, что это проблема простого размера. Благодарю. он работает, однако он останавливается, потому что он повторяется только до тех пор, пока cx = 0. cx, или, скорее, ecx уменьшается каждый раз – user1193717

+0

. В моем надежном руководстве Intel говорится, что в 32-битном режиме ECX используется семейством префикса REPxx. –

Смежные вопросы