Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Aleksandr N
Дата сообщения: 29.09.2011 21:02
Ещё один вопрос.
Помогите перевести на нормальный C++, чтобы можно было откомпилировать на 64-бит.

unsigned int BSwap(unsigned int Num)
{
    _asm {
        mov eax, Num
        bswap eax
        mov Num, eax
    }

    return Num;
}

Спасибо.
Автор: bomzzz
Дата сообщения: 29.09.2011 21:07
Aleksandr N
даже не знаю стоит ли на си переделывать. яне знаю как ассемблерную вставку на си делать но врядли сложно, там даже синтаксис специальный попадался


http://it-library.org/articles/?c=7&&a=308

это тебе надо шестнадцатиричную константу и формулу написать с логическими операциями, если анологичного оператора нет в Си

Добавлено:

Цитата:
unsigned int BSwap(unsigned int Num)

так это у тебя и есть вставка.
Автор: Aleksandr N
Дата сообщения: 29.09.2011 21:57
bomzzz
Я-же говорил, С++ я не знаю, пытаюсь перекомпилировать чужую библиотеку, а на этой функции затыка... А ругается на АСМу

"error C4235: использовано нестандартное расширение: ключевое слово "_asm" данной архитектурой не поддерживается"

и т.д. по коду.
Автор: bomzzz
Дата сообщения: 29.09.2011 22:00
ну вот на картинки нужно шестнадцатиричное число целое переделкать - биты перетусовать как на картинки. перетасуй без асма.больше эта вставка ничего не делает

Добавлено:
Num переменная передаваемая в вставку - общая константа с подпрограммой
mov eax, Num - значение переменной помещается в регистр eax
bswap eax - значение регистра преобразуется командой bswap см картинку
mov Num, eax - новое значение регистра присваевается перменной
конеч

Добавлено:
eax 32 битный регистр такова и размерность константы видимо

Добавлено:
тебенадо на Си сделать логической операцией AND например так чтоб вырезать только младшую часть байта и вставить на нудное место нового значения ну и так далее
Автор: Aleksandr N
Дата сообщения: 29.09.2011 22:07
bomzzz
Да смысл понятен, я конкретнее хотел.
Автор: ValidolX
Дата сообщения: 29.09.2011 22:18

Цитата:

Помогите перевести на нормальный C++, чтобы можно было откомпилировать на 64-бит.


какой у вас компилятор?
если с VS - тогда ой - МС выкинула на помойку ассемблерные вставки в 64 бит компиляторе. Оставила только какие то интринсики (intrinsics)
можно - но надо писать отдельно модуль .asm и включать в проект (надо перепроверить)
Автор: bomzzz
Дата сообщения: 29.09.2011 22:26
можно дллку написать это просто. только вот про 64 асм я чета даже не слыхал, возникают вопросы иногда, но чета сведений никаких не попадалось

Добавлено:
железо развивается быстро. если все начнут на асме программы писать, что с железом делать, винду уже до трех гиг раздули.
Автор: Aleksandr N
Дата сообщения: 29.09.2011 22:38
ValidolX
MVS 2010, библиотека написана на C++
Автор: ValidolX
Дата сообщения: 29.09.2011 23:10
Aleksandr N
http://msdn.microsoft.com/en-us/library/wbk4z78b.aspx
(нету больше asm вставок для x64 !!)

я делал так - заводил отдельно модуль .asm, включал его в проект
и там писал функцию на асме используя x64 регистры
пример

; -----------------------------------------------------------------------------
;
; -----------------------------------------------------------------------------

option casemap:none

;.model flat, C

.code

; -----------------------------------------------------------------------------
F_SetKey proc

arg_0_KSchedule    = dword    ptr 4
arg_4_pKey    = dword    ptr 8

        mov    edx, [esp+arg_4_pKey]
        push    rbx
        mov    ebx, [esp+4+arg_0_KSchedule]
        push    rsi
........


F_SetKey    endp

.........

; ------------------------------------------------------------------------------

PUBLIC F_SetKey ; F_SetKey( KS, pKey )

