• 汇编和可执行文件1


    汇编约等于机器码   程序是从源代码一步一步进化成机器码(汇编代码)  通过编译器

    printf(“helloworld”);通过编译器 成为汇编(机器码)相当于中间加了一个翻译 将高级语言翻译成机器语言

    java不是直接翻译成汇编语言  他是一步一步的翻译成其他语言

    英语  法语 俄语

    CPU只认汇编 

    源代码最终需要到达的是课执行文件

    可执行文件和汇编不一样

    汇编——>链接(link) 

    写代码需要使用各种API 这些API中90%的不是自己写的  所以并没有与之对应的汇编代码

    printf语言实现 需要与显卡交互 (我们显示器上看到的东西都是我们通过CPU命令显卡在我内部画一幅图每多少毫秒画制展示在显示器上)

    我们只要管软件的实现不需要管硬件的实现 因为中间的操作系统能帮我们实现很多东西

    每个操作系统有每个操作系统不同的东西  想要使用操作系统必须使用link链接 看看你要使用哪些东西

    link深加工成为.obj 最后再生成.exe文件

    link里面PE结构  你会用到哪些结构  windows下 文件就可以执行了

    PE结构在开始的时候不需要在意  研究逆向加壳防破解比较方便

    编译器通过c/c++程序语言翻译成与之对应的汇编代码  但是他也会有意外的情况

    程序生成与之一一对应的汇编代码 可能那些代码没用作用

    汇编代码 赋值语句 跳转语句 计算语句

    编译器是将一些复杂逻辑分解成一些简单逻辑

    ebp esp 分别是栈寄存器 能够很好的做一些记录  Debug下面的代码

    release下面进行  xor  eax,eax  调试的时候建议使用Debug  他会对你的每句代码生成对应的汇编

    改变进行优化

    release发布版  快速 精焊 (大小比debug小)

    通过汇编进link

     1 int main()
     2 {
     3     int number = 10;//mov(移动)目标,源
     4        //平时是如何来调用一个方法的
     5       //他是否占用内存空间?100%占用  程序里面任何东西都要占用内存
     6       //他们所占用的空间叫做栈
     7 
     8     return 0;
     9 
    10 }
    View Code

    加载程序会把程序分成好几快

    栈  000001~011111  可读可写

    堆 100000~100111  可读可写

    代码101000~110000  只读不写

    常量110000~111111  只读不写

    我们的内存我们会进行划分

    指针指向了代码域  但凡你指向了我们代码区 指针是不能够指向它的

    栈区是用来分配大小 默认分为1024KB 编程时会碰到一个问题栈溢出

    1 int main()
    2 {
    3 char str_array[1024*1024];//当前栈溢出
    4 return 0;
    5 }

    如何解决栈溢出

    int main()
    {
    char *str_array=new char[1024*1024];
    return 0;
    }
    

    栈用来储存临时变量的  内存需要进行释放-->内存-->临时变量

    使用完成之后 两者相重合 相当于临时变量被释放

    栈效率高

  • 相关阅读:
    BZOJ 1029 & 丝帛贪心
    BZOJ 1831 & 就是一个DP....
    HDU2138 & 米勒拉宾模板
    BZOJ 2733 & splay的合并
    hdu Matrix Multiplication 写一个类似哈希函数的东西一切就解决了。
    hdu Cow Sorting 数学题(值得思考)
    Find them, Catch them 并查集
    Buy Tickets 简单的线段树&&反向更新
    Who Gets the Most Candies? 线段树的建立更新和反素数
    Apple Tree 有时间戳的树状数组
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/10549794.html
Copyright © 2020-2023  润新知