zoukankan      html  css  js  c++  java
  • 汇编,高级过程

    C语言里面AddTwo

    int AddTwo(int x,int y)
    {
    return x+y;
    }

    翻译成汇编可以翻译成这样:

    AddTwo PROC

    push ebp
    mov ebp,esp
    mov eax,[ebp+12]
    add eax,[ebp+8]
    pop ebp
    ret

    AddTwo endp

    然后main函数调用:

    main PROC
    push 6
    push 5
    call AddTwo
    call WriteDec
    ret
    main endp

    程序执行如下图

    但是上面会发生内存,因为在addTwo执行完毕后,esp如下图:

    这样程序返回后就会跳到5处执行,所以程序最后会发生如下图的错误:

    可以用这种方法清除:

    main PROC
    push 6
    push 10
    call AddTwo
    call WriteDec
    add esp,8
    ret
    main endp

    也可以用stdcall的方法:

    AddTwo PROC

    push ebp
    mov ebp,esp
    mov eax,[ebp+12]
    add eax,[ebp+8]
    pop ebp
    ret 8

    AddTwo endp

    不管是add esp,8还是ret 8,这里的8都是两个参数的大小

    需要注意的是,push操作的是32位,因为在push的时候如果数据是BYTE或者低于32位的,可以把他扩展成32位,如果是直接push 'x'则程序则会自动把x扩展成32位,如果是BYTE则应该使用movzx eax,charVal

    .data
    charVal BYTE
    'x'
    .code

    main PROC
    movzx eax,charVal
    push eax
    ret
    main endp

    如果是64位,则可以分成两次传递

    INCLUDE irvine32.inc

    .data
    longVal DQ 12345678900ABCDEh
    .code

    main PROC
    push DWORD PTR longVal+4
    push DWORD PTR longVal
    call WriteHex64
    ret
    main endp


    WriteHex64 PROC

    push ebp
    mov ebp,esp
    mov eax,[ebp+12]
    call WriteDec
    mov eax,[ebp+8]
    call WriteDec
    pop ebp
    ret 8

    WriteHex64 endp

    END main

  • 相关阅读:
    安装PyExecJS出现问题
    常用模块
    python2和python3的区别
    正则表达式
    MySQL之表的关系
    Python与MySQL的交互
    select 查询
    MySQL之表的连接
    bug
    黑盒测试-判定表驱动法
  • 原文地址:https://www.cnblogs.com/linyilong3/p/2072496.html
Copyright © 2011-2022 走看看