计算机系统基础

C 语言相关内容省略,复习自用,仅供参考~

概述

冯·诺伊曼结构

存储程序 工作方式:将事先编好的程序和原始数据送入主存 后才能执行程序,程序被启动执行后,计算机能在不需要操作人员干预下自动完成逐条指令取出和执行 的任务。

程序执行过程:主存取指令 → \to → 指令译码 → \to → PC 自增 → \to → 取操作数并执行 → \to → 结果送往主存或寄存器

层次结构


性能评价

单位时间完成的工作量:吞吐率 ,带宽;作业提交开始到完成所需的时间:响应时间,执行时间,等待时间或时延。

用户 CPU 时间 = = = 平均时钟周期数 × \times × 时钟周期 = = = 平均指令条数 × \times × CPI × \times × 时钟周期.

时钟周期(ns) = 1 / =1/ =1/ 时钟频率(GHz); 1 1 1 GHz = 1 0 3 10^3 103 MHz = 1 0 9 = 10^9 =109 Hz; 1 1 1 s = 1 0 9 10^9 109 ns.
CPI (执行一条指令所用的时钟周期) = = = 平均时钟周期数 ÷ \div ÷ 平均指令条数.
MIPS (平均每秒执行百万条指令数) = 1 / =1/ =1/ 时钟周期(ns) ÷ \div ÷ CPI × 1 0 − 6 \times 10^{-6} ×10−6.

CPI 越低,时钟频率越高(即时钟周期越低)时,用户 CPU 时间越低(即CPU执行速度越快)。
峰值 MIPS 在 CPI 最低处。

整体改进后速度提升倍数 = 1 / ( =1/( =1/( 改进部分时间比例 / / / 改进部分速度提升倍数 + + + 未改进部分时间比例 ) ) ).

数据

整数

进制转换 : b n . . . b 0 . b − 1 . . . b − m ( R ) = ∑ i = − m n b n R n ( 10 ) , m , n > 0 {b_n...b_0.b_{-1}...b_{-m}}{(R)}={\sum{i=-m}^n b_nR^n}_{(10)}, m,n>0 bn...b0.b−1...b−m(R)=∑i=−mnbnRn(10),m,n>0.

2 进制 ⇔ \Leftrightarrow ⇔ 16 进制:4 位 一组。
小端存储 : A 1 A 2 ∣ B 1 B 2 ∣ C 1 C 2 ∣ D 1 D 2 → D 1 D 2 C 1 C 2 B 1 B 2 A 1 A 2 ( 16 ) A_1A_2\ | \ B_1B_2\ | \ C_1C_2\ | \ D_1D_2 \to {D_1D_2C_1C_2B_1B_2A_1A_2}_{(16)} A1A2 ∣ B1B2 ∣ C1C2 ∣ D1D2→D1D2C1C2B1B2A1A2(16).
字长 :ALU 内部的数据宽度。
补码 :正数符号位为 0,数值为自身;负数符号位为1,数值为按位取反后末位加 1。

求反: − y = ( ∼ y ) + 1 -y=(\sim y)+1 −y=(∼y)+1,其中 ∼ \sim ∼ 为按位取反。

加法器标志寄存器 ZF 零标志 OF 溢出标志 SF 符号标志 CF 进/错位标志
0 结果不为 0 结果未溢出(有符号) 结果为正 结果最高位发生进/错位;结果未溢出(无符号)
1 结果为 0 结果发生溢出(有符号) 结果为负 结果最高位无进/错位;结果发生溢出(无符号)

减法时, x − y = x + ( ( ∼ y ) + 1 ) x-y=x+((\sim y)+1) x−y=x+((∼y)+1) 中加法进位记为 C C C,则 C F = ! C CF=! C CF=!C,其中 ! ! ! 为逻辑非。

