mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
63 lines
1.2 KiB
C
63 lines
1.2 KiB
C
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
unsigned int do32 ( unsigned int x )
|
|
{
|
|
unsigned int* y = malloc(sizeof(unsigned int));
|
|
unsigned int* z = malloc(sizeof(unsigned int));
|
|
unsigned int t;
|
|
assert(y);
|
|
assert(z);
|
|
y[0] = x;
|
|
__asm__ __volatile__(
|
|
"pushl %0\n\t"
|
|
"pushl %1\n\t"
|
|
"popl %%ebx\n\t"
|
|
"popl %%eax\n\t"
|
|
"pushl 0(%%eax)\n\t"
|
|
"popl 0(%%ebx)"
|
|
: /*OUT*/
|
|
: /*IN*/ "r"(y), "r"(z)
|
|
: /*TRASH*/ "memory", "eax", "ebx"
|
|
);
|
|
t = z[0];
|
|
free(y);
|
|
free(z);
|
|
return t;
|
|
}
|
|
|
|
unsigned short do16 ( unsigned short x )
|
|
{
|
|
unsigned short* y = malloc(sizeof(unsigned short));
|
|
unsigned short* z = malloc(sizeof(unsigned short));
|
|
unsigned short t;
|
|
assert(y);
|
|
assert(z);
|
|
y[0] = x;
|
|
__asm__ __volatile__(
|
|
"pushl %0\n\t"
|
|
"pushl %1\n\t"
|
|
"popl %%ebx\n\t"
|
|
"popl %%eax\n\t"
|
|
"pushw 0(%%eax)\n\t"
|
|
"popw 0(%%ebx)"
|
|
: /*OUT*/
|
|
: /*IN*/ "r"(y), "r"(z)
|
|
: /*TRASH*/ "memory", "eax", "ebx"
|
|
);
|
|
t = z[0];
|
|
free(y);
|
|
free(z);
|
|
return t;
|
|
}
|
|
|
|
|
|
int main ( void )
|
|
{
|
|
printf("do32: 0x%08X\n", do32(0xCafeBabe) );
|
|
printf("do16: 0x%08X\n", (unsigned int)do16(0xfeBa) );
|
|
return 0;
|
|
}
|