汇编第一日

本文汇编主要针对的是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!!!

原文地址:https://www.cnblogs.com/chaunceyctx/p/7260827.html