汇编语言入门(一)

目录

一、汇编语言如何产生的

二、汇编语言语法

2.1 CPU如何产生要访问的内存单元的地址

2.2 如何修改CS、IP的地址

2.3 汇编语言如何表达数据的位置

2.4 如何指明处理数据的长度


一、汇编语言如何产生的

机器语言:由一串0或1组成,如果有错误会特别难发现和查找,所以产生了汇编语言,写法与人类语言相近,便于记忆,例如:

操作:寄存器BX的内容送到AX中

机器指令:1000100111011000

汇编指令:mov ax,bx

为了将汇编语言转换成计算机能读懂的机器指令,需要编译器;

二、汇编语言语法

汇编语言由三类指令组成:

(1)汇编指令:机器码的助记符,有对应的机器码;

(2)伪指令:没有对应的机器码,由编译器识别,计算机不执行;

(3)其他符号:如 +、-、*、/等,编译器识别,没有对应的机器码。

指令和数据都存放在存储器中(内存),在内存中二者都是二进制的信息,没有区别,CPU如果想读写数据,需要和其他硬件交互以下三类信息:

(1)地址信息:存储单元的地址;

(2)控制信息:器件的选择,读或写的命令;

(3)数据信息:读或写的数据

这三类信息分别由地址总线、控制总线、数据总线通过电信号来传送。

由于地址总线负责指定存储单元,所以地址总线的传输能力决定了CPU可以对多少个存储单元进行寻址,假设一个CPU有N根地址线,每根线可以传递高电平或低电平两种状态,这样的CPU可以寻址2的N次方个内存单位。

数据总线负责传送数据,所以数据总线的宽度决定了CPU和外界的数据传送速度,例如8根数据总线一次就可以传送一个字节的数据。

控制总线是个总称,有多少根控制总线,意味着CPU提供了对外部器件的多少种控制;

为了实现上述三种信息的交互和处理,CPU内部也包含了一下器件,其中:

(1)运算器对信息进行处理;

(2)寄存器负责信息的存储;

(3)控制器负责控制各种器件进行工作。

除此之外,CPU内部也有许多总线,负责内部器件的数据传送。

2.1 CPU如何产生要访问的内存单元的地址

每个内存单元在CPU中都有一个唯一的地址,称为物理地址,CPU通过地址总线送入存储器的是物理地址,不同的CPU有不同的产生物理地址的方式,以8086CPU为例,8086是16位机,即:

1、运算器一次最多可以处理16位的数据;

2、寄存器的最大宽度为16位;

3、寄存器和运算器之间的通路为16位。

8086CPU有20根地址总线,理论上寻址能力为1MB,但是CPU只能一次性最多处理16位的数据,所以寻址能力变为了只有64KB,为了合成一个20位的物理地址,CPU在内部用两个16位地址合成的方法,通过段地址*16+偏移地址的方式,计算得出物理地址。

比如要访问123C8H的内存单元地址

由于CPU的这种给出物理地址的方式,使得我们可以对内存进行分段,因为段地址*16必然是16的倍数,所以一个段的起始地址一定也是16的倍数,偏移地址是16位,所以一个段最大可以是64KB

相同的物理地址也可以通过不同的段地址和偏移地址得出。

其中段地址通过段寄存器给出,8086 CPU共有四个段寄存器:CS、DS、SS、ES;

8086 CPU最重要的两个寄存器分别为:CS为代码段寄存器,IP为指令指针寄存器

8086 CPU的工作过程:

(1)首先从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;

(2)IP = IP + 所取指令的长度,从而指向下一条指令;

(3)执行指令,转到步骤(1),重复过程。

2.2 如何修改CS、IP的地址

既然CPU如何从何处执行指令是由CS、IP中的内容决定的,那我们可以通过修改其中的地址,来实现对控制CPU执行特定的指令,修改CS、IP的值需要用jmp指令,例如jmp 2AE3:3,执行后CS = 2AE3H,IP=0003H,CPU将从2AE33H处读取指令。

jmp 段地址:偏移地址 指令功能为:用指令中给出的段地址修改CS、偏移地址修改IP;

jmp 寄存器 功能为:用寄存器中的值修改IP

内存可以以栈的方式进行访问,CPU通过SS段寄存器和SP寄存器来获取栈顶元素地址

8086CPU不能直接将数值送入段寄存器

and:逻辑与指令,按位进行与运算

or:逻辑或指令,按位进行或运算

[bx + idata]、[si + idata]、[di + idata]或者[bx + si/di]表明一个内存单元,其中偏移地址为(bx) + (si)

start:

mov ax datasg

mov ds ax

mov ss stacksg

mov sp 16;

可以用来内存单元寻址的寄存器([x])有:bx、si、di、bp

组合形式:bx and si、bx and di、bp and si、bp and di

这几个寄存器作为偏移地址时,默认的段地址在ss中。

2.3 汇编语言如何表达数据的位置

1、立即数

直接包含在机器指令的数据,汇编语言中直接给出

mov ax, 1 add bx, 2000h mov al, 'a'

2、寄存器

指令要处理的数据在寄存器中,汇编语言中直接用寄存器名

3、段地址和偏移地址

数据在内存中,汇编语言中用[X]的格式给出偏移地址,段地址可以保存在某个段寄存器中

2.4 如何指明处理数据的长度

8086CPU可以处理的长度有两种:字(word)和字节(byte)指明操作数据长度有两种方式:

1、有寄存器参与的操作,可以通过寄存器指明

eg ax以word为单位、al以byte为单位

2、没有寄存器的操作使用word ptr或byte ptr指明

eg mov word ptr ds:[0],1

3、有些指令默认了操作长度

eg push只进行字操作

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值