Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Old_DeD
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 28
1

Как сделать цикл

22.11.2016, 16:46. Просмотров 948. Ответов 4
Метки нет (Все метки)

Здраствуйте форумчане.Решил написать кейген к крэкми, но вот задача!Для генерации ключа использовал ассемблерные вставки, как сделать цикл, чтобы он выполнялся столько раз сколько символов в слове которое ввел пользователь?Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    char name[256];
    char key[256];
    cin>>name;
    __asm{
XOR ECX,ECX
XOR EAX,EAX
MOV BL,0x1A
MOV AL,BYTE PTR[name]
ADD AL,CL
XOR AL,CL
DIV BL
SHR AX,0x8
ADD AL,0x41
MOV BYTE PTR [key],AL
        }
cout<<key<<endl;
    return 0;
}
Добавлено через 42 минуты
Мне нужно, чтобы цикл выполнил несколько раз ассемблерную вставку
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2016, 16:46
Ответы с готовыми решениями:

Как сделать цикл С++
Программа делает одно действие и выводит результат , а надо чтобы она прогоняла от x1 до x2 c шагом...

Как сделать цикл от 1 до n?
Как сделать цикл от 1 до n?

Как сделать бесконечный цикл?
Помогите переделать код так, чтобы после угадывания слова код предлагал сыграть в игру снова, а не...

Не знаю как сделать цикл
Здравствуйте! ребят, помогите решить проблему... Вот сделал программу которая закрывает...

Как сделать, чтобы switch работал как цикл?
Как сделать что бы switch работал как цикл ? Ну то есть: switch (n) case 1:break; {newfile1 ();...

4
nimazzzy
Заблокирован
22.11.2016, 16:51 2
Цитата Сообщение от Old_DeD Посмотреть сообщение
цикл, чтобы он выполнялся столько раз сколько символов в слове
C++
1
for(int i =0;i<strlen(name);++i)
strlen(name) можешь тоже в переменной сохранить.

Добавлено через 2 минуты
Судя по вставке, тебе нужно с символами из name работать. Почему ты не сделаешь цикл в прям в асме, пока не дойдешь до конца строки - нулевого символа? Ну или, просто замени цикл с индексом, на цикл с указателем. А в асме адрес используй тогда, будет еще проще.
0
Old_DeD
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 28
22.11.2016, 18:14  [ТС] 3
Хотел сделать цикл прям в ассемблерной вставке, о что то не получалось.
0
nimazzzy
Заблокирован
22.11.2016, 18:49 4
Лучший ответ Сообщение было отмечено Old_DeD как решение

Решение

Вот простенький цикл во вставке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    char name[256];
    char key[256];
    cin >> name;
    __asm {
        lea esi, name
        lea edi, key
        xor eax, eax
        jmp b_mark
    loop_start: 
        inc al                 ; любое действие над al, inc - для примера
        mov byte ptr[edi], al
        inc edi
        inc esi
    b_mark:
        mov al, byte ptr[esi]
        test eax, eax
        jnz loop_start
        mov byte ptr[edi], al
    }
    cout << key << endl;
Цикл в плюсах можно так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    char name[256];
    char key[256] = { 0 };
    cin >> name;
    for (char* c = name, *k = key; *c; ++c, ++k)
    {
        __asm {
            mov esi, dword ptr c
            mov edi, dword ptr k
            mov al, [esi]
            inc al                      ; любое действие над al, inc - для примера
            mov [edi], al
        }
    }
1
Old_DeD
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 28
26.11.2016, 11:37  [ТС] 5
Сделал так, теперь все работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
        char name[256];
        char key[256];
        cin >> name;
    __asm{
            LEA ESI,name
            LEA EDI,key
            XOR EAX,EAX
            XOR ECX,ECX
            MOV BL,0x1A
            START:
            CMP BYTE PTR DS:[ESI],0
            JE SHORT METKA
            MOV AL,BYTE PTR DS:[ESI]
            ADD AL,CL
            XOR AL,CL
            DIV BL
            SHR AX,0x8
            ADD AL,0x41
            MOV BYTE PTR DS:[EDI],AL
            INC EDI
            INC ESI
            INC ECX
            JMP START
            METKA:
            MOV BYTE PTR DS:[EDI],0
            XOR EAX,EAX
        }
cout<<key<<endl;
    return 0;
}
0
26.11.2016, 11:37
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2016, 11:37

Как сделать чтобы цикл не проходил по числам массива
Вопрос вот в чём. В своё время ув. alex white, подсказал мне как сделать, чтобы цикл проходил по...

Как сделать, чтобы цикл прошёл только по заданным числам?
Подскажите как сделать чтобы в цикле обработались только заданные числа. Нужно чтобы цикл прошёл ...

Как сделать цикл который генерирует числа состоящие из определенных цифр
В общем нужна помощь. Мне дали задачу: 1.программа должна запросить номер места(целое) 2.найти и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.