0

この割り当てへのいくつかのポインタについてサポートが必要です。プログラムは、文字列内の文字「the」のシーケンスの出現回数の合計を返します。[注:「the」という単語だけでなく、「the」という文字を探しています。たとえば、「there」または「then」の「the」もカウントします。)したがって、最初にその「t」かどうかを確認し、次に次の文字が「h」および「e」であるかどうかを確認することになっています。その後、その場合は合計を増やします。コードについてサポートが必要です。私は自分の論理を理解できません。これを行う方法についてのアドバイスは私を助けます。これまでのところ完成していないコードがあります。私の主な問題は、最初の文字が明らかに「w」である場合でもジャンプがすべて実行されているが、「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);
}
4

1 に答える 1

3

最初のマッチ (scasb実行後) で、次のジャンプが実行されます。

jmp     case2  ; meaning the string is not over
...
je      case3  ; meaning the second char is 'h'
...
je      final1   ; meaning the third character is 'e'

そして、関数は終了します。マッチに外側のループはありません。一致した場合、そのjmp more1行は実行されません - 't' の後の 3 番目の文字が 'e' 以外の場合のみ。

真剣に、コードをデバッグしていますか? 簡単なステップスルーで、すぐにそれが明らかになります。たとえば、Visual Studio はそれを行い、[ウォッチ] ウィンドウにレジスタとレジスタを含む式を簡単に表示します。

編集: ebx を計算して 2 番目と 3 番目の文字を取得するロジックは、まったく無関係です。文字列内の適切な場所を指すレジスタが既にあります。これがediafterscasbです。それ以外の

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

できるよ

case2: cmp [edi], 'h'

以降

cmp [edi+1], 'e'
于 2012-04-17T03:29:43.127 に答える