zoukankan      html  css  js  c++  java
  • 汇编语言9内嵌汇编

    C语言 内嵌汇编

    void main()
    {
    char ps[20] = "aaaaaaaaaa
    ";
    char *p1 =ps;
    
    //用汇编语句改写下面2句代码
    ps[3]='b';
    printf(ps);
    }

    //等价的写法1:

    void main()
    {
    char ps[20] = "aaaaaaaaaa
    ";
    char *p1 =ps;
    HMODULE hmod =GetModuleHandle("msvcr90.DLL");
    if (hmod)
    {
    PVOID pfun =GetProcAddress(hmod, "printf");
    if (pfun)
    {
    __asm
    {
    //&p1才是存放指针p1的内存, [p1]表示取去p1的值。
    //有点绕吧, 这里 p1是指针的实体, 不是要理解为它的值
    mov eax, dword ptr [p1] 
    //[eax] 表示取eax 存放的内容. 现在eax为p1的值    
    mov byte ptr [eax+3],0x62
    push dword ptr[p1] 
    call pfun
    mov eax ,1
    add esp,4 
    }
    }
    FreeLibrary(hmod);
    }
    }

    //等价的写法2:

    void main()
    {
    char ps[20] = "aaaaaaaaaa
    ";
    char *p1 =ps;
    HMODULE hmod =GetModuleHandle("msvcr90.DLL");
    if (hmod)
    {
    PVOID pfun =GetProcAddress(hmod, "printf");
    if (pfun)
    {
    __asm
    {
    //[ps+3]表示取第3个元素,虽然C语言里面数组名就是指针,汇编里面不能直接写为等价
    mov byte ptr [ps+3],0x62 
    push dword ptr[p1] 
    call pfun
    mov eax ,1
    pop ebx //相当于esp+=4 
    }
    }
    FreeLibrary(hmod);
    }
    }
    
    //写法3:
    void main()
    {
    char ps[20] = "aaaaaaaaaa
    ";
    char *p1 =ps;
    HMODULE hmod =GetModuleHandle("msvcr90.DLL");
    if (hmod)
    {
    PVOID pfun =GetProcAddress(hmod, "printf");
    if (pfun)
    {
    __asm
    {
    mov ecx,10
    mov ebx, 0
    //把ps全部替换成bbbbbbbb
    s: mov byte ptr [ps+ebx],0x62 
    inc ebx 
    loop s
    push dword ptr[p1] 
    call pfun
    mov eax ,1
    pop ebx 
    }
    }
    FreeLibrary(hmod);
    }
    }
  • 相关阅读:
    Codeforces Round #161 (Div. 2)
    Codeforces Round #160 (Div. 2)
    Codeforces Round #159 (Div. 2)
    Codeforces Round #157 (Div. 2)
    世界树的考验「NOIP多校联考 2019」
    最大异或和
    腿部挂件「NOIP多校联考 2019」
    玩具取名「HAOI2008」
    涂色「CQOI2007」
    唱、跳、rap 和篮球「TJOI2019」
  • 原文地址:https://www.cnblogs.com/mayingkun/p/4633655.html
Copyright © 2011-2022 走看看