汇编取出内存中的值

 # include <stdio.h>

 int main()
{
int i = ;
int ret = ; int *p = &i;
//ret = *p;
__asm__(
"ldr %0, [%1]" :"+r" (ret) //输出
:"r" (p) //输入
);
printf("hello world! %d\n", ret);
}

说明:[ ]相当于 *P中的*,%1相当于地址P,即 [%1] = *P,把地址P里的内容取出来!

改变变量的值

 #include <stdio.h>

 int main()
{
int i = ;
int ret = ; //i = 100;
__asm__(
"mov r0, #100\n"
"str r0, [%1]\n"
//"ldr r0, [%1]\n" : "+r" (ret) //输出
: "r" (&i)
); printf("i %d\n", i);
}

说明:先将立即数100传到r0,然后将r0传到 *(&i),也就是改变了变量i地址里面的值。

给数组赋值

 #include <stdio.h>

 int main()
{
int arr[] = {}; __asm__(
"mov r0, #1\n"
"str r0, [%0, #0]\n"
"add r0, r0, #1\n"
"str r0, [%0, #4]\n"
"add r0, r0, #1\n"
"str r0, [%0, #8]\n" : //"+r" (arr) //error
: "r" (arr)
: "r0"
); printf("arr[0] %d\n", arr[]);
printf("arr[1] %d\n", arr[]);
printf("arr[2] %d\n", arr[]);
}

说明:输入部分是数组的首地址arr,特别注意。

关于地址的后移

 #include <stdio.h>

 int main()
{
int arr[] = {, , };
int i = ;
int p = ; __asm__(
//"ldr %0, [%2]\n" //addr and value not change
//"ldr %0, [%2, #4]\n" //addr not change, value change
//"ldr %0, [%2, #4]!\n" //addr change, value change
"ldr %0, [%2], #4\n" //addr change, value not change
"mov %1, %2\n" : "+r" (i), "+r" (p) //error
: "r" (arr)
: "r0"
); printf("i is: %d\n", i);
printf("p is: %x\n", p);
printf("arr is: %x\n", arr);
}

说明:第11行、12行和13行的区别:以举例说明,假设arr地址是0x10

    11行:就是0x10 + 4后等于 0x14的地址,arr本身还是0x10,取0x14里面的值到 i ,下一次arr + 4还是 0x14

    12行:多了个叹号,就是现在基数还是0x10,+ 4后,arr值变为0x14,下一次arr + 4变成了 0x18

    13行:先把0x10里面的值赋到i,然后地址再加到0x14

    

复习-C语言内嵌汇编-初级(2)的更多相关文章

  1. 复习-C语言内嵌汇编-初级(1)

    打印hello world并改变变量i的值 # include <stdio.h> int main() { ; __asm__( "mov %0, #4\n" :&q ...

  2. Ok6410裸机驱动学习(三)C语言内嵌汇编

    1.C语言内嵌汇编使用方法 C内嵌汇编以关键字”_asm_或asm开始,下辖4个部分,各部分之间用“:”分开,第一部分是必须写的,后面3个部分可以省略,但是分号:不能省略 优化后的代码 2.汇编程序框 ...

  3. 简单了解C语言内嵌汇编

    最近看自旋锁的实现,自选锁的循环查找锁的主要实现类似如下,该实现使用到了内嵌的汇编(摘自sanos内核,源代码有2处实现,一处使用intel汇编,是没有问题的,另一处使用内嵌汇编语法,源代码中为cmp ...

  4. C语言内嵌汇编(arm-v7)----加减乘移位

    在现代嵌入式操作系统中,汇编语言当然必不可少,汇编语言的优势就是执行速度快.如果在C语言的代码中,在关键的地方内嵌汇编,那么效率将会大大的提高,我们来看看代码: #include <stdio. ...

  5. Linux内核--C语言中内嵌汇编 asm __volatile__

    在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...

  6. Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_【转】

    转自:http://www.bkjia.com/Androidjc/1109412.html 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器, ...

  7. GCC在C语言中内嵌汇编 asm __volatile__ 【转】

    转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达 ...

  8. GCC在C语言中内嵌汇编 asm __volatile__

    2012-11-26 22:20 17958人阅读 评论(2) 收藏 举报  分类: linux(59)  架构管理(24)  C/C++(59)  目录(?)[+] 在内嵌汇编中,可以将C语言表达式 ...

  9. Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly

    注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...

随机推荐

  1. 字符串聚合技术(String Aggregation Techniques)

    from: http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php String Aggregation ...

  2. ubuntu 配置JDK环境变量

    ubuntu 配置JDK环境变量 (2011-11-25 16:45:59) 转载▼ 标签: ubuntu jdk 环境变量 杂谈 分类: Linux_Ubuntu_CentOs 过程如下: 1. 先 ...

  3. c#中的数据类型简介

    一.C#中的变量和常量 C#中用于定义常量的方式有两种一个使用const关键字,一个是用readonly关键字.使用const定义的常量叫静态常量(compile-time constant),用re ...

  4. php的SQL连接操作的方法

    初学php,于是一开始就在sql(具体点说是mysql)里受挫严重.于是这里记下一些方法. 首先是基本方法.基本方法现在我不用了,所以我就附一下hustoj中的部分吧 基本方法的数据库连接操作: if ...

  5. python学习笔记:python对象

    一.python对象 python使用对象模型来存储数据,构造任何类型的值都是一个对象.所有的python对象都拥有三个特性:身份.类型和值. 身份:每个对象都有一个唯一的身份标识自己,对象的身份可以 ...

  6. c#访问各数据库的providerName各驱动

    在machine.config(C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG)文件中有这么一段: <system.data> & ...

  7. Binder的使用(跨进程——AIDL,非跨进程)

    一.Binder类 1.作用:Binder是客户端与服务器端的通信的媒介(连接各种Manager的桥梁),客户端通过Binder对象获取服务器端提供的数据 (为什么要用Binder来提供数据呢,服务器 ...

  8. Oracle EBS-SQL (WIP-5):检查非标任务本身选上了MRP净值.sql

    SELECT WE.WIP_ENTITY_NAME,            MSI.SEGMENT1,            MSI.DESCRIPTION,            WDJ.CLASS ...

  9. 测试Web服务接口

    1. http://www.iteye.com/topic/142034 2. http://www.iteye.com/topic/1123835 3.http://yongguang423.ite ...

  10. 凯恩斯主义VS货币主义

    Milton Friedman在1960年代后期以及整个1970年代,到处不知疲倦地像传教士一般地宣讲他的货币主义.当时,美联储成员几乎清一色地是凯恩斯主义者.你可以想像Friedman的对手是多么强 ...