作者:嵌入式历练者
ID : Eterlove
记下相关笔记,记录我的学习生活!站在巨人的肩上Standing on Shoulders of Giants!
该文章为原创,转载请注明出处和作者:https://blog.csdn.net/Eterlove/article/details/120642629
目录
1.汇编的诞生
操作:寄存器BX的内容送到AX中
机器指令:1000 1001 1101 1000
你看到这道二进制机器指令可能觉得还行,可当指令一多,你可能开始迷糊了,当然那些大神也不例外,所以他们创造了人们较为接受和学习的汇编语言来描述机器指令。这些汇编语言通过汇编编译器来编译形成机器指令。
汇编语言:mov ax,bx
2.基本汇编指令
(图片来自汇编语言_第2版)
在写一条汇编指令或写一个寄存器名称时不区分大小写,大小写表示的含义相同,ax和AX含义相同。
在进行数据传送和运算时,要注意指令的两个操作对象的位数应当一致,对于mov ax,bx这条指令,ax如果是8位寄存器,而bx是16位寄存器,则这条指令是错误的。
- CPU读写一个内存单元时,必须给出内存单元的地址,就像给人写信寄东西总要知道别人家的地址吧!
- 在8086PC中,内存地址由段地址和偏移地址组成,而在8086CPU中有个寄存器叫DS寄存器,存放要访问数据的段地址。
3.详解第三条指令:mov al,[0]
- 比如说我们要读取10000H单元的内容,可用如下的程序指令
mov bx,1000H
mov ds,bx
mov al,[0]
- 上面三条指令将内存单元为10000H(1000:0)中的数据读到al中
- 接下来,我们详解下第三条指令:mov al,[0]
- 在表2.1中,我们使用mov指令用途只有两种方式:
【!】mov指令将数据直接送入寄存器中
【!】mov指令将一个寄存器中的内容送入另一个寄存器中
- 现在对于内存单元来说,也可以使用mov指令,将一个内存单元中的内容送到寄存器中,在指令中必须指明,寄存器用寄存器名指明,内存单元则需要用内存单元的地址指明。
- 用这样的形式 [...] 来表示一个内存单元,[...] 中的0表示内存单元的偏移地址
- 说到偏移地址,你应该联系到段地址,因为只靠偏移地址是不能定位到一个内存单元的(前面提到8086CPU中有个寄存器叫DS寄存器,存放要访问数据的段地址)
- 再来逐磨下10000H这个地址如何用段地址和偏移地址来表示 10000H = 1000:0(段地址为1000,0则为偏移地址)
- 所以,先将段地址放入ds,1000H的段地址数据被mov指令先送到bx寄存器,然后通过mov指令从bx寄存器再送到ds寄存器(段寄存器),中间通过bx寄存器进行中转
- 然后用mov al,[0]完成传送,[ ]表明操作对象是一个内存单元,[0]中的0说明这个内存单元的偏移地址为0,它的段地址默认放在ds中,指令执行时,8086CPU会自动从ds中取出
- 还有一个问题,前面mov指令为什么不直接把段地址1000H送到ds寄存器,为什么要中转?不麻烦吗?因为在8086CPU(这个是重点)中,不支持将数据直接送入段寄存器ds中,是非法的。
- 那为什么8086CPU不支持将数据直接送入段寄存器的操作?这属于8086CPU硬件设计的问题,我们只需要知道这一点就行了 。
4.思考分析:将al中的数据送到内存单元10000H中
mov bx,1000H
mov ds,bx
mov [0],al
动手才能收获。最后感谢大家阅读!