ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

021 指针思考

2022-06-29 02:32:15  阅读:180  来源: 互联网

标签:p2 mov 021 rax 思考 printf ptr 0x% 指针


 

/*
目录:
   一 C原理
   二 汇编原理
*/


一 C原理

void change(int** p2)
{
    printf("p2 = 0x%x, *p2 = 0x%x\n", p2, *p2);
    printf("*p2 = 0x%x, *8p2 = %d\n", *p2, **p2);
}

int main()
{
    int i = 3;
    printf("&i = 0x%x, i = %d\n", &i, i);


    int    *p = &i;
    printf("p = 0x%x, *p = %d, &p = 0x%x\n", p, *p, &p);
    change(&p);
    
    return 0;
}
/*
// result
    &i = 0x293cfba4, i = 3
    p = 0x293cfba4, *p = 3, &p = 0x293cfbc8
    p2 = 0x293cfbc8, *p2 = 0x293cfba4
    *p2 = 0x293cfba4, *8p2 = 3
*/

 

/*
内存: 数值; 地址(数值所在的内存单元编号)。
方法: 
    (1) &p: 取该p变量的地址。
    (2) *p: 把p当做某个地址看。
            取该p地址里面的值。
 
思考:
    1 *P: 得到数值可能是数值或指针。
    2 为什么可以跨函数修改数值内容,因为传递的是内存地址,不受函数作用域影响。
*/

 

二 汇编原理

; 汇编 
void change(int** p2)
{
    printf("p2 = 0x%x, *p2 = 0x%x\n", p2, *p2);
00007FF623E224FF  mov         rax,qword ptr [p2]  
00007FF623E22506  mov         r8,qword ptr [rax]  ; 数值: *p2
00007FF623E22509  mov         rdx,qword ptr [p2]  ; 数值: p2
00007FF623E22510  lea         rcx,[string "p2 = 0x%x, *p2 = 0x%x\n" (07FF623E2BC10h)]  
00007FF623E22517  call        printf (07FF623E2124Eh)  
    printf("*p2 = 0x%x, *8p2 = %d\n", *p2, **p2);
00007FF623E2251C  mov         rax,qword ptr [p2]  
00007FF623E22523  mov         rax,qword ptr [rax]  
00007FF623E22526  mov         r8d,dword ptr [rax]   ; 数值: **p2
00007FF623E22529  mov         rax,qword ptr [p2]  
00007FF623E22530  mov         rdx,qword ptr [rax]   ; 数值: *p2
00007FF623E22533  lea         rcx,[string "*p2 = 0x%x, *8p2 = %d\n" (07FF623E2BCE0h)]  
00007FF623E2253A  call        printf (07FF623E2124Eh)  
}


int main()
{
    int i = 3;
00007FF623E2211D  mov         dword ptr [i],3  
    printf("&i = 0x%x, i = %d\n", &i, i);
00007FF623E22124  mov         r8d,dword ptr [i]  ; 数值: i
00007FF623E22128  lea         rdx,[i]            ; 数值: &i
00007FF623E2212C  lea         rcx,[string "&i = 0x%x, i = %d\n" (07FF623E2BCF8h)]  
00007FF623E22133  call        printf (07FF623E2124Eh)  


    int    *p = &i;
00007FF623E22138  lea         rax,[i]               ; 数值: &i
00007FF623E2213C  mov         qword ptr [p],rax     ; 数值: p = &i
    printf("p = 0x%x, *p = %d, &p = 0x%x\n", p, *p, &p);
00007FF623E22140  lea         r9,[p]                ; 数值: &p
00007FF623E22144  mov         rax,qword ptr [p]     ; 
00007FF623E22148  mov         r8d,dword ptr [rax]   ; 数值: *p
00007FF623E2214B  mov         rdx,qword ptr [p]     ; 数值: p
00007FF623E2214F  lea         rcx,[string "p = 0x%x, *p = %d, &p = 0x%x\n" (07FF623E2BD10h)]  
00007FF623E22156  call        printf (07FF623E2124Eh)  
    change(&p);
00007FF623E2215B  lea         rcx,[p]               ; 数值: &p
00007FF623E2215F  call        change (07FF623E21532h)  
    
    return 0;
00007FF623E22164  xor         eax,eax  
}

 

/*
分析: 查看汇编指令和上面C原理一模一样。
*/

 

标签:p2,mov,021,rax,思考,printf,ptr,0x%,指针
来源: https://www.cnblogs.com/huafan/p/16421854.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有