жаль моего слабого английскогоаварии на инструкции FPU и ассемблерный код не работает
им пытаются улучшить свои ASM способности и я нашел легко точку входа работать на нем с помощью машинного кода подпрограммы из кода на C
я использую его таким образом
char asmRoutineData2[] =
{
0xC8, 0x00, 0x00, 0x00, // enter 0, 0
0xB8, 0xff, 0x00 ,0x00 ,0x00, // mov eax, 65538
0xC9, // leave
0xc3 // ret
};
int (*asmRoutine)(void) = (int (*)(void)) asmRoutineData;
int ret = asmRoutine();
и он работает довольно отлично подходит для некоторых процедур - таких, как описано выше
некоторые другие не работают:
1) я получил проблемы, и я не могу получить значение, передаваемое стеком
такая процедура
char asmRoutine_body[] =
{
0xC8, 0x00, 0x00, 0x00, //enter
0x8B, 0x45, 0x08, // mov eax, [ebp+8]
0xC9, //leave
0xC3
};
и
int (*asmRoutine)(int, int, int) = (int (*)(int, int, int)) asmRoutine_body;
int ret = asmRoutine(77,66,55);
должен работать как далеко как я знаю, но это не
Я посмотрел в asm gener ованные от kompiler и кажутся правильными
mov eax,offset _asmRoutineData
push 55
push 66
push 77
call eax
add esp,12
_asmRoutineData label byte
db 200 //enter
db 0
db 0
db 0
db 139 // mov eax, dword [ebp+8H] ; 8B. 45, 08
db 69
db 8
db 201 //leave
db 195 //ret
не знаю, что это неправильно (возвращает значения, отличные от моей ожидаемой 77 (или 66 или 55 для EBP + 12 EBP + 16)
2) второй беда в том, что этот способ вызова машинный код работы для арифметических команд формируют меня, но он выходит из строя ( -анкету какой-то способ исключения системы) на FPU или SSE инструкции
почему? и то, что я должен сделать, чтобы заставить его работать на меня (я хотел бы написать сборку процедуры такого способа)
ель
// EDIT
это сс процедура, которая должна получить float4 * вектор а и б сделать скалярное произведение и положить результат в float4 * с (float4 это структура или таблица 4 поплавками)
(странно Couse он должен anly получить два вектора и возвращает поплавок на EAX, но я получил, если форма Интернет, возможно, не получил ни минуты дотест и переписать его)
/*
enter 0, 0 ; 0034 _ C8, 0000, 00
mov eax, dword [ebp+8H] ; 0038 _ 8B. 45, 08
mov ebx, dword [ebp+0CH] ; 003B _ 8B. 5D, 0C
mov ecx, dword [ebp+10H] ; 003E _ 8B. 4D, 10
movups xmm0, oword [eax] ; 0041 _ 0F 10. 00
movups xmm1, oword [ebx] ; 0044 _ 0F 10. 0B
mulps xmm0, xmm1 ; 0047 _ 0F 59. C1
movhlps xmm1, xmm0 ; 004A _ 0F 12. C8
addps xmm1, xmm0 ; 004D _ 0F 58. C8
movaps xmm0, xmm1 ; 0050 _ 0F 28. C1
shufps xmm1, xmm1, 1 ; 0053 _ 0F C6. C9, 01
addss xmm0, xmm1 ; 0057 _ F3: 0F 58. C1
movss dword [ecx], xmm0 ; 005B _ F3: 0F 11. 01
leave ; 005F _ C9
ret ; 0060 _ C3
*/
char asmDot_body[] =
{
0xC8, 0x00, 0x00, 0x00,
0x8B, 0x45, 0x08,
0x8B, 0x5D, 0x0C,
0x8B, 0x4D, 0x10,
0x0F, 0x10, 0x00,
0x0F, 0x10, 0x0B,
0x0F, 0x59, 0xC1,
0x0F, 0x12, 0xC8,
0x0F, 0x58, 0xC8,
0x0F, 0x28, 0xC1,
0x0F, 0xC6, 0xC9, 0x01,
0xF3, 0x0F, 0x58, 0xC1,
0xF3, 0x0F, 0x11, 0x01,
0xC9,
0xC3
};
void (*asmAddSSE)(float4*, float4*, float4*) = (void (*)(float4*, float4*, float4*)) asmDot_body;
float4 a = {1,2,1,0};
float4 b = {1,2,3,0};
float4 c = {0,0,0,0};
asmAddSSE(&a,&b,&c);
// EDIT l8r
нашел!и это работает экстремально круто & большие (проходящие аргументы, а также FPU и даже сс) Im счастливых
TNX necrolis для заявив, что она работает на системе Yr,
Я начал пробовать с компилятором переключатели tử набора до выравнивания и также отключить некоторые, и это было -pr (использование азЬсаЙ), который был enebled и я должен отключить его
(получил два compile.bat-х - один для нормальной компиляции и вторых для Olso порождающего узла и нет -pr в секунд, так что код asm, который я написал abowe, в порядке - но у меня нормальный compile.bat сгенерированный fastcall вызывает ant it go bum!)
Вы не используете ассемблер. Вы пишете машинный код. Получите сборщик. –
Это может привести к запуску: http://unixwiz.net/techtips/win32-callconv-asm.html –
Как насчет того, чтобы пошаговую инструкцию по команде в отладчике? Это скажет вам, что не так с вашим кодом. –