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++.