`
yaojingguo
  • 浏览: 208137 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Sample Code to Inline assembly for x86 in Linux

阅读更多

http://www.ibm.com/developerworks/linux/library/l-ia.html is a great introduction to inline assembly code in C. But its code examples are not ready to run. So I write the following code to help me understand the article.

 

#include <stdio.h>
#include <unistd.h>

#define rdtscll(val) \
     __asm__ __volatile__ ("rdtsc" : "=A" (val))

void test_rdtsc() {
  unsigned long long abc;
  abc = 0;
  rdtscll(abc);
  printf("%#llX\n", abc);
}

void test_r_constraint() {
  int x = 10, y;
  asm ("movl %1, %%eax;"
      "movl %%eax, %0;"
      :[output] "=r"(y) /* y is output operand */
      :[input] "r"(x) /* x is input operand */
      :"%eax"); /* %eax is clobbered register */
  printf("x=%d, y=%d\n", x, y);
}

void test_symbolic_name() {
  int x = 10, y;
  asm ("movl %[input], %[output];"
      :[output] "=r"(y) /* y is output operand */
      :[input] "r"(x) /* x is input operand */
      :"%eax"); /* %eax is clobbered register */
  printf("x=%d, y=%d\n", x, y);
}

void test_a() {
  int var = 100;
  asm ("incl %0" :"=a"(var):"0"(var));
  printf("var: %d\n", var);
}

void test_m() {
  int x = 100;
  asm("incl %0\n" : :"m"(x));
  __asm__("incl %0\n" : :"m"(x));
  printf("x=%d\n", x);
}

void test_controlName() {
  static int foo asm("myfoo") = 2;
}

void test_read_write() {
  int foo, bar;
  foo = 1;
  bar = 2;
  asm("movl %1, %%eax;"
      "movl %2, %%ebx;"
      "addl %%ebx, %%eax;"
      "movl %%eax, %0;"
      :"=r" (foo)
      :"0" (foo), "g" (bar)
      :"%eax", "%ebx");
  printf("sum: %d\n", foo);
}

void test_cpuid() {
  unsigned op;
  unsigned _eax;
  unsigned _ebx;
  unsigned _ecx;
  unsigned _edx;
  op = 0;
  asm("cpuid"
      : "=a" (_eax), "=b" (_ebx), "=c" (_ecx), "=d" (_edx)
      : "a" (op));
  printf("eax=%#X, ebx=%#X, ecx=%#X, edx=%#X\n", _eax, _ebx, _ecx, _edx);
}

void asm_strcpy(char *dest, char *src, int count) {
  asm("cld\n\t"
      "rep movsb"
      :
      : "S" (src), "D" (dest), "c" (count));
}

void test_asm_strcpy() {
  char *src = "abc";
  char dest[10];
  asm_strcpy(dest, src, 4);
  printf("dest: %s\n", dest);
}

void test_syscall() {
  int sys_number = 1; /* syscall number for exit */
  int status = 100;
  asm("int $0x80"
      : 
      : "a" (sys_number), "b" (status));
}

void test_asm_memcpy() {
  char *src = "123";
  char dst[4];
  int num = 4;
  asm("movl %[count], %%ecx;\n"
      "up: lodsl;\n\t"
      "stosl;\n\t"
      "loop up;"
      :
      : "S" (src), "D" (dst), [count] "r" (num)
      : "%ecx", "%eax");
  printf("dst: %s\n", dst);
}

int main(void) {
  test_rdtsc();
  test_r_constraint();
  test_symbolic_name();
  test_a();
  test_m();
  test_controlName();
  test_read_write();
  test_asm_strcpy();
  test_cpuid();
  test_syscall();
  test_asm_memcpy();
}
 

 

 

分享到:
评论

相关推荐

    Professional Assembly Language

    tines in the C program to ensure that the compiler generates the appropriate assembly language code for the routine. Chapter 14, “Calling Assembly Libraries,” demonstrates how assembly language ...

    ios应用源码之感恩---奉上大量samplecode(第一部分) samplecode1 2018128

    这个压缩包"ios应用源码之感恩---奉上大量samplecode(第一部分) samplecode1 2018128"显然是一个专门针对iOS开发者的福利,其中包含了丰富的样例代码,帮助开发者深入理解iOS应用的构建过程。下面我们将详细...

    MSP430F22x2 sample code (Assembly IAR).rar

    **MSP430F22x2 Sample Code (Assembly IAR)** MSP430F22x2系列是德州仪器(Texas Instruments, TI)推出的一种超低功耗微控制器,它属于MSP430家族。该系列芯片在嵌入式系统设计中广泛应用,尤其是在需要节能和高效...

    sample (1)_SampleCode_

    标题中的"sample (1)_SampleCode_"表明这是一个关于示例代码的压缩文件,可能是为了演示某种编程技术或软件功能。描述中的"Sample Archive Files Sample ZIP File"确认了这是一个包含示例档案的ZIP压缩文件,通常...

    Introduction to 64Bit Windows Assembly

    This book introduces ... A companion web site, http://www.rayseyfarth.com, has a collection of PDF slides which instructors can use for in-class presentations and source code for sample programs.

    linux 0.01 Sample code + pdf

    Linux 0.01 Sample Code + PDF 是一个针对程序员深入了解Linux操作系统的重要资源。这个压缩包包含了一份早期Linux版本0.01的源代码以及相关的PDF文档,为学习者提供了宝贵的参考材料。通过研究这些源码,我们可以...

    Sample code in MATLABOctave for Kalman Filter for Beginners.zip

    "Sample code in MATLABOctave for Kalman Filter for Beginners.zip" 这个标题告诉我们这是一个关于初学者的卡尔曼滤波器(Kalman Filter)教程的代码示例,使用了MATLAB和Octave两种编程环境。MATLAB是一种广泛应用...

    MSP430F22x2 sample code (Assembly CCE).rar

    "MSP430F22x2 sample code (Assembly CCE).rar"提供的是一份关于如何在MSP430F22x2上使用汇编语言和Code Composer Studio (CCE)进行编程的实例代码集。 Code Composer Studio(CCE)是TI开发的一个集成开发环境...

    Sample Application to Prepare HLv2 Messages for Storing in MySQL

    Sample Application to Prepare HLv2 Messages for Storing in MySQL

    Moving to Microsoft Visual Studio 2010 sample code

    这个"Moving to Microsoft Visual Studio 2010 sample code.zip"压缩包包含了一系列的示例代码,旨在帮助用户更好地理解和掌握如何在Visual Studio 2010中进行开发工作。 1. **升级与兼容性**: - Visual Studio ...

    package sample code

    package sample code

    LINUX multithread sample code

    "LINUX multithread sample code" 指的是一个示例代码,它演示了如何在Linux环境下用C语言创建和管理多线程。让我们深入探讨多线程的概念以及在Linux下实现多线程的关键知识点。 首先,我们要了解什么是线程。线程...

    MTK VRE(Virtual Runtime Environment) 3.0 API Sample Code

    MTK VRE(Virtual Runtime Environment)3.0 API Sample Code是一个专门为联发科(MediaTek)平台设计的中间件开发套件,它为开发者提供了一种高效、灵活的方式来实现应用程序在MTK硬件上的运行。VRE是联发科的一个...

    Android代码-sample-code-github

    Its purpose being, to quickly demonstrate Android, Kotlin and software development in general. More so and amongst others, the main focus of this project is: Setup and Gradle configuration, Gradle ...

    苹果官网IOS sample code 大集合006

    苹果官网上的ios 示例代码太多 有不能一起下载,没有网络的时候研究起来很麻烦,一次性全部下载下来打 包发布赚点下载分。一起下载的方法忒简单,抓取网页 组合URL 再用下载工具下载,代码也一并放在里面了 ...

    OTFS_sample_code_Otfs_doppler_matlab_

    本项目提供的"OTFS_sample_code_Otfs_doppler_matlab_"是OTFS通信系统的一个参考实现,主要在MATLAB环境下进行,便于理解和研究。 1. **OTFS调制原理**: OTFS是一种将数据符号在时频域二维离散空间上进行调制的...

    android API&amp;Sample Code

    首先,我们关注的"android API&Sample Code"主题主要涉及两个版本:2.2(API Level 8,Froyo)和4.0(API Level 14,Ice Cream Sandwich)。这两个版本之间的API差异显著,反映了Android系统的演进。 在API Level 8...

    linux-net-programming-sample-code.zip_Linux 以太网_linux c

    这个压缩包“linux-net-programming-sample-code.zip”提供了Linux环境下以太网编程的实例,帮助开发者理解和实践相关技术。 首先,让我们深入了解Linux下的以太网编程基础。以太网是一种广泛使用的局域网(LAN)...

    samplecode

    【标题】"samplecode"揭示的是一个关于TS流(Transport Stream)播放功能的代码示例。TS流是一种广泛用于数字电视、卫星传输和IP网络的数据传输格式,它以固定长度的包(通常为188字节)传输,包含音频、视频和其他...

Global site tag (gtag.js) - Google Analytics