浅谈汇编(1)

准备

汇编语言和硬件是息息相关的,我们先了解一下处理器

1.8086和80X86是什么?
 答:8086是Intel公司推出的最早的实际应用到微型个人计算机上的CPU型号;80X86是在8086基础上的增强型,包括80286、80386、80486,其后就改称奔腾了;8086和80286是16位的CPU,80386和80486是32位的CPU;80486还多了数学辅助处理器,增强了复杂的数学运算能力。
 Intel8086是一个由Intel于1978年所设计的16位微处理器芯片,是x86架构的鼻祖。不久,Intel 8088就推出了,拥有一个外部的8位数据总线,允许便宜的芯片用途。它是以8080和8085的设计为基础,拥有类似的寄存器组,但是数据总线扩充为16位。总线界面单元(Bus Interface Unit)透过6字节预存(prefecth) 的队列(queue)位指令给执行单元(Execution Unit),所以取指令和执行是同步的,8086 CPU有20条地址线,可直接寻址1MB的存储空间,每一个存储单元可以存放一个字节(8位)二进制信息。
 现在用的CPU也是X86架构,已经从16位CPU发展到了64位CPU。现在的CPU型号很多,无法一一例举,有intel的奔腾、赛扬、酷睿I系列(I3 I5 I7),还有AMD的APU、打桩机、推土机、速龙、闪龙等等。

2.8051和80X86有什么区别?
 答:8051是单片机,是Intel发明的MCS-51系列的一种微控制器;而80X86是微处理器。

MCS-51系列是一种集成的电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。

  在HMOS技术大发展的背景下,Intel公司在MCS-48系列的基础上,于1980年推出了8位MCS-51系列单片机。它与以前的机型相比,功能增强了许多,就其指令和运行速度而言,超过了INTEL8085的CPU和Z80的CPU,成为工业控制系统中较为理想的机种。较早的MCS-51典型时钟为12MHz,而目前与MCS-51单片机兼容的一些单片机的时钟频率达到40MHz甚至更高,现在已有400MHz的单片机问世。
   此外,AT89C51是ATMEL公司在INTEL公司的51系列基础上,采用CMOS工艺制作,并增加FLASH的产品,相当于产品升级。AT89C51可以看作是51系列的一个重要的里程碑,它大大促进了51的普及和推广。
 

下面是几篇介绍Intel发展历程的文章:
Intel CPU概览:https://blog.csdn.net/xusiwei1236/article/details/42784539
Intel CPU发展简史:http://www.360doc.com/content/15/0411/07/21966267_462329844.shtml

汇编基础摘要

1.8086/8088微处理器由总线接口单元执行单元组成。
执行单元 EU( Execution Unit ):包括数据寄存器、标志寄存器、指针寄存器等
总线接口单元 BIU( Bus Interface Unit):包括IP和段寄存器等
它们协同完成执行内存中存放的指令序列。

2.内存中指令和数据没有任何区别,都是二进制信息,CPU在工作的时候把有的信息看作指令,有的信息看作数据,CPU根据什么将内存中的信息看作指令?
 CPU将CS:IP指向的内存单元中的内容看作指令。

3.代码段:
 对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
可以将长度为 N( N≤64KB )的一组代码,存在一组地址连续、起始地址为 16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。

 如何使得代码段中的指令被执行呢?
 将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU 并不会由于这种安排,就自动地将我们定义得代码段中的指令当作指令来执行。CPU 只认被 CS:IP 指向的内存单元中的内容为指令。所以要将CS:IP指向所定义的代码段中的第一条指令的首地址。
CS = 123BH(偏移地址),IP = 0000H(段地址)。

4.在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。我们如何改变CS、IP的值呢?
 mov指令不能用于设置CS、IP的值,8086CPU没有提供这样的功能。mov指令可以改变8086CPU大部分寄存器的值,被称为传送指令。8086CPU为CS、IP提供了另外的指令来改变它们的值:转移指令

  1. 同时修改CS、IP的内容:
    jmp 段地址:偏移地址s
    jmp 2AE3:3
    jmp 3:0B16

  2. 仅修改IP的内容:
    jmp 某一合法寄存器
    jmp ax (类似于 mov IP,ax)
    jmp bx

我们要读取10000H单元的内容可以用如下程序段进行:
mov bx,1000H
mov ds,bx
mov al,[0]
上面三条指令将10000H(1000:0)中的数据读到al中。
:mov指令中的[ ]说明操作对象是一个内存单元,[ ]中的0说明这个内存单元的偏移地址是0,它的段地址默认放在ds中,执行指令时,8086CPU自动取DS中的数据为内存单元的段地址

5.如何把1000H送入ds?
传送指令 mov ax,1;相似的方式 mov ds,1000H?
8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器。
硬件设计的问题
mov ds,1000H 是非法的。
数据–>一般的寄存器–>段寄存器

6.已知的mov指令可完成的两种传送功能:
(1)将数据直接送入寄存器;mov bx,1000H
(2)将一个寄存器中的内容送入另一个寄存器中。mov ds,bx
mov 指令 还可以将一个内存单元中的内容送入一个寄存器。mov al,[0]

问题1:
写几条指令,将al中的数据送入内存单元10000H?
分析问题本质:怎样将数据从寄存器送入内存单元?
结论:
mov bx,1000H
mov ds,bx
mov [0],al (一种合理的回答)

问题2:内存中的情况如下图,写出下面指令执行后寄存器ax,bx,cx中的值。
这里写图片描述
这里写图片描述

补充:

概括的讲,16位结构描述了一个CPU具有以下几个方面特征:
1、运算器一次最多可以处理16位的数据。
2、寄存器的最大宽度为16位。
3、寄存器和运算器之间的通路是16位的。
因为8086CPU是16位结构,有16根数据线,所以,可以一次性传送16位的数据,也就是一次性传送一个字。
字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放再高地址单元中。(8086是小端存储)

猜你喜欢

转载自blog.csdn.net/rakish_wind/article/details/80322745