end
Автор: Aleksandr N
Дата сообщения: 29.09.2011 23:44
ValidolX
Спасибо, попробую. Может ещё что на наших просторах нарою по аналогии.
Автор: karakurt2
Дата сообщения: 30.09.2011 03:48
ValidolX
странно, что у Вас это заработало.
в 64-разрядной архитектуре Windows параметры передаются через регистры

вот ещё пример 64-разрядного модуля на ассемблере:


Код:

.code

public foo

foo:
xorpd xmm2,xmm2
xor eax,eax
movapd xmm1,xmm2
test ecx,ecx
je @L5
xchg ax,ax
@L1:
    movsd xmm0,mmword ptr [rdx]
dec ecx
comisd xmm0,xmm2
jbe @L4
test eax,eax
je @L2
comisd xmm1,xmm0
jbe @L4
jmp @L3
@L2:
    mov eax,1
@L3:
    movapd xmm1,xmm0
@L4:
    add rdx,8
test ecx,ecx
jne @L1
test eax,eax
je @L5
movsd mmword ptr [r8],xmm1
@L5:
    ret

end

Автор: Qraizer
Дата сообщения: 30.09.2011 06:10
alls2011, выкинь это старьё. VS 6 два Стандарта назад вышел. Он не только такие конструкции не держит, но и чем попроще давится.
Вообще, попробуй в typedef-ах к именам функциям & добавить. И проверь, что они вообще объявлены.
Aleksandr N, как же так? Языка не знаешь, а портировать на 64 бита пробуешь. Не пробовал уезжать в забугорье, не зная местного языка?
Что хоть за компилятор? В Стандарте ключевым словом является asm. Так же им разрешается реализациям заводить расширения Стандарта словами, начинающимися на двойной подчерк. Ни под то, ни под другое _asm не подходит.
Автор: xliker
Дата сообщения: 30.09.2011 10:44
Здравствуйте. Поступила задача разбить на цифры 8-ричное число, используя поразрядные логические операции. Подтолкните в правильном направлении пожалуйста, ибо у меня возникли затруднения в этом вопросе. Спасибо.
Автор: bomzzz
Дата сообщения: 30.09.2011 12:41
111 - три бита 8 ричная цифра


101101 AND 000111 = 000101 первая восьмиричная цифра
101101 AND 111000 = 101000 вторая восьмиричная цифра но еще надо сместить на три разряда в право значение, это если оператора нет можно делением сделать
Автор: akaGM
Дата сообщения: 30.09.2011 14:42
xliker
подталкиваю:

Код:
unsigned char OCT_DIGITS[8] = {0,1,2,3,4,5,6,7};
unsigned char digits[12];
unsigned long i, L;

L = 90;
printf("%o\n", L);

for (i = 0; i <= 11; i++) {
digits[i] = OCT_DIGITS[L & 7];
printf("%1u\n", digits[i]);
L >>= 3;
}
Автор: xliker
Дата сообщения: 02.10.2011 18:57
bomzzz, akaGM, спасибо, вроде понял, однако работает некорректно программа, после сдвига получается несколько не то, что хотелось бы. Где опять я накосячил? (Нужно удалить из восьмеричного числа типа unsigned long цифры 3-5):

Код:
void main()
{
unsigned long a,b=0;
int k,i=0;
printf("\nВведите число: ");
scanf("%luo", &a);

while(a>0)
{
k=a&7;
if ((k<3)||(k>5))
{
b+=pow(8,i)*k;
i++;
}
a>>3; // после выполнения этого сдвига переменная a неправильно меняется
}
printf("\n%lu",b);
getch();
}
Автор: bomzzz
Дата сообщения: 02.10.2011 19:04
я к сожалению Си не знаю. в школе бейсик учил, несколько раз учебник пытался читать - как китайская грамота, а вот ассемблер это мое. я вообще арифметического синтаксиса не понимаю в данном случае, в чем алгоритим состоит не вижу.
лучше было использовать ассемблерную вставку с точки зрения быстродействия

