汇编和可执行文件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 }
加载程序会把程序分成好几快
栈 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; }
栈用来储存临时变量的 内存需要进行释放-->内存-->临时变量
使用完成之后 两者相重合 相当于临时变量被释放
栈效率高