异号相加同号相减 时,永远不会溢出。
正溢出 :正数 + + + 正数 → \to → 负数,即正数 − - − 负数 → \to → 负数。
负溢出 :负数 + + + 负数 → \to → 正数,即负数 − - − 正数 → \to → 正数。

浮点数(IEEE 754)

单精度值类型 符号(1位) 阶码(8位,偏置127) 尾数(23位)
规格化非零数 0 或 1 0 < e < 255 0<e<255 0<e<255 任意 ( − 1 ) s × 2 e − 127 × ( 1. f ) (-1)^s\times2^{e-127}\times(1.f) (−1)s×2e−127×(1.f)
正零 0 0 0 + 0 +0 +0
负零 1 0 0 − 0 -0 −0
正无穷大 0 全 1,即 255 ( 10 ) _{(10)} (10) 0 + ∞ +\infty +∞
负无穷大 1 全 1 0 − ∞ -\infty −∞
非规划化数 0 或 1 0 非 0 下溢, ( − 1 ) s × 2 − 126 × ( 0. f ) (-1)^s\times2^{-126}\times(0.f) (−1)s×2−126×(0.f)
非数 0 或 1 全 1 非 0 N a N NaN NaN
  • 浮点数加减法
    对阶 :小阶向大阶对齐,隐藏位 还原到尾数。
    尾数加减 :定点原码加减,注意符号
    规格化 :右规,尾数右移,阶码加 1;左规,尾数左移,阶码逐次减 1。
    尾数舍入 :保护位 + + + 舍入位 + + + 粘位;就近舍入(0 舍 1 入),正向舍入,负向舍入,向 0 舍入。
    溢出判断:右规时会发生阶码上溢;左规时会变为非规格化数。

汇编(IA-32)

基础

  • AT&T 格式
    指令形式 :"op src,dst",即 dst ← \gets ← dst op src.
    长度后缀:b → \to → 8bit;w → \to → 16bit;l → \to → 32bit;q → \to → 64bit.
    数字 :"$number".
    寄存器操作数 :"%register".
    存储器操作数 (寻址方式):"offset ( %base, %index, scale )",即 %base + + + %index × \times × scale + + + offset.
    指令类型:传送(数据传送 /地址传送 /标志传送/IO);定点算术运算(加减 乘除/自增自减/取负/比较 );按位运算(逻辑/移位);控制转移(无条件转移 /条件转移 /条件设置/条件传送/调用返回/内中断)。
  • IA-32 寄存器
    通用寄存器(32bit):EAX 累加器,EBX 基址寄存器,ECX 计数寄存器,EDX 数据寄存器,ESP 栈指针寄存器,EBP 基址指针寄存器,ESI 源变址寄存器,EDI 目标变址寄存器。
    专用寄存器(32bit):EIP 指针指令寄存器,EFLAGS 标志寄存器。
    段寄存器(16bit):CS 代码段,SS 堆栈段,DS 数据段,ES FS GS 附加段。

C语言逆向

(待更新~)

过程调用:内存分配,栈帧结构

运算还原

选择结构:switch-case实现 - 连续比较/数组/二分查找

循环结构:while/do-while/自增自减

数组

内存对齐

链接

ELF 文件格式:ELF 头 + + + .text 节(目标代码) + + + .rodata 节(只读数据) + + + .data 节(已初始化全局变量) + + + .bss 节(未初始化全局变量,占位符) + + + .symtab 符号表(函数名和非局部变量名) + + +.rel.text 节(重定位) + + + .rel.data 节(重定位) + + + .debug 节(调试符号表) + + + .line 节(-g 选项) + + + .strtab 节(符号及节名) + + + 节头表。
可读写数据段.data 节(已初始化全局变量) + + + .bss 节(未初始化全局变量,占位符)

符号分类:全局非 static );外部extern );本地static )。

符号解析:强符号 为函数名和已初始化全局变量名;弱符号 为未初始化全局变量名;本地符号无强弱。

