mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 16:36:21 +00:00
55 lines
1.1 KiB
C
55 lines
1.1 KiB
C
|
|
#include <stdio.h>
|
|
|
|
typedef unsigned int UInt;
|
|
|
|
UInt test_jcxz ( UInt arg )
|
|
{
|
|
UInt block[2];
|
|
block[0] = arg;
|
|
block[1] = 0xdeadbeef;
|
|
__asm__ __volatile__(
|
|
"movl %0,%%ecx\n\t"
|
|
"movl $0,%%eax\n"
|
|
"0:\n\t"
|
|
"jcxz 1f\n\t"
|
|
"addl $1, %%eax\n\t"
|
|
"subl $1, %%ecx\n\t"
|
|
"jmp 0b\n"
|
|
"1:\n\t"
|
|
"movl %%eax, %1"
|
|
: /*out*/ : /*in*/ "m"(block[0]),
|
|
"m"(block[1]) : /*trash*/ "eax","ecx","cc","memory"
|
|
);
|
|
return block[1];
|
|
}
|
|
|
|
UInt test_jecxz ( UInt arg )
|
|
{
|
|
UInt block[2];
|
|
block[0] = arg;
|
|
block[1] = 0xdeadbeef;
|
|
__asm__ __volatile__(
|
|
"movl %0,%%ecx\n\t"
|
|
"movl $0,%%eax\n"
|
|
"0:\n\t"
|
|
"jecxz 1f\n\t"
|
|
"addl $1, %%eax\n\t"
|
|
"subl $1, %%ecx\n\t"
|
|
"jmp 0b\n"
|
|
"1:\n\t"
|
|
"movl %%eax, %1"
|
|
: /*out*/ : /*in*/ "m"(block[0]),
|
|
"m"(block[1]) : /*trash*/ "eax","ecx","cc","memory"
|
|
);
|
|
return block[1];
|
|
}
|
|
|
|
int main ( void )
|
|
{
|
|
UInt arg = 0x01028374;
|
|
printf("test_jcxz(0x%x) = 0x%x\n", arg, test_jcxz(arg));
|
|
printf("test_jecxz(0x%x) = 0x%x\n", arg, test_jecxz(arg));
|
|
return 0;
|
|
}
|