复习-C语言内嵌汇编-初级(2)
汇编取出内存中的值
# 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)的更多相关文章
- 复习-C语言内嵌汇编-初级(1)
打印hello world并改变变量i的值 # include <stdio.h> int main() { ; __asm__( "mov %0, #4\n" :&q ...
- Ok6410裸机驱动学习(三)C语言内嵌汇编
1.C语言内嵌汇编使用方法 C内嵌汇编以关键字”_asm_或asm开始,下辖4个部分,各部分之间用“:”分开,第一部分是必须写的,后面3个部分可以省略,但是分号:不能省略 优化后的代码 2.汇编程序框 ...
- 简单了解C语言内嵌汇编
最近看自旋锁的实现,自选锁的循环查找锁的主要实现类似如下,该实现使用到了内嵌的汇编(摘自sanos内核,源代码有2处实现,一处使用intel汇编,是没有问题的,另一处使用内嵌汇编语法,源代码中为cmp ...
- C语言内嵌汇编(arm-v7)----加减乘移位
在现代嵌入式操作系统中,汇编语言当然必不可少,汇编语言的优势就是执行速度快.如果在C语言的代码中,在关键的地方内嵌汇编,那么效率将会大大的提高,我们来看看代码: #include <stdio. ...
- Linux内核--C语言中内嵌汇编 asm __volatile__
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...
- Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_【转】
转自:http://www.bkjia.com/Androidjc/1109412.html 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器, ...
- GCC在C语言中内嵌汇编 asm __volatile__ 【转】
转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达 ...
- GCC在C语言中内嵌汇编 asm __volatile__
2012-11-26 22:20 17958人阅读 评论(2) 收藏 举报 分类: linux(59) 架构管理(24) C/C++(59) 目录(?)[+] 在内嵌汇编中,可以将C语言表达式 ...
- Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly
注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...
随机推荐
- How to Install/Deinstall Oracle Workspace Manager (文档 ID 263428.1)
In this Document Goal Solution References APPLIES TO: Workspace Manager - Version 9.0.1.0 to 1 ...
- MapReduce详解
1.mapreduce之shuffle http://blog.csdn.net/thomas0yang/article/details/8562910 2.彻底了解mapreduce核心Shuffl ...
- Android onSaveInstanceState()
我们知道,由于手机的内存问题,很容易造成切换activity之后上一个activity被回收的情况,虽然我们按下back按键的时候,还是能够回到上一个activity,但是此时我们并不是执行的onRe ...
- PHP面试题之设计模式
设计模式是技术面试的时候难免会被问到的一个问题,特别会让你举例说明各种设计模式的使用场景. 使用设计模式可以减轻我们的工作量,优化我们的代码. 设计模式非常的多,这里介绍单例模式,工厂模式,组合模式, ...
- Google TensorFlow深度学习笔记
Google Deep Learning Notes Google 深度学习笔记 由于谷歌机器学习教程更新太慢,所以一边学习Deep Learning教程,经常总结是个好习惯,笔记目录奉上. Gith ...
- Webbrowser中模拟连接点击(非鼠标模拟)
Delphi uses mshtml, ActiveX; //初始加载网易主页 procedure TForm1.FormCreate(Sender: TObject); begin Webbrows ...
- CC++初学者编程教程(12) 基于rhel6.3的Oracle数据库学习环境搭建
前言 安装oracle 11g系统最好是1G以上内存,硬盘至少需要4.5G空间. 至少环境在Linux Server release 5.3以上. win安装包 win32_11gR2_databas ...
- warning C4133: “函数”: 从“char [5]”到“LPCWSTR”的类型不兼容
弹窗打开一个网页,但是报错,代码如下: #include <stdio.h> #include <windows.h> void main() { ShellExecute(, ...
- python 访问器@property的使用方法
@property 可以将python定义的函数"当做"属性访问,从而提供更加友好访问方式,但是有时候setter/getter也是需要的 假设定义了一个类Cls,该类必须继承自o ...
- Yii国际化
Yii版本:1.1.13 1.将CMessageSource的$forceTranslation属性改为true Yii::app()->messages->forceTranslatio ...