复习-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 ...
随机推荐
- easyui combo自动高度(下拉框空白问题)
设置.combo-panel {max-height:200px;} 在用到easyui-combobox时,设置panelHeight:'auto'
- L9-2.安装mysql数据库
二.安装mysql 1.检查是否安装了mysql 2.安装cmake 输入gmake: make install 安装依赖的软件包: 新建用户权限等: 解压 安装 安装: 安装成功. 安装后调整: v ...
- iOS学习心得——UINavigationController
UINavigationController和UItableviewController一样也是iOS开发中常用的控件之一,今天就来学习一下它的常见用法. 有人说tab ...
- *++p和*p++的区别
*p++:先是用*p这个值,然后再使p的地址加1. #include<iostream>using namespace std;int main(){ char s[81]=&quo ...
- sublime text帮你更好的写python
在Google的Python风格指南中,有这样的要求: 用4个空格来缩进代码 但是每次在敲代码的时候,用一个tab确实比敲四次空格方便的多.令人欣慰的是sublime text 2能够把tab转换成4 ...
- mysql5.6 zip版安装
MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...
- wamp出现You don’t have permission to access/on this server提示(转)
转自http://blog.csdn.net/hong0220/article/details/40262729 ,转载方便以后查看. 今天搭建wamp集成环境,本来已经搭建好了,但是在访问local ...
- 使用Python把Gtest XML测试结果转换为HTML格式
在最近的测试中,使用gtest测试框架对c语言代码进行测试,结果以XML文件来保存,但是测试结果的查阅和分析非常不方便.便想着把xml的结果直接转为HTML文件,方便和Jenkins系统对接显示.因现 ...
- JVM(Java虚拟机)优化大全和案例实战
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- IIS7性能优化:启用浏览器本地缓存
原文地址:http://jingyan.baidu.com/article/597035521b96e88fc00740af.html