本文汇编主要针对的是8086CPU
计算机中三条主要总线:地址总线,控制总线,数据总线,从CPU管脚引出
32位,64位CPU一次存取数据大小为32位,64位,内存存储单元大小为8bit = 1byte
振荡器振荡产生高低电平,高电平为1,低电平为0,CPU只认1和0
每种CPU架构(x86(CISC,主要在电脑上),MIPS(RISC,主要在嵌入式上),ARM(RISC,主要在手机))都有自己汇编指令集
存储器中存着指令和数据,根据将其放在哪种总线上传输而将其区分
CPU并不直接控制外部硬件设备,而由扩展插槽上接口卡控制外部硬件设备
CPU主要有运算器,控制器,寄存器组成
x86CPU架构发展 8088(8位)-> 8086(16位,地址线20条) -> 80286(16位,地址线24条) -> 80386(i386 , 32位,地址线32条) -> 80486 -> 奔腾 ->core (i3,i5,i7)
8086CPU中寄存器为16位,可以存放两个字节(1个字)
16位寄存器最大存放数据为(2^16) - 1
一个字为16bit,也为2字节
mov ax, bx 含义:bx数据赋值给ax
通用寄存器:ax,bx,cx,dx,现在为eax,ebx.......
在8086种寄存器为16位,而8088种为8位,为了兼容,8086寄存器ax 分成 ah(保存高8位数据) 和 al (低8位数据)
16位CPU:
运算器一次最多处理16位数据
寄存器最大数据宽度为16位
寄存器和运算器之间通路宽度为16位
地址总线宽度16位
8086CPU:
地址线为20根:最大寻址空间为 2 ^ 20 = 1MB
但是16位数据最大寻址空间为 2 ^ 16 = 64KB
出现了段地址和偏移地址
16位段地址和偏移地址如何形成20位物理地址?
物理地址 = 段地址 << 4 + 偏移地址
段地址 << 4 : 在十六进制下,在数据末尾加上0即可
偏移地址:16位,所以导致段大小为 2 ^ 16 = 64KB(0 - ffffH)
但是注意:
分段仅仅由CPU内部划分,内存实际上并没有被划分成段
21F60 = 2000H << 4 + 1F60H = 2100H << 4 + 0F60H
说明了CPU可用不同的cs:ip得到相同的物理地址
段寄存器提供段地址:CS(代码),DS(数据),SS(堆栈),ES(前面不够使用该寄存器)
改变CS:IP可以按自己意愿执行:
1.对于CS和IP修改只能用jmp指令:
jmp 2AE3:3 -> 2AE33
jmp 3:0B16 -> 0003 << 4 + 0B16 = 00B46
2.若只想变IP:
jmp 200H 在含义上等同于 mov ip 200H 但是实际上不能这样写
对于16进制数据如 4E20H 4E为高位, 20为低位,而且4E占了8bit,等同于一个内存存储单元,存放情况:
任何两个连续内存单元N号和N+1号,可以将其看成一个地址为N的字单元中高位字节单元和低位字节单元
DS用来存放要访问数据的段地址
mov功能:
数据 -> 寄存器
寄存器 -> 寄存器
内存中单元内容 -> 寄存器
数据 -> 内存单元 等等。。。。
mov ds 1000H
该语句错误,x86CPU不支持数据到段寄存器,只支持寄存器到段寄存器
所以可写:
mov ax, 2000H
mov ds, ax
内存存储单元到寄存器:
mov bx, 1000H
mov ds, bx
mov ax, [0] //传过去1000(ds寄存器保存的段地址):0字型数据,16位对应ax寄存器存放的16位
mov [1],bx//bx16位数据传到1000:0处
例如:
执行指令后ax为3C2E(由于传过去16位,所以10001和10000,注意高位地址对应高位数据),同时10002H内容为00,10003H为10
如果mov al [0] 把ds:0对应的内存存储单元(8位)传到al,因为al大小为8位,传数据的大小由传入对象大小决定
add/sub ds, ax 不可以
add ax bx 含义为:ax = ax + bx (内容先加)
Done!!!