mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-18 13:26:14 +00:00
117 lines
2.4 KiB
C
117 lines
2.4 KiB
C
|
|
#include <stdio.h>
|
|
|
|
typedef unsigned int UInt;
|
|
typedef unsigned short UShort;
|
|
|
|
UInt read16le ( void* a )
|
|
{
|
|
UInt res;
|
|
__asm volatile(
|
|
" lhbrx %0,0,%1 \n" // Get half word and reverse the bytes
|
|
: "=b" (res) // %0 - Output operand
|
|
: "b" (a) // %1 - Input operand
|
|
: "memory" // Consider memory clobberred for aliasing
|
|
);
|
|
return res;
|
|
}
|
|
|
|
UInt read16be ( void* a )
|
|
{
|
|
UInt res;
|
|
__asm volatile(
|
|
" lhzx %0,0,%1 \n" // Get half word and reverse the bytes
|
|
: "=b" (res) // %0 - Output operand
|
|
: "b" (a) // %1 - Input operand
|
|
: "memory" // Consider memory clobberred for aliasing
|
|
);
|
|
return res;
|
|
}
|
|
|
|
UInt read32le ( void* a )
|
|
{
|
|
UInt res;
|
|
__asm volatile(
|
|
" lwbrx %0,0,%1 \n" // Get half word and reverse the bytes
|
|
: "=b" (res) // %0 - Output operand
|
|
: "b" (a) // %1 - Input operand
|
|
: "memory" // Consider memory clobberred for aliasing
|
|
);
|
|
return res;
|
|
}
|
|
|
|
UInt read32be ( void* a )
|
|
{
|
|
UInt res;
|
|
__asm volatile(
|
|
" lwzx %0,0,%1 \n" // Get half word and reverse the bytes
|
|
: "=b" (res) // %0 - Output operand
|
|
: "b" (a) // %1 - Input operand
|
|
: "memory" // Consider memory clobberred for aliasing
|
|
);
|
|
return res;
|
|
}
|
|
|
|
void write16be ( void* a, UInt data )
|
|
{
|
|
__asm volatile(
|
|
" sthx %0,0,%1\n"
|
|
:
|
|
: "b" (data), "b" (a)
|
|
: "memory"
|
|
);
|
|
}
|
|
|
|
void write16le ( void* a, UInt data )
|
|
{
|
|
__asm volatile(
|
|
" sthbrx %0,0,%1\n"
|
|
:
|
|
: "b" (data), "b" (a)
|
|
: "memory"
|
|
);
|
|
}
|
|
|
|
void write32be ( void* a, UInt data )
|
|
{
|
|
__asm volatile(
|
|
" stwx %0,0,%1\n"
|
|
:
|
|
: "b" (data), "b" (a)
|
|
: "memory"
|
|
);
|
|
}
|
|
|
|
void write32le ( void* a, UInt data )
|
|
{
|
|
__asm volatile(
|
|
" stwbrx %0,0,%1\n"
|
|
:
|
|
: "b" (data), "b" (a)
|
|
: "memory"
|
|
);
|
|
}
|
|
|
|
int main ( void )
|
|
{
|
|
UInt foo = 0x12345678;
|
|
printf("ld be16 0x%08x\n", read16be( &foo ));
|
|
printf("ld le16 0x%08x\n", read16le( &foo ));
|
|
printf("ld be32 0x%08x\n", read32be( &foo ));
|
|
printf("ld le32 0x%08x\n", read32le( &foo ));
|
|
|
|
foo = 0x12345678; write16be( &foo, 0xABCD );
|
|
printf("st be16 0x%08x\n", foo);
|
|
|
|
foo = 0x12345678; write16le( &foo, 0xABCD );
|
|
printf("st le16 0x%08x\n", foo);
|
|
|
|
foo = 0x12345678; write32be( &foo, 0xABCD1425 );
|
|
printf("st be32 0x%08x\n", foo);
|
|
|
|
foo = 0x12345678; write32le( &foo, 0xABCD1425 );
|
|
printf("st le32 0x%08x\n", foo);
|
|
|
|
return 0;
|
|
}
|