全局变量和局部变量 全局变量在exe运行的时候就已经存在 ,其他函数都可以修改 生命周期:从程序启动 → 程序结束,一直存在。 存储位置:存放在全局数据区,不是栈。 默认初始值:如果不赋值,默认等于 0。 局部变量 只有当函数调用时才会分配空间,且一定要有初值.
ASCII码表 标准ASCII码表 0-127标准 ASCII 最高位永远是 0,8 位二进制最高位为 0,这就是为什么一个 char (8bit) 足够存放全部标准 ASCII。 GB2312 简体中文 作业 拟写一个函数,如果是英文字符就查表标准版ASCII
裸函数 C源码(.c) →【预处理】→【编译】→【汇编】→【链接】→可执行程序 预处理 (cpp):展开头文件、宏替换、删掉注释,生成 .i 文件(还是 C 语言文本) 编译 (cc1):C → 汇编 (.s) 汇编 (as):汇编 (.s) → 机器码目标文件 (.o/
call xxx ->jmp xxx -> push ebp... 通过vs studio 查看汇编代码 练习1 编写一个空函数,没参数也没有返回值,并分析函数的反汇编. 这里在恢复环境之后,通过add手动恢复堆栈,之后检查堆栈,最后进行保底的mov esp,ebp 以及re
堆栈图1 练习文件01 堆栈图2 函数:计算机的函数,是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时还带有一入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序,供计算
Jmp修改Eip的指令如果跳转的地址到开始跳转的地址 字节小于128个字节 则要加一个short jmp(无条件跳转)唯一的作用就是修改eip 唯一影响的就是eip的值 jmp 寄存器/立即数Call指令call指令执行之后压入(堆栈)Call的下一条地址ret指令相当于POP eip作业 使用jm
push 16位寄存器 栈顶+2 push 8位 16位 32位立即数 栈顶+4 push 16位内存数据 栈顶+2 push 32位内存数据 栈顶+4 Pushad 一次性把 8 个 32 位通用寄存器全部压入栈,用来保存现场。 popad 一次性把 8 个 32 位通用寄存器全部弹
寄存器窗口和汇编窗口的数据存放方式是由高到低 在数据窗口 数据是从低到高排列的 因为一般计算机都是小端存储 寄存器的本质:CPU 寄存器(如 eax、ebx)是 CPU 内置的高速存储单元,它们没有内存地址(内存地址是给内存单元用的),本身就是存储数据的 “容器”。 显示逻辑:OD
CPU内存存储容器(通用寄存器_内存读写) 八个通用寄存器 mov eax,0x123456 02 寄存器和内存的区别 1.寄存器位于CPU的内部执行速度快 但是比较贵 2.内存很大但速度相对较慢,所以可以做的很大 3.寄存器和内存没有本质区别,都是用于
数据宽度 各宽度数据存储范围 由于硬件的限制,数据都是有长度的,超过最多位的数据会被舍弃 4位 4位宽度表示,假设计算机只能存储4位二进制数 0-F 无符号数:0 1 2 3 4 5 6 7 8 9 A B C D E F 有符号数 公平起见从中间切开,0-7一组 8-f一组 0