user1193717
user1193717

Reputation: 99

Assembly language with String Operations

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

Answers (1)

Seva Alekseyev
Seva Alekseyev

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

Related Questions