Reputation: 99
I need help with a few pointers to this assignment: The program will return the total number of occurrences of the sequence of letters "the" in the string. [note: we are looking for the letters "the" not just the word "the". So you would also be counting the "the" in "there" or "then", for example.) So I am supposed to first see if its a 't', then if next char is a 'h' and 'e' after that, if so increment total. I need help with my code. I cant figure out my logic. Any advice on how to do this will help me. Here's my not finished code so far, my main problem is that my jumps are all being executed even when the first character is clearly a "w" but it executes as if it were a "t":
#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 Arnol ";
unsigned short int total = 0;
__asm {
// your syntatically correct assembly language code here
// column alignment markers below (to guide you)
// | | |
cld ;set left to right scan
lea edi, Decl ;load offset of string
mov ecx, 1649 ;length of string +1
mov al, 't' ;load first character into al to be scanned
more1:
repne scasb ;scan byte by byte
cmp ecx, 0 ;see if end of string
je skip1 ;dont do any more processing
jmp case2
skip1: cmp ecx, 0
ja more1
case2: mov ebx, ecx ;how many characters left?
not ebx ;form positive index to string
add ebx, 1649 ;and point to letter
cmp Decl[ebx+1], 'h' ;compare next letter
je case3
jmp more1
case3: mov ebx, ecx
not ebx
add ebx, 1649
cmp Decl[ebx+2], 'e'
je final1
jmp more1
final1: inc total
}
return(0);
}
Upvotes: 0
Views: 3150
Reputation: 61380
On the very first match (after scasb
executes), the following jumps are executed:
jmp case2 ; meaning the string is not over
...
je case3 ; meaning the second char is 'h'
...
je final1 ; meaning the third character is 'e'
and then the function exits. There's no outer loop on a match. The jmp more1
line is NOT executed if you have a match - only if the third char after 't' is something other than a 'e'.
Seriously, are you even debugging your code? A simple step-through would reveal that much in a jiffy. Visual Studio, e. g. does that, and readily shows registers and expressions with registers in the Watch window.
EDIT: the logic of calculating ebx to grab the second and third character is completely extraneous. You already have a register that points at the right spot in the string - that's your edi
after scasb
. Instead of
case2: mov ebx, ecx ;how many characters left?
not ebx ;form positive index to string
add ebx, 1649 ;and point to letter
cmp Decl[ebx+1], 'h' ;compare next letter
you can do
case2: cmp [edi], 'h'
and later
cmp [edi+1], 'e'
Upvotes: 3