2015-11-25 3 views
0

Я пытаюсь получить версию кода сборки этого действия на C++. Я сделал следующий код.Выберите один символ из строки, используя индекс?

#include <iostream> 
#include <string> 
#include <cstdlib> 
#include <random> 
using namespace std; 

void RandomizeData(); 

string vowel = "AEIOU"; 
string consonant = "BCDFGHJKLMNPQRSTVWXYZ"; 
int Matrixes = 0; 
int Rows = 0; 
int Characters = 0; 
int test; 

int main() 
{ 
    // declare variables 

    while (Matrixes < 4) 
    { 
     while (Rows < 4) 
     { 
      while (Characters < 4) 
      { 
       RandomizeData(); 
       ++Characters; 
      } 
      Characters = 0; 
      Rows++; 
      cout << "\n"; 
     } 
     Rows = 0; 
     Characters = 0; 
     cout << "\n\n"; 
     ++Matrixes; 
    } 

    cin >> test; 

    return 0; 
} 

void RandomizeData() 
{ 
    int randVowel = (rand() % 5); 
    int randCons = (rand() % 21); 

    test = (rand() % 2); 

    if (test == 1) 
    { 
     cout << consonant[randCons] << ""; 
    } 
    else 
    { 
     cout << vowel[randVowel] << ""; 
    } 
} 

У меня есть все, что практически сделано для asm. Но я все еще не могу заставить этот раздел работать или переводить его.

 ;How to do the following in asm? 
     cout << consonant[randCons] << ""; 

Ниже то, что я до сих пор: !! ВНИМАНИЕ !! код плохой!

INCLUDE Irvine32.inc 

.386 
.stack 4096 
ExitProcess proto,dwExitCode:dword 


    .data 

     vowels DB "AEIOU" 
     cons DB "BCDFGHJKLMNPQRSTVWXYZ", 0 
     path DWORD 0 
     cool BYTE ?         ;determines vowel or cons 

     ;Loop counters 
     rows DWORD 0 
     matrixes DWORD 0 
     characters DWORD 0 

     ;Random variables 
     rndVowel  DWORD ? 
     rndCons  DWORD ? 



    .code 
     main PROC 
      STEP1: cmp  matrixes, 4 
        jge  STEP4 

      STEP2: cmp  rows, 4 
        jge  STEP1 
        mov  characters, 0 

      STEP3: cmp  characters, 4 
        jge  STEP2 
        call CharSelector    ;get & display character 
        inc  characters    
        jmp  STEP3      ;repeat STEP 3 

      STEP4: invoke ExitProcess,0 
     main ENDP 




     CharSelector PROC 
      call Randomize       ;seed 
      mov  eax, 2 
      call RandomRange 
      mov  path, eax       ;mov result to path 

      STEP1: cmp  path, 1 
        mov  ecx, 0 
        jne  STEP2 

      STEP2:          ;block chooses vowel index         
        mov  eax, 5 
        call RandomRange 
        mov  rndVowel, eax 


        ;How to do the following in asm 


        call WriteString 


        exit 

      STEP3:          ;block chooses cons index 
        mov  eax, 21 
        call RandomRange 
        mov  rndCons, eax 
        exit 
     CharSelector ENDP 


    end main 
+2

Почему вы хотите сделать это в первую очередь? Кроме того, вы компилируете 32- или 64-разрядный режим? –

+1

Вы всегда можете посмотреть выход компилятора, если хотите, чтобы один из способов сделать что-то. Пока вы это понимаете, это хороший способ узнать asm. –

ответ

1

Символы по одному байту, поэтому просто смещайте базовый адрес массива с индексом.

Похоже, у вас есть свой индекс в eax (возвращаемое значение из RandomRange), так что вы должны быть в состоянии сделать например .:

mov bl, [cons + eax] ; read the character at index eax in cons, and place it in register bl 
+0

Спасибо, это работает. Мне все еще трудно понять, как правильно использовать регистры. –

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