Kandarim wrote:oh, and the likes of people that call MATLAB a programming language. Don't forget those.
To be fair, anyone who has written anything large in Matlab should be given a medal for his labors and sufferings. Similar to *****. ^^
trungdle wrote:Seriously, I know assembly is good but ones don't really use them alone anymore in nowaday big and complex programs. Why not C++? Same thing, better uses.
Directly from the server code:
- Code: Select all
#if defined __x86_64__
#define _SPATCHFUN(_rtype, _name, _args...) \
_rtype _name (_args); \
extern char _pfun_ ## _name ## _bits; \
asm(".pushsection .genfuns,\"awx\",@progbits;" \
".type " # _name ", @function;" \
".type _pfun_" # _name "_bits, @function;" \
"_pfun_" # _name "_bits:" \
"movq $0xfedcba9876543210, %r11;" \
"call 0f;" \
# _name ":" \
"movq $0xfedcba9876543210, %r11;" \
"jmpq *%r11;" \
"0: sub $0xb8, %rsp;" \
"mov %rax, (%rsp);" \
"mov %rdi, 0x08(%rsp);" \
"mov %rsi, 0x10(%rsp);" \
"mov %rdx, 0x18(%rsp);" \
"mov %rcx, 0x20(%rsp);" \
"mov %r8, 0x28(%rsp);" \
"mov %r9, 0x30(%rsp);" \
"movaps %xmm0, 0x38(%rsp);" \
"movaps %xmm1, 0x48(%rsp);" \
"movaps %xmm2, 0x58(%rsp);" \
"movaps %xmm3, 0x68(%rsp);" \
"movaps %xmm4, 0x78(%rsp);" \
"movaps %xmm5, 0x88(%rsp);" \
"movaps %xmm6, 0x98(%rsp);" \
"movaps %xmm7, 0xa8(%rsp);" \
"mov 0xb8(%rsp), %rdi;" \
"sub $(" # _name " - _pfun_" # _name "_bits), %rdi;" \
"callq *%r11;" \
"mov (%rsp), %rax;" \
"mov 0x08(%rsp), %rdi;" \
"mov 0x10(%rsp), %rsi;" \
"mov 0x18(%rsp), %rdx;" \
"mov 0x20(%rsp), %rcx;" \
"mov 0x28(%rsp), %r8;" \
"mov 0x30(%rsp), %r9;" \
"movaps 0x38(%rsp), %xmm0;" \
"movaps 0x48(%rsp), %xmm1;" \
"movaps 0x58(%rsp), %xmm2;" \
"movaps 0x68(%rsp), %xmm3;" \
"movaps 0x78(%rsp), %xmm4;" \
"movaps 0x88(%rsp), %xmm5;" \
"movaps 0x98(%rsp), %xmm6;" \
"movaps 0xa8(%rsp), %xmm7;" \
"add $0xb8, %rsp;" \
"ret;" \
".popsection;" \
);
#define _PATCHFUN(_rtype, _name, _args...) \
_SPATCHFUN(_rtype, _name, _args); \
asm(".globl " # _name ";");
#elif defined __i386__
#define _SPATCHFUN(_rtype, _name, _args...) \
_rtype _name (_args); \
extern char _pfun_ ## _name ## _bits; \
asm(".pushsection .genfuns,\"awx\",@progbits;" \
".type " # _name ", @function;" \
".type _pfun_" # _name "_bits, @object;" \
# _name ":" \
"_pfun_" # _name "_bits:" \
"jmp 0;" \
".popsection;" \
);
#define _PATCHFUN(_rtype, _name, _args...) \
_SPATCHFUN(_rtype, _name, _args); \
asm(".globl " # _name ";");
#else
#error "no function-patching implemented on this architecture"
#endif
I'd like to see you do the same in C or C++.