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

汇编取出内存中的值

 1 # include <stdio.h>
 2
 3 int main()
 4 {
 5         int i = 100;
 6         int ret = 0;
 7
 8         int *p = &i;
 9         //ret = *p;
10         __asm__(
11                 "ldr %0, [%1]"
12
13                 :"+r" (ret)       //输出
14                 :"r"  (p)       //输入
15         );
16         printf("hello world! %d\n", ret);
17 }

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

改变变量的值

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5         int i = 6;
 6         int ret = 0;
 7
 8         //i = 100;
 9         __asm__(
10                 "mov r0, #100\n"
11                 "str r0, [%1]\n"
12                 //"ldr r0, [%1]\n"
13
14                 : "+r" (ret)    //输出
15                 : "r" (&i)
16         );
17
18         printf("i %d\n", i);
19 }

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

给数组赋值

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5         int arr[3] = {0};
 6
 7         __asm__(
 8                 "mov r0, #1\n"
 9                 "str r0, [%0, #0]\n"
10                 "add r0, r0, #1\n"
11                 "str r0, [%0, #4]\n"
12                 "add r0, r0, #1\n"
13                 "str r0, [%0, #8]\n"
14
15                 : //"+r" (arr)  //error
16                 : "r" (arr)
17                 : "r0"
18         );
19
20         printf("arr[0] %d\n", arr[0]);
21         printf("arr[1] %d\n", arr[1]);
22         printf("arr[2] %d\n", arr[2]);
23 }

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

关于地址的后移

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5         int arr[3] = {1, 2, 3};
 6         int i = 10;
 7         int p = 0;
 8
 9         __asm__(
10                 //"ldr %0, [%2]\n"   //addr and value not change
11                 //"ldr %0, [%2, #4]\n" //addr not change, value change
12                 //"ldr %0, [%2, #4]!\n" //addr change, value change
13                 "ldr %0, [%2], #4\n" //addr change, value not change
14                 "mov %1, %2\n"
15
16                 : "+r" (i), "+r" (p)  //error
17                 : "r" (arr)
18                 : "r0"
19         );
20
21         printf("i is:  %d\n", i);
22         printf("p   is:  %x\n", p);
23         printf("arr is:  %x\n", arr);
24 }

说明:第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

    

时间: 2024-10-07 11:26:21

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

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

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

C语言内嵌汇编

1.C语言内嵌汇编 1.1内嵌汇编的语法 1.2内嵌汇编示例 #include <stdio.h> int main() { int result = 0; int input = 1; int a = 1; int b = 2; asm volatile ( "movl %1, %0\n" // 通过占位符指定交互的变量 : "=r"(result) // 输出变量,与汇编交互 : "r"(input) // 输出变量,与汇编交互

汇编语言9内嵌汇编

C语言 内嵌汇编 void main(){ char ps[20] = "aaaaaaaaaa\n"; char *p1 =ps; //用汇编语句改写下面2句代码 ps[3]='b'; printf(ps);} //等价的写法1:void main(){ char ps[20] = "aaaaaaaaaa\n"; char *p1 =ps; HMODULE hmod =GetModuleHandle("msvcr90.DLL"); if (hmo

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

转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编 例: __asm__ __volatile__("hlt"); "__asm__"表示后面的

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

转自 http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编例: __asm__ __volatile__("hlt"); "__asm__"表示后面的代

内嵌汇编

static inline void arch_spin_lock(arch_spinlock_t *lock) {     unsigned long tmp; __asm__ __volatile__( "1: ldrex   %0, [%1]\n"           "   teq %0, #0\n"                         WFE("ne") "   strexeq %0, %2, [%1]\n&quo

内存四域,变量声明和定义,寄存器,c内嵌汇编,auto,堆栈,常量,静态变量

 1.内存四大区域 2.在程序中,变量的声明可以有多份,定义只能有一份 3.寄存器在cpu里面,没有地址 4.c语言内嵌汇编语言 5.auto变量 自动分配内存,自动释放内存. 6.栈的大小由编译器决定 修改栈的方式,右击项目à属性à配置属性à链接器à系统à堆栈保留大小 7.卡死cpu,卡死内存的程序 8.在堆上申请空间后赋值后,不可以释放内容.要通过free方法进行释放对空间. 9.常量字符串在代码区.代码区是智能读的. 10.常量本质 10.静态变量,全局变量的差别 A全局变量可以跨文件

内嵌汇编与C/C++实现的冒泡排序,快速排序算法排序500W个数据对比

内嵌汇编是微软为了提高程序的直接操作硬件能力,以及实现大任务程序效率的提高,而嵌入在VC中的,他不依赖于汇编器对内嵌汇编代码进行汇编,这些内嵌汇编代码由C编译器内部实现,可以使程序好像自陷到汇编状态一样.这意味着你如果在C/C++程序中使用了 inline  asm进行 汇编 那么 就注定无法跨平台的,对于没有汇编基础的同学是需要去学习下王爽的8086汇编程序设计.,因为有些时候C++程序员是不得不懂这些东西的 ,否则你永远无法知道编译器为你的函数做了什么,.你还有哪些地方需要优化, 不管处于什

VC内嵌汇编基础知识

http://www.cppblog.com/xingkongyun/archive/2008/12/21/70003.html 为了加速游戏,一提起汇编语言,大家也许会感到很神秘.其实如果你学起来就会发现,它并非想象中那样难.特别是内嵌汇编,由于它和C++紧密结合, 使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来比较容易.使用内嵌汇编,特别是使用MMX指令,可以大大提高各种游戏中常见特效的速 度,对于编出一个漂亮的游戏非常重要.学好汇编语言还有一个特别有趣的用处:可以观察和看懂