| |
| #include <stdio.h> |
| |
| void do_pushb_pos ( void ) |
| { |
| unsigned int block[3]; |
| __asm__ __volatile__ ( |
| "movl %0, %%edx\n\t" |
| "pushl $0x55555555\n\t" |
| "movl %%esp, 0(%%edx)\n\t" |
| ".byte 0x6A,0x22\n\t" |
| "movl %%esp, 4(%%edx)\n\t" |
| "popl %%eax\n\t" |
| "movl %%eax,8(%%edx)\n\t" |
| "movl 0(%%edx),%%esp\n\t" |
| "addl $4, %%esp" |
| : : "r"(&block) : "eax","edx","cc","memory" |
| ); |
| printf(" pushb_pos: delta %d, top32 0x%08x\n", |
| block[0] - block[1], block[2]); |
| } |
| |
| void do_pushb_neg ( void ) |
| { |
| unsigned int block[3]; |
| __asm__ __volatile__ ( |
| "movl %0, %%edx\n\t" |
| "pushl $0x55555555\n\t" |
| "movl %%esp, 0(%%edx)\n\t" |
| ".byte 0x6A,0xEE\n\t" |
| "movl %%esp, 4(%%edx)\n\t" |
| "popl %%eax\n\t" |
| "movl %%eax,8(%%edx)\n\t" |
| "movl 0(%%edx),%%esp\n\t" |
| "addl $4, %%esp" |
| : : "r"(&block) : "eax","edx","cc","memory" |
| ); |
| printf(" pushb_neg: delta %d, top32 0x%08x\n", |
| block[0] - block[1], block[2]); |
| } |
| |
| void do_pushw_pos ( void ) |
| { |
| unsigned int block[3]; |
| __asm__ __volatile__ ( |
| "movl %0, %%edx\n\t" |
| "pushl $0x55555555\n\t" |
| "movl %%esp, 0(%%edx)\n\t" |
| "pushw $0x3344\n\t" |
| "movl %%esp, 4(%%edx)\n\t" |
| "popl %%eax\n\t" |
| "movl %%eax,8(%%edx)\n\t" |
| "movl 0(%%edx),%%esp\n\t" |
| "addl $4, %%esp" |
| : : "r"(&block) : "eax","edx","cc","memory" |
| ); |
| printf(" pushw_neg: delta %d, top32 0x%08x\n", |
| block[0] - block[1], block[2]); |
| } |
| |
| void do_pushw_neg ( void ) |
| { |
| unsigned int block[3]; |
| __asm__ __volatile__ ( |
| "movl %0, %%edx\n\t" |
| "pushl $0x55555555\n\t" |
| "movl %%esp, 0(%%edx)\n\t" |
| "pushw $0xDDCC\n\t" |
| "movl %%esp, 4(%%edx)\n\t" |
| "popl %%eax\n\t" |
| "movl %%eax,8(%%edx)\n\t" |
| "movl 0(%%edx),%%esp\n\t" |
| "addl $4, %%esp" |
| : : "r"(&block) : "eax","edx","cc","memory" |
| ); |
| printf(" pushw_pos: delta %d, top32 0x%08x\n", |
| block[0] - block[1], block[2]); |
| } |
| |
| void do_pushl_pos ( void ) |
| { |
| unsigned int block[3]; |
| __asm__ __volatile__ ( |
| "movl %0, %%edx\n\t" |
| "pushl $0x55555555\n\t" |
| "movl %%esp, 0(%%edx)\n\t" |
| "pushl $0x67675656\n\t" |
| "movl %%esp, 4(%%edx)\n\t" |
| "popl %%eax\n\t" |
| "movl %%eax,8(%%edx)\n\t" |
| "movl 0(%%edx),%%esp\n\t" |
| "addl $4, %%esp" |
| : : "r"(&block) : "eax","edx","cc","memory" |
| ); |
| printf(" pushl_pos: delta %d, top32 0x%08x\n", |
| block[0] - block[1], block[2]); |
| } |
| |
| void do_pushl_neg ( void ) |
| { |
| unsigned int block[3]; |
| __asm__ __volatile__ ( |
| "movl %0, %%edx\n\t" |
| "pushl $0x55555555\n\t" |
| "movl %%esp, 0(%%edx)\n\t" |
| "pushl $0x98988787\n\t" |
| "movl %%esp, 4(%%edx)\n\t" |
| "popl %%eax\n\t" |
| "movl %%eax,8(%%edx)\n\t" |
| "movl 0(%%edx),%%esp\n\t" |
| "addl $4, %%esp" |
| : : "r"(&block) : "eax","edx","cc","memory" |
| ); |
| printf(" pushl_neg: delta %d, top32 0x%08x\n", |
| block[0] - block[1], block[2]); |
| } |
| |
| |
| void do_66pushb_pos ( void ) |
| { |
| unsigned int block[3]; |
| __asm__ __volatile__ ( |
| "movl %0, %%edx\n\t" |
| "pushl $0x55555555\n\t" |
| "movl %%esp, 0(%%edx)\n\t" |
| ".byte 0x66,0x6A,0x22\n\t" |
| "movl %%esp, 4(%%edx)\n\t" |
| "popl %%eax\n\t" |
| "movl %%eax,8(%%edx)\n\t" |
| "movl 0(%%edx),%%esp\n\t" |
| "addl $4, %%esp" |
| : : "r"(&block) : "eax","edx","cc","memory" |
| ); |
| printf("66pushb_pos: delta %d, top32 0x%08x\n", |
| block[0] - block[1], block[2]); |
| } |
| |
| void do_66pushb_neg ( void ) |
| { |
| unsigned int block[3]; |
| __asm__ __volatile__ ( |
| "movl %0, %%edx\n\t" |
| "pushl $0x55555555\n\t" |
| "movl %%esp, 0(%%edx)\n\t" |
| ".byte 0x66,0x6A,0xEE\n\t" |
| "movl %%esp, 4(%%edx)\n\t" |
| "popl %%eax\n\t" |
| "movl %%eax,8(%%edx)\n\t" |
| "movl 0(%%edx),%%esp\n\t" |
| "addl $4, %%esp" |
| : : "r"(&block) : "eax","edx","cc","memory" |
| ); |
| printf("66pushb_neg: delta %d, top32 0x%08x\n", |
| block[0] - block[1], block[2]); |
| } |
| |
| |
| int main ( void ) |
| { |
| do_pushb_pos(); |
| do_pushb_neg(); |
| do_pushw_pos(); |
| do_pushw_neg(); |
| do_pushl_pos(); |
| do_pushl_neg(); |
| |
| do_66pushb_pos(); |
| do_66pushb_neg(); |
| return 0; |
| } |