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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2010, 16:18   #1
Flay
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 26
По умолчанию Перевод из асм в с++

Уважаемые форумчане, помогите решить возникшую проблемму перевода асм кода на с++.

Имеется рабочая прога:
Код:
		mov	c_table1, 0
		mov	byte ptr [x1], 1
label1:		mov	byte ptr [x2], 1
label2:		mov	cl, byte ptr [x2]
		mov	al, byte ptr [x1]
		xor	bl, bl
		mov	dl, 8

label3:		add	dl, 0FFh
		test	cl, 1
		jz	short label4
		xor	bl, al

label4:		test	al, al
		jns	short label5
		add	al, al
		xor	al, 1Bh
		jmp	short label7

label5:		add	al, al

label7:		shr	cl, 1
		test	dl, dl
		jnz	short label3
		cmp	bl, 1
		jz	short label6
		add	[x2], 1
		jmp	short label2
label6:
		mov	eax, [x1]
		mov	cl, byte ptr [x2]
		lea	edi,c_table1
		add	edi,eax
		mov	byte ptr [edi], cl
		add	eax, 1
		cmp	al, 0FFh
		mov	byte ptr [x1], al
		jbe	short label1
		retn
пробую перевести на с++:
Код:
		unsigned __int8 num1, num2, al,cl;
		__int8 x0;
		num1 = 1;
		num2 = 1;

		while(num1 < 255)
		{
			num2 = 1;
			for (1;1;++num2)
			{
				x0 = 0;
				cl = num2;
				al = num1;
				for (int i=0; i<8; ++i)
				{
					if (cl&1) x0 ^= al;
					if (al > 0) { al = (al*2) ^ 0x1B;}	else { al*=2; }
					cl = cl>>1;
				}
				if (x0 == 1) break;
				++num2;
			}

			c_table1[num1] = num2;
			++num1;
		}
но в c_table1 у меня получаются все единицы, а должны быть:
0, 1, 141, 246, 203...
Flay вне форума Ответить с цитированием
Старый 15.09.2010, 20:51   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

al, кажется, надо signed, а тут условие al > 0 всегда верно.
Код:
cmp	al, 0FFh
mov	byte ptr [x1], al
jbe	short label1
Я туплю или
(unsigned) al <= 255
этот переход всегда выполняется и получается бесконечный цикл?

Последний раз редактировалось Somebody; 15.09.2010 в 21:12.
Somebody вне форума Ответить с цитированием
Старый 15.09.2010, 22:10   #3
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
al, кажется, надо signed, а тут условие al > 0 всегда верно.
Код:
cmp	al, 0FFh
mov	byte ptr [x1], al
jbe	short label1
Я туплю или
(unsigned) al <= 255
этот переход всегда выполняется и получается бесконечный цикл?
Дык в eax то перед этим неведомо что. Счетчик наверно (прогу целиком не смотрел).

UPD:
Flay: Такой код ничем не поможет? Особливо obrat_table ..
Код:
    /**
     * Таблица умножения чисел в поле Галуа GF(256).
     */
    private static final int[][] mult_table;
    private static final int[] obrat_table;
    static {
        mult_table = new int[256][256];
        obrat_table = new int[256];
        for (int i = 0; i < 256; i++)
            for (int j = 0; j < 256; j++){
                if (i%2==0) {
                    mult_table[i][j]=mult_table[i>>1][j]<<1;
                    if (mult_table[i][j]>255) mult_table[i][j]^=0x11B;
                } else
                    mult_table[i][j]=mult_table[i-1][j]^j;
                if (mult_table[i][j]==1) obrat_table[i]=j;
            }
    }
Чтобы понять рекурсию, сперва нужно понять рекурсию.

Последний раз редактировалось Tronix; 15.09.2010 в 22:58.
Tronix вне форума Ответить с цитированием
Старый 17.09.2010, 15:25   #4
Flay
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Код:
cmp	al, 0FFh
mov	byte ptr [x1], al
jbe	short label1
Я туплю или
(unsigned) al <= 255
этот переход всегда выполняется и получается бесконечный цикл?
на строку выше add eax,1 в итоге 255 раз выполнится кусок кода
Flay вне форума Ответить с цитированием
Старый 17.09.2010, 15:48   #5
Flay
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 26
По умолчанию

Добил я этот кусок кода:
Код:
		__int8 al;
		unsigned __int8 num1, num2,dl;

		unsigned __int8 x0;
		
		num1 = 1;
		num2 = 1;
		
		while(num1 < 255)
		{
			num2 = 1;
			for (1;1;num2++)
			{

				dl = num1;
				x0 = 0;
				al = num2;
				for (int i=0; i<8; ++i)
				{
					if (dl&1 == 1) x0 ^= al;
					if (al < 0) { al = (al*2) ^ 0x1B;}	else { al*=2; }
					dl = dl>>1;
				}
				if (x0 == 1) break;
			}

			c_table1[num1] = num2;
			num1++;
		}
Flay вне форума Ответить с цитированием
Старый 17.09.2010, 16:11   #6
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

И? Заработало?
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 18.09.2010, 21:05   #7
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

Гаспада я както читал книгу по С++ билдер в ней есть раздел диспетчерезации. Так вот перед началом вообще чегото стоящего нужно взять бумагу и ручку и написать список того как в общих чертах будет работать ваша прога..

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

1 предусмотрите список действий для быстрых кнопок инструментальных панелей, разделов меню, кнопок и других элементов.
2 для каждого действия подготовьте набор характеристик Name (имя), Caption (надпись), Short Cut (горячие кнопки), Hint (текст подсказок), Help Context или Help Keyword (ссылки на тему справки) и многое другое.
3 для каждого действия готовится алгоритм его работы (не важно какой язык или компилятор) при составлении алгоритма он изучается на предмет одинаковых блоков - что в последствии можно выделить в обработку функций или подпрограмм
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен программист С, АСМ SGkod Фриланс 1 19.05.2010 19:29
Умножение массивов Паскаль+АСМ xVxSeRGxVx Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 24 21.02.2010 14:11
Требуеться АСМ программист worldhero Фриланс 2 28.10.2009 07:59
Перевод из HEX в АСМ PaperPlane Софт 12 30.04.2009 03:05
Двоичная система в АСМ.. smileman Помощь студентам 3 05.11.2008 13:40