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

  • 相关阅读:
    MinGW GCC 7.1.0 2017年6月份出炉啦
    java面试题-框架篇九
    spring-AOP原理
    spring的bean管理(注解)
    23种设计模式(1)-单例模式
    SSH框架面试题集锦
    JQuery基础
    实现用户注册
    spring与hibernate的整合
    spring-IOC理解1
  • 原文地址:https://www.cnblogs.com/linyilong3/p/2072496.html
Copyright © 2011-2022 走看看