Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2011, 19:47   #1
Pecho
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 37
По умолчанию Использование Asm в Qt Creator

Доброго времени суток, дорогие форумчане!
На бескрайних просторах Рунета наткнулся на сию замечательную статью. Естественно, захотелось реализовать написанное автором.
Разница в среде программирования (автор статьи использовал Visual Studio 6.0, я же сейчас юзаю Qt Creator) сказалась. Если переделки в Сишном коде были не более чем косметическими, то с Asm'ом случилась беда, запускаться тот код не захотел. Конкретика - в прикреплённом скрин-шоте.
Т.к. asm знаю хуже чем плохо, а разобраться с этим кодом уж очень хочется, то взываю к вашей помощи!
Научите, что вызвало эти ошибки, и как их исправить?
Код:
#include <stdio.h>
#include <string.h>
 
int main(int argc, char *argv[])
{
 
    int i=0, k=0;
    static char szPass[256]; //Буффер, в котором хранится текущий пароль
 // обнулим буффер
    for (i=0; i<sizeof(szPass); i++) {
        szPass[i]=NULL;
    }
 
    static char szAlf[256]; //Алфавит, т.е. набор символов для перебора
    strcpy(szAlf,"ABC"); //Для примера запишем в алфавит "ABC"
 
    static unsigned char bAlf[256]; //Таблица, благодаря которой один символ будет "связан" со следующим
 
// обнулим таблицу
    for (i=0; i<sizeof(bAlf); i++) {
        bAlf[i]=NULL;
    }
//проинициализируем таблицу
    while (true) {
        bAlf[k]=(unsigned char)szAlf[i];
        if(!szAlf[i])
            break;
        k=(unsigned char)szAlf[i];
        i++;
    }
 
    while(true) {
        __asm {
                    pushad
 
                    mov edi,offset szPass
                    mov ebx,offset bAlf
                L1: movzx eax,byte ptr [edi]
                    xlat
                    //movzx eax,byte ptr [bAlf+edi]
                    cmp al,0
                    je L3
                    mov [edi],al
                    jmp L5
 
                L3: xlat
                    stosb
                    jmp L1
 
                L5: popad
        }
        printf("%s\n",szPass);
    }
 
    return 0;
}
З.Ы. Вот и до Asm'а доберусь, начну с вашей помощью с ним разбираться
Изображения
Тип файла: jpg asm.jpg (81.1 Кб, 160 просмотров)
Pecho вне форума Ответить с цитированием
Старый 23.11.2011, 11:17   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Научите, что вызвало эти ошибки, и как их исправить?
1. Понять, что IDE и компилятор суть разные вещи.
2. Понять, что у разных компиляторов асма разный синтаксис и оформление.
3. Понять, что Microsoft Compiler и Gnu Compiler различаются не только названиями.
...
p51x вне форума Ответить с цитированием
Старый 23.11.2011, 12:44   #3
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

И понять, что надо поставить хотя бы MSVC++ 2008 Express, а в настройках нового проекта вручную указать цели сборки, где и выбрать VC++ 2008, вместо MinGW
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 23.11.2011, 12:57   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

А вдруг ТС именно ГЦЦ освоить решил...
p51x вне форума Ответить с цитированием
Старый 25.11.2011, 00:45   #5
Pecho
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 37
По умолчанию

Благодарю за идею с MSVC++, там всё заработало
Но всё-таки да, решил GCC освоить
Допустим, у меня такой код:
Код:
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{

    int i=0, k=0;
    static char szPass[256]; //Буффер, в котором хранится текущий пароль
 // обнулим буффер
    for (i=0; i<sizeof(szPass); i++) {
        szPass[i]=NULL;
    }

    static char szAlf[256]; //Алфавит, т.е. набор символов для перебора
    strcpy(szAlf,"ABC"); //Для примера запишем в алфавит "ABC"

    static unsigned char bAlf[256]; //Таблица, благодаря которой один символ будет "связан" со следующим

// обнулим таблицу
    for (i=0; i<sizeof(bAlf); i++) {
        bAlf[i]=NULL;
    }
//проинициализируем таблицу
    while (true) {
        bAlf[k]=(unsigned char)szAlf[i];
        if(!szAlf[i])
            break;
        k=(unsigned char)szAlf[i];
        i++;
    }

    while(true) {
        asm (
                    "pushfq\n\t"

                    "movq  $szPass, %rdi\n\t"
                    "movq $bAlf, %rbx\n\t"
                "L1: movzxb (rdi), %rax\n\t"
                    "xlat\n\t"

                    "cmp $0, %al\n\t"
                    "je L3\n\t"
                    "movb %al, (%rdi)\n\t"
                    "jmp L5\n\t"

                "L3: xlat\n\t"
                    "stosb\n\t"
                    "jmp L1\n\t"

                "L5: popfq\n\t"
        );
        printf("%s\n",szPass);
    }

    return 0;
}
Выдаются следующие предупреждения:
undefined reference to `szPass'
undefined reference to `bAlf'
undefined reference to `rdi'
И следующая ошибка:
error: collect2: ld returned 1 exit status

Внимание, уважаемые знатоки, вопрос!
Как это исправить, где в коде ошибки?
Pecho вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Qt creator 2.0.1 Hemul Qt и кроссплатформенное программирование С/С++ 12 26.02.2011 17:48
Использование asm процедуры в Delphi Alex1991 Общие вопросы Delphi 4 08.02.2011 12:50
Qt Creator BioS Qt и кроссплатформенное программирование С/С++ 1 23.06.2010 06:50
QT Creator mirawoo Общие вопросы C/C++ 2 23.08.2009 16:09