Добавлено:
а вот кто паскаль учил все Си потом переучивали
Автор: Abs62
Дата сообщения: 02.10.2011 19:13
xliker

Цитата:
a>>3; // после выполнения этого сдвига переменная a неправильно меняется

После этого сдвига переменная не меняется вообще. Чему присваивается результат операции сдвига?
Автор: xliker
Дата сообщения: 02.10.2011 19:47
Abs62, я извиняюсь, неправильно скопипастил.
Пробовал a>>=3 и a=a>>3, выходило не так как должно.
Автор: Abs62
Дата сообщения: 02.10.2011 20:11
xliker
А как должно? Что на входе, проверял? Потому как читается у тебя число по формату %lu - длинное беззнаковое десятичное, а не восьмеричное. Чтение восьмеричного - это %lo, а не %luo.
Автор: xliker
Дата сообщения: 02.10.2011 20:21
Abs62, премного благодарен! Неправильно задавал спецификацию ввода, исправил - теперь работает как надо!
Автор: V0lt
Дата сообщения: 10.10.2011 21:29
Пожалуйста, объясните почему этот код не работает?

Код: LPTSTR str;
GetWindowText(str, GetWindowTextLength());
Автор: Abs62
Дата сообщения: 10.10.2011 21:50
V0lt

Цитата:
Пожалуйста, объясните почему этот код не работает?

Надо полагать потому, что LPTSTR - это на самом деле CHAR* (или WCHAR* при компиляции в юникод). Сам буфер, который нужен функции GetWindowText(LPTSTR, int), за программиста никто выделять не будет.
Автор: V0lt
Дата сообщения: 10.10.2011 22:25
Abs62
Спасибо, допер.
Что интересно, первый вариант тихо не работает в релизе и выдает ошибку в дебаге. А если объявить строку как LPTSTR str = NULL;, то и в дебаге будет молчать и не работать.

Сделал так:

Код: int slen = GetWindowTextLength() + 1;
LPTSTR str = new WCHAR[slen];
GetWindowText(str, slen);
Автор: Molniev
Дата сообщения: 10.10.2011 22:32
CString это обертка над wchar_t/WCHAR. Незначительно падение производительности в обмен на удобство использования.
Автор: V0lt
Дата сообщения: 10.10.2011 23:08
Еще немного уточнений

Код: CString s = _T("ABC");
LPCTSTR lp = (LPCTSTR) s;
s = _T("xyz");
Автор: Aleksandr N
Дата сообщения: 11.10.2011 20:07
Ещё раз прошу помощи. Нужно перевести с С++ на Delphi(Pascal). Сам вроде-бы перевёл, но что-то не складывается.

typedef struct tagFRAMEINFO
{
REFERENCE_TIME time;
LONGLONG offset;
LONG size;
struct tagFRAMEINFO * before;
struct tagFRAMEINFO * next;
} FRAMEINFO;

extern FRAMEINFO frameinfo = {0,0,NULL};

Перевёл так:

type
PFrameInfo = ^TFrameInfo;
TFrameInfo = record
Time: REFERENCE_TIME;
Offset: Int64;
Size: Longint;
Before: PFrameInfo;
Next: PFrameInfo;
end;

Правильно???

Спасибо.
Автор: akaGM
Дата сообщения: 11.10.2011 20:09
Aleksandr N
правильно, если правильно определён тип REFERENCE_TIME
Автор: Aleksandr N
Дата сообщения: 11.10.2011 20:22
akaGM
Получается, если на С++

FRAMEINFO * currentframe;

на Delphi получится

currentframe: TFrameInfo;

???
Просто на С++ идёт обращение к "FRAMEINFO", а не к "tagFRAMEINFO" или ошибаюсь...
Автор: akaGM
Дата сообщения: 11.10.2011 20:47
Aleksandr N

Цитата:
FRAMEINFO * currentframe;

на Delphi получится

currentframe: TFrameInfo;

на дельфи получается

currentframe: PFrameInfo

в остальном у тебя всё правильно написано...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.