Мне дали задание транслитерировать с кириллицы на латиницу с помощью встроенного MASM. Я написал следующий код, который теперь может обрабатывать только простые звуки, такие как «а», «б» и так далее.
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <clocale>
#include <Windows.h>
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char map[33][4] = { "a",
"b"
, "v"
, "g"
, "d"
, "e"
, "z"
, "z"
, "i"
, "i"
, "k"
, "l"
, "m"
, "n"
, "o"
, "p"
, "r"
, "s"
, "t"
, "u"
, "f"
, "h"
, "c"
, "tch"
, "sh"
, "sch"
, ""
, "yy"
, ""
, "ae"
, "yu"
, "ya"
};
char str_out[160];
char str_in[80];
cin.getline(str_in, 80);
_asm
{
lea esi, str_in;
lea edi, str_out;
Process:
lods
cmp al, '\0';
je End_String;
cmp al, 223;
jb Write_Symbol;
// russian а stands for == 224
translit:
mov ebx, esi;
mov ecx, edi;
xor edi, edi;
lea esi, map;
movzx edi, al;
sub edi, 224
mov al, [esi + edi*4]; // **loads only first character**
mov esi, ebx;
mov edi, ecx;
jmp write_symbol;
Write_Symbol:
stos;
jmp Process;
End_String:
stos;
}
cout << str_out << endl;
system("pause");
return 0;
}
Но проблема начинается, когда мне нужно иметь дело со сложными звуками, такими как «тчи», «ча» и т. Д. В основном задача состоит в том, чтобы загрузить начало соответствующей строки с помощью регистров esi и edi и вызвать систему, чтобы напечатать мне строку, но я не Не понимаю, как это сделать, как загрузить адрес такой строки и вызвать системный вызов.
cout<<
) и уничтожает любые'.'
символы во входных данных. Как я уже сказал, пусть ассемблер вычисляет, на сколько байтов увеличить указатель, вместо того, чтобы делать это позже в C, чтобы пропустить заполнение. Вам также не нуженmap[33][8]
, он все еще может бытьmap[33][4]
с неявным заполнением нулями до 4 для более коротких инициализаторов строк. 01.12.2020bsr
будет хорошим способом узнать, сколько символов содержится в загруженном вами двойном слове, если они дополнены нулями, как в исходном вопросе. 01.12.2020