Я пытаюсь получить версию ассемблерного кода этого действия в 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] << "";
}
}
У меня все практически сделано для асма. Но я все еще не могу заставить этот раздел работать или перевести его.
;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 ENDPCharSelector 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 asmcall WriteStringexit
STEP3: ;block chooses cons index
mov eax, 21
call RandomRange
mov rndCons, eax
exit
CharSelector ENDPend main
Символы по одному байту, поэтому просто сместите базовый адрес массива с вашим индексом.
Кажется, у вас есть свой индекс в eax
(возвращаемое значение из RandomRange
), так что вы должны быть в состоянии сделать, например:
mov bl, [cons + eax] ; read the character at index eax in cons, and place it in register bl
Других решений пока нет …