汇编和可执行文件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;
}

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

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

栈效率高

猜你喜欢

转载自www.cnblogs.com/liugangjiayou/p/10549794.html