由于是看到哪写到哪,所以可能有点杂,可按需取用。完成的也是一小部分,后续加更~
wiki
立即数不可进行逻辑操作,因为是数不是容器,操作后无位置存放结果
外设访问:查询式访问,先取一位(代表是否busy),一直读到不忙则操作
与:置0 非:置1
存储单元
bit:最小单位,存储01
byte:1 字节 =8 bit,为存储单元
1 word(字)= 2 Byte
.c如何变为可执行文件
通过Compilation System(gcc)
-
预处理(Pre-procession cpp):将开头#文件中内容插入到源程序,得到新的c程序.i文件
-
编译(Compiler ccl):词法,语法,语义分析,中间代码生成和优化,得到.s
-
汇编(Assembler as):翻译为机器指令,按照固定规则打包,得到可重定位目标文件.o
-
链接(Linker ld):将.o文件与其他如printf.o文件通过链接器进行合并,得到可执行目标文件
CPU
PC(program count, arm):一个字的存储空间,存放某一指令的地址(执行pc指向的指令,更新pc指向下一条指令(不一定相邻))
Register file:由一些单字长的寄存器构成
ALU(Arithmatic/Logic Unit): 从RF中取数据,计算后放回覆盖原数据
主存(Main memory):内存,存放程序指令和数据
实现了运算功能和控制功能:运算器、控制器IP(Instruction Pointer, x86)、寄存器(暂存数据和执行状态(FR,Flag Register))
cpu对于存储器读写
地址总线:决定cpu寻址能力
控制总线:决定cpu对其他器件的控制能力
数据总线:数据一次传送量
存储器分类
按读写属性
RAM:随机存储器,可读可写,但必须带电存储,关机后内容丢失
ROM:只读存储器,只能读, 关机后内容不丢失
线宽
1byte(字节)=8bit(比特,位)
内存地址:8086/8088都有20 bit地址线,寻址1M空间
外设地址:16 bit, 大于16 bit的外设,需要存入dx缓冲
外部数据总线宽度:8086:16 bit,8088:8 bit
指令队列:8086:6 byte, 8088:4 byte
16位机(8086):= 16位结构 = 字长为16位 特征:①运算器一次最多处理16位 ②寄存器最大宽度为16位 ③寄存器与运算器间通路位16位
指令
jmp
修改 CS IP 内容(不能通过mov修改)
例: jmp 段地址:偏移地址(同时修改csip)
jmp 某一合法寄存器(用寄存器中的值修改IP)
cmp
无符号数,比较of sf
有符号数,比较cf sf
lea
load effective address
可将内存地址直接赋值给目标操作数
lea eax,[ebx+8]就是将ebx+8这个值直接赋给eax
mov eax,[ebx+8]是把内存地址为ebx+8处的数据赋给eax。
mov
两个操作数不可都是寄存器
段寄存器
NOT NEG对比
neg改变标志位,not不改变标志位
neg得补码,not得反码
原码:最高位0表示正、1表示负,其余位代表数值
反码:正数反码是他本身,负数反码是原码符号位不变,其余位取反
补码:正数补码是本身,负数补码是反码+1(补码无正0负0之分,可以多一个-128(1000 0000)计算机储存和运算都用补码)
and or
按位运算
大小写字母的ASCII码相差 20H,所以可以不判断大小写,通过第5位置0/1操作大小写转换
LOOP
①(cx)-- ②若cx不为0则跳转至标号处执行命令
寄存器
8086 寄存器为16位
物理地址
线性空间的内存单元中唯一的地址
同一物理地址可由不同的段地址和偏移地址组合而成
8086 有20位地址线, 但是16位结构 所以用两个16位地址(段地址+偏移地址)合成一个20位物理地址
具体实现
段地址+偏移地址送入地址加法器,合成20位物理地址,再通过内部总线送入输入输出控制电路,再通过地址总线送入存储器
地址加法器
物理地址 = 段地址*16(10H) + 偏移地址
通用寄存器
分为 相对独立的 高八位 AH 和 低八位 AL,对于低位运算不会将进位存储在高位中
值传递运算时,需注意两个操作对象的位数应当一致
AX:accumulater 累加寄存器,用于运算
BX:base 基址寄存器,用于地址索引
CX:count 计数寄存器,用于计数(循环)
DX:data 数据寄存器,用于数据传递
段寄存器
CS:Code Segment 代码段寄存器
DS:Data Segment 数据段寄存器
SS: Stack Segment 堆栈段寄存器
ES:Extra Segment 附加段寄存器
8086不支持将数据直接送入段寄存器,需要在一般寄存器中进行中转
CS和IP
二者指示了当前要读取指令的地址,即 CS:IP
CS(Code Segment):代码段寄存器
IP(Instruction Pointer):指令指针寄存器
执行过程:①从cs:ip 指向的内存单元读取入指令缓冲器 ② ip += 指令长度(指向下一条指令)③ 执行指令,跳转至 步骤① 继续
SS和SP + BP
SP(Stack Pointer):SS指向最大栈底位置(低地址),SS:SP指向当前栈顶元素(高地址),
控制pop和push访问的内存单元地址:push时,线改变sp,后传送;pop时,先读数据,后变sp
BP(Base Pointer):基址指针寄存器,用作SS的一个相对基址
STACK
栈底为高地址,入栈时栈顶向低地址方向增长
用以暂存数据,保护现场
SI和DI
功能与BX相近,但不能分成两个8位寄存器用
SI(Source Index):源变址寄存器
DI(Destination Index):目的变址寄存器
字的存储
高位字节在高地址单元, 低位字节存在低地址单元
DS和[address]
[···]表示一个内存单元,为偏移地址
数据类型
dw
define word: 单字,占16个字节