计算机系统基础
计算机系统基础
计算机系统概论
表示数据
字:一串数码作为一个整体来处理或运算的,简单来说,可以看成一个计量单
数据表示与存储
位,针对不同系统约定俗成的。eg:一般一个字设为16位(∵当初是由x86-
8086(16位的系统)发展过来的,∴保留下来了)
字长:指的是CPU一次能并行处理的二进制位数,
数据宽度 eg:x86-32(32位系统)是字长也是32位,x86-64字长是64位
对应一个int x 的变量,它占4个字节(单元),那么它对应的地址是最大的地址
还是最小的地址?
最小的地址 eg:已知x的地址位 100#,则这个变量的的存储空间为
100#~103#
多字节数据在各存储单元内存放顺序是如何?
数据存储 大端方式\小段方式(从左至右正常)
IA-32指令系统 指令
栈就是向下生长的,且栈的生长方向是从高地址到低地址的
每出现一个函数 即 对应一个函数栈帧
(包含对应的ebp(栈底指针)和esp(栈顶指针))
这里0x100、0x104的单位都是字节
∴是相差0x104-0x100 = 4个字节
基础知识
栈帧中每一块其实对应的是存储一个寄存器 eg:ebp esp
32位系统中这些寄存器都是32位的,即4个字节,∴每次偏移都是4的倍数
另外1个字节对应16进制的两位
eg:
入口参数(就是实参)
存放于该函数EBP的上面
函数调用的表示
递归过程调用
在IA-32中,double是64位,对应2个4字节
在IA-32中,long int是32位,对应1个4字节
缓冲区溢出实例
缓冲区溢出可导致 程序运行失败、系统关机、重新启动等后果
if-else的机器级表示
eg:
注意:其中case的跨度不易太长
像这里就是10-17,如果太长会导致调转表过大
switch-case的机器级表示
选择循环的表示
eg:
C语言语句的机器级表示
for、while、do-while的机器级表示
eg:递归和循环的区别
计算机系统基础
数组在内存的存放与访问
结构体数据的分配与访问
对齐可以减少访存周期
虽然浪费些空间(且很小),但是加快
时间更为值得
F
PD
兴
万
对齐方式设定
数据的对齐
整体是自然边界对齐
eg:
整体∵都比1大,∴按1对齐
应用eg:
原理
对应机器级表示
越界访问和缓冲区溢出
UNIX/Linux系统中可以通过
程序的加载和运行 调用execve()函数来加载并执行程序
eg:
IA-32
各类数据的长度
x86-64
概述
IA-32
通用寄存器
x86-64
传送指令
eg:
eg:常规的
算术逻辑运算指令
x86-64基本指令
X86-64指令系统
eg:特殊的
比较和测试指令
x86-64 逆向工程举例
eg:比较IA-32和x86-64 IA-32:在栈的上面存储入口参数,通过对栈顶指针移动来引用
x86-64:直接通过寄存器存储入口参数(前六个参数),通过寄存器来引用
x86-64的参数传递和返回地址
x86-64函数调用 函数调用时各寄存器的使用约定
caller函数部分
eg:
test函数部分