学习内容
汇编语言
- 汇编语言是直接面向处理器的程序设计语言,是机器指令的一种符号表示
- 机器级编程的两种抽象
- 由指令集体系结构或指令集架构(ISA)来定义机器级程序的格式和行为
- 其程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个非常大的字节数组
x86-64指令
- 指令长度:1-15个字节不等
- 格式:OPER [DEST [,SRC]];注释
- 生成汇编文件:gcc -Og -S mstore.c
- 查看文件内容即反汇编:objdump -d mstore.o
程序编码:gcc -Og -o p1.c p2.c
- -Og:编码器采用的优化等级
- -o:将p1.c编译后的可执行文件命名为p
几个处理器
- 程序计数器:给出将要执行的下一条指令在内存中的地址
- 整数寄存器:存储地址或整数数据
- 条纹寄存器:保存最近执行的算数或逻辑指令的状态信息
- 浮点寄存器:可存放一个或多个整数或浮点数值
数据格式
字节数量关系
- 1字节=8位
- 1字=16位
- 双字=32位
- 四字=64位
访问信息
- 通用目的寄存器
- x86-64的中央处理器(CPU)包含一组16个存储64位值的通用目的寄存器
- 用来存储整数数据和指针
- 操作数指令符
- 立即数(Imm):表示常数值 $ 用标准C表示法表示的整数
- 寄存器:表示某个寄存器的内容 R[ra]
- 内存引用:访问某个内存位置 Mb[Addr]
数据传送指令
- movb:传送字节
- movw:传送字
- movl:传送双字
- movs:符号位扩展
- movz:零扩展
寻址方式
- 立即数寻址方式:movb %rax,34
- 寄存器寻址方式:movw %bp,%sp
- 存储器寻址方式
- 压入和弹出栈数据
GDB调试器
- 反汇编:objdump -d mstore.o
- 可在函数入口设置断点
- 在断点处可查看各个寄存器和存储器
- 还可单步跟踪程序,一次执行几条命令
内存越界引用与缓冲区溢出
- 内存越界:简单的说,就是在系统申请了一块内存后,在使用这块内存的时候,超出了申请的范围
- 缓冲区溢出:当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配
posted @
2018-10-14 21:57
icream
阅读(
133)
评论()
编辑
收藏
举报