Oбрaзовaть стpокy, пoвтоpив фpaгмeнт исxоднoй cтpоки c задaннoй пoзиции дaннoй длины...

0 голосов
49 просмотров

Oбрaзовaть стpокy, пoвтоpив фpaгмeнт исxоднoй cтpоки c задaннoй пoзиции дaннoй длины требyемоe чиcлo paз.

Программа на с++,функция должна быть написана с ассемблерной вставкой
Помогите, пожалуйста


Информатика (12 баллов) | 49 просмотров
0

Но только силами ассемблера.

0

Задача достаточно простая и носит только учебный характер. На практике это бред)

0

Да! Ты правильно сказал... еще может быть передача через стек, а не через память

0

И это даже проще! Потому что аргументы для С/С++ функций хранятся в стеке.

0

В 2050?) Я так заработался, что пропустил 34 года?) Ассемблер, мне кажется, довольно органичный язык. Хотя за многим там нужно следить тщательно, но это не большая цена за возможности, которые он предоставляет.

0

Вырос на С без классов, поэтому на ассемблер было перейти достаточно просто. Да, он становится немного неактуальным в связи с развитием как раз таки java. Потому что байт-код все таки безопаснее исполняется, чем программы на включаемых языках (т.е. где есть include). В реальном режиме работы процессора все еще менее безопасно, потому что прерывания...

0

Однако драйвера пишутся до сих пор на С, да на asm. Легкий доступ к WinAPI. Легкий доступ к регистрам. Остается только надеяться, что с появлением достойных мануалов и расширением команд в х64 процессорах асм снова обретет поклонников.

0

А автор темы... детализируйте свое задание. Много непонятных моментов.

Дан 1 ответ
0 голосов

Думаю, что-то типа того.

#include
#include

using namespace std;

int main()
{
    const int n = 100;
    char *C = new char[n];
    int p // позиция
    int l // длина
    int k // повторения

    cout << "String C: ";<br>    cin >> C;
    cout << "Pos: ";<br>    cin >> p; p--;
    cout << "Length: ";<br>    cin >> l;
    cout << "N: ";<br>    cin >> k;
    char *V = new char[l*k+1];

    if ((p >= 0) && (l > 0) && (k > 0) && ((strlen(C) - p) >= l) && (p <= strlen(C))) //проверка ввода<br>    {
        __asm
        {
            mov ebx, k;           // количество повторений
            mov edi, V         // адрес приёмника
            m1 : cmp   ebx, 0  // сравнение
                 je   exit1    // если EBX = 0, то переход на exit1
                 mov   ecx, l  // длина строки
                 mov   esi, C  // адрес источника
                 add   esi, p  // с заданной позиции
             m2 :
                mov al, [esi]    //из ESI
                mov [edi], al    // запись в EDI
                inc edi            // EDI+1
                inc esi            // ESI+1
                loop  m2        // цикл EСХ раз
                dec ebx         // EBX-1
                jmp m1             // переход на m1
            exit1 : mov[edi], 0
        }

        cout << "\nV: ";<br>        cout << V << endl;<br>    }

    else cout <<  "\nError " << endl;<br>
    system("pause");
}

(9.6k баллов)
0

здесь же просто вставка, а не функция... хотя если человек хоть немного знает тему, то преобразовать ничего не стоит...

0

Спасибо вам большое! То, что нужно, можно без функции