Select 使用索引从字符串中提取单个字符?
Select single char from string using index?
我正在尝试获取此操作的 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
每个字符都是一个字节,所以只需用您的索引偏移数组的基址即可。
您的索引似乎在 eax
中(RandomRange
中的 return 值),因此您应该能够执行例如:
mov bl, [cons + eax] ; read the character at index eax in cons, and place it in register bl
我正在尝试获取此操作的 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
每个字符都是一个字节,所以只需用您的索引偏移数组的基址即可。
您的索引似乎在 eax
中(RandomRange
中的 return 值),因此您应该能够执行例如:
mov bl, [cons + eax] ; read the character at index eax in cons, and place it in register bl