zoukankan      html  css  js  c++  java
  • 复习-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
    ", 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
    "
    11                 "str r0, [%1]
    "
    12                 //"ldr r0, [%1]
    "
    13 
    14                 : "+r" (ret)    //输出
    15                 : "r" (&i)
    16         );
    17 
    18         printf("i %d
    ", 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
    "
     9                 "str r0, [%0, #0]
    "
    10                 "add r0, r0, #1
    "
    11                 "str r0, [%0, #4]
    "
    12                 "add r0, r0, #1
    "
    13                 "str r0, [%0, #8]
    "
    14 
    15                 : //"+r" (arr)  //error
    16                 : "r" (arr)
    17                 : "r0"
    18         );
    19 
    20         printf("arr[0] %d
    ", arr[0]);
    21         printf("arr[1] %d
    ", arr[1]);
    22         printf("arr[2] %d
    ", 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]
    "   //addr and value not change
    11                 //"ldr %0, [%2, #4]
    " //addr not change, value change
    12                 //"ldr %0, [%2, #4]!
    " //addr change, value change
    13                 "ldr %0, [%2], #4
    " //addr change, value not change
    14                 "mov %1, %2
    "
    15     
    16                 : "+r" (i), "+r" (p)  //error
    17                 : "r" (arr)
    18                 : "r0"
    19         );
    20     
    21         printf("i is:  %d
    ", i);
    22         printf("p   is:  %x
    ", p); 
    23         printf("arr is:  %x
    ", 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 

        

  • 相关阅读:
    selenium webdriver使用过程中出现Element is not currently visible and so may not be interacted with的处理方法
    转:使用C#的HttpWebRequest模拟登陆网站
    第一个WCF服务
    WinForm DataGridview.AutoSizeColumnsMode属性
    Winform 程序中DataGridView 控件添加行号
    DevExpress GridControl行颜色标识
    基于T4模板的文档生成
    NHibernate 支持的数据库及配置参数
    MahApps.Metro
    Log4Net 配置文件样例
  • 原文地址:https://www.cnblogs.com/luoxiang/p/4192085.html
Copyright © 2011-2022 走看看