强符号只能定义一次;同时有强弱符号,符号类型以强符号为准弱符号指向同一处地址;多个弱符号,任选其一。

例题

  • 有符号整数表示(字长 16bit)
    0F 80 → \to → 1000 0000 0000 1111 (补) → \to → -32753 ( 10 ) _{(10)} (10).
  • 有符号整数减法(字长 8bit)
    A3H - 3AH → \to → 1010 0011 (补) − - − 0011 1010 (补) = = = 1010 0011 (补) + 1100 0110 (补) = = = 0110 1001 (补) → \to → 69H; 标志 CF = = = 0, OF = 1 =1 =1, SF = = = 0, ZF = = = 0; 负溢.
  • 单精度浮点数表示(大端)
    3FB00000H → \to → 1.011B → \to → 1.375 ( 10 ) _{(10)} (10).
    C2FA4000H → − \to - →− 1.111101001B → \to → -125.125 ( 10 ) _{(10)} (10).
  • 单精度浮点数加法(大端)
    3FB00000H + + + C2FA4000H → \to → 对阶 0.00000101100 ( 2 ) + − _{(2)} +\ - (2)+ − 1.111101001 ( 2 ) _{(2)} (2); 阶码 10000101 ( 2 ) → _{(2)} \to (2)→ 尾数加减 − - − 1.11101111000 ( 2 ) → _{(2)}\to (2)→ 规格化 1 ∣ | ∣ 1000 0101 ∣ | ∣ 1110 1111 0000 0000 0000 000 → \to → 尾数舍入(无) → \to → C2F78000H.
  • 链接(gcc -m32)
cpp 复制代码
// main.c
#include <stdio.h>
int d = 100;
int x = 200;
int y = 300;
void pi(void);

int main() {
  y = 0;
  p1();
  printf("d=%d, x=%d, y=%d\n", d, x, y);
  return 0;
}
cpp 复制代码
// p1.c
double d;
short y;
void p1(void) {
  d = 1.0;
  y = -100;
}
bash 复制代码
gcc -m32 -o linktest main.c p1.c
./linktest
>>> d=0, x=1072693248, y = 65436

d = d= d= 1.0 (double, 64 bit) → \to → 00 00 00 00 ∣ | ∣ 00 00 F0 3F (小端) → x = \to x= →x= 3FF00000H (大端), d = d= d= 0 → x = \to x= →x= 1072693248, d = d= d= 0.
y = y= y= -100 (short, 16bit) → \to → 1001 1100 1111 1111 (补) → \to → 11 11 11 11 11 11 11 00 11 01 10 ∣ | ∣ 00 00 ... (小端) → \to → 65436 ( 10 ) _{(10)} (10).

相关推荐
人才程序员15 小时前
【C语言】函数无参数有返回值、有参数无返回值、有参数有返回值
linux·c语言·开发语言·c++·stm32·单片机·c
DogDaoDao16 小时前
ARM架构 AArch64 基础知识介绍
汇编·arm开发·arm·指令集·寄存器·aarch64
口嗨农民工1 天前
uboo对内存操作读写命令的基本使用
linux·ubuntu·c·uboot
我要出家当道士2 天前
OpenSSL的一些使用案例
linux·c·加解密·openssl·通讯加密
人才程序员3 天前
CMake日志与变量操作
linux·运维·服务器·c++·windows·microsoft·c
阿维同学3 天前
今天不看明天付费------中国AGI(人工智能)的发展趋势
汇编·人工智能·ai·云原生·开源·agi
人才程序员3 天前
【51单片机入门】数码管原理
c++·单片机·嵌入式硬件·mcu·51单片机·proteus·c
bcdaren3 天前
《Windows API每日一练》7.4 状态报告上使用计时器
c语言·汇编·windows
踏过山河,踏过海3 天前
clock时钟周期
c++·c
bcdaren4 天前
《Windows API每日一练》6.3 非客户区鼠标消息
c语言·汇编·windows