ldstrev.c

来自「The Valgrind distribution has multiple t」· C语言 代码 · 共 117 行

C
117
字号
#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;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?