当前位置: 首页 > news >正文

8086的指令系统

今天上午综测答辩结束,感觉就很一般,但是我昨晚也操心到觉都没睡好,今天中午舍友玩P5吵得我也没睡着,感觉脑袋昏昏沉沉,汇编上课没认真听讲,晚上来补一补。还是采用GPT来讲解(水文字),我写一些个人看法的方式,

首先,8086指令系统有以下六种:

我不知道为什么?新版QQ截图的时候老是屏幕变黑或者变灰。

一、数据传送类指令

通用数据传送类指令

1、传送指令MOV:

mov  dest,src;    dest<-src

这个就是把src传给dest.

其中有很多形式:

mov   reg/mem, imm;                立即数送寄存器或主存

mov   reg/mem/seg , reg;         寄存器送寄存器(包括段寄存器)或主存

mov   reg/seg, mem;                主存送寄存器(包括段寄存器)

看这上面的注意点:两个段寄存器之间不能直接传数据,并且立即数不能直接送入段寄存器里面。

标红的是错误的汇编语法,其实上面的mov dl,ax和mov [1000H],[2000H]也是错误的。为什么?

mov dl,ax错是因为ax是16位dl放不下,mov [1000H],[2000H]错是因为8086不支持内存空间转移到内存空间。假如你要做内存空间转移的操作,用寄存器做中介。

mov ax,buffer1

mov buffer2,ax   这是书上给出的例子。

关于为什么立即数不能直接送入段寄存器里面,据说是因为由于立即数直接写入段寄存器这样的指令,被翻译成机器码之后将占用更多的字节,在事先规定的指令长度范围内无法存贮下这么多的内容,因此改由先写入通用寄存器,再由通用寄存器写入段寄存器的办法代替。立即数实际上是相当占地方的。也就是说立即数写入通用寄存器的机器码比较短吧。要记住这就是8086的设计?

这里插播一个知识点:以字母打头的立即数前面要加一个前导0.原因不想打字了。

另外mov中还有byte和word这2个关键字,其实8086是16位微处理器,所以word就是16位,byte是8位。观察这个指令:

mov  al, 050ahl;   这肯定是非法指令啊!050ah是字,al是字节,你怎么塞的下?

2、交换指令XCHG:

这是老师的PPT,但是我觉得有点小问题:

问题出在  XCHG  mem,mem  的形式是非法的。

OK?XCHG指令可以在通用寄存器与通用寄存器或存储器之间对换数据,但是不能在存储器与存储器之间交换数据。

这是给出的注意点,上面也提到不能同时位mem.

XCHG怎么记住呢?我们知道对换是exchange,这里取xchg,我猜的,就这样记吧。

3、换码指令XLAT

这个是老师课上讲的最抽象的。当时我确实没听,开摆了。

xlat的作用是将BX指定的缓冲区中,AL指定的位移处的数据取出来赋给AL。

现在我感觉就是一种查表。

这里等价于把AH设置为0(AL不受影响),所以BX加上AX就是相当于BX位移了AL的距离,然后把现在的BX内存中的值给AL。有没有感觉像是数组:

A【n】,你的BX就是数组头指针A,然后AL就是n呀。所以这是一种查表时候用的命令。

        PPT的例二没看懂,不想说了。

堆栈操作类指令

堆栈感觉不用多说,毕竟这个数据结构挺常见,有没有做过判断有效括号的题、有没有做过单调栈问题,这玩意有时也很有难度。

1、进栈指令PUSH

比如push   【2000h】是什么意思?

千万别说是将主存2000h地址内存的数据压栈。

应该是DS:【2000h】.这才是正确的。

另外要记住一点,进栈的话SP是减2。

2、出栈指令POP

标志寄存器传送指令

这个东西我不知道重不重要,我只记得老师讲这里的时候我根本就没听,当时感觉啥都听不进去了。

我觉得要理解这里首先要复习一下标志寄存器:

标志寄存器里面有一堆标志(雾)

LAHF就是把标志寄存器低8位填到AH里面。

这里还有7个标志处理指令,单独拿出来也是一条汇编语句。

这个sti是开中断,cli是关中断。这个在操作系统实验课的代码中操作过。其他的也类似,反正都是一些对标志状态寄存器的操作,也不知道会怎么考。毕竟我现在只关注这个,开始混日子了。

地址传送指令

地址传送指令将存储器的逻辑地址送至指定的寄存器。

这个LEA就是传有效地址,

平时我们看到

mov  bx,[bx+si+0f62h]这个意思是把这个地址内存单元里面的数移到bx里面

但是

lea  bx,[bx+si+0f62h]是把这个有效地址给BX。

我觉得他等价于 mov bx,bx+si+0f62h;

所以为什么不直接用mov bx,bx+si+0f62h;非要lea  bx,[bx+si+0f62h]。这样还多出一个LEA指令码,让我觉得很匪夷所思,到底是谁脑子有问题?是我吗?

还有个LDS指令和LES指令我有点看不懂。

8086具有20条地址总线,这使得8086能够直接寻址的最大内存空间为2^20(即1MB)字节,地址范围从00000H到FFFFFH。

为啥Mem32能窜出32位,这个有点搞笑了,有没有懂得小伙伴能在评论区给我说一下。

今天就更到数据传送类搞完。明天写算术运算指令,这个很难。


http://www.mrgr.cn/news/35454.html

相关文章:

  • ubuntu20.04 解决Pytorch默认安装CPU版本的问题
  • 【Unity Bug 随记】unity version control 报 xx is not in a workspace.
  • 聊天服务器(4)CMake
  • 桥田动态|桥田智能与柯马正式签订战略合作协议
  • 计算机代码python代做matlab编程c语言编写接单matlabqt开发java
  • c语言中孤立位(loner)的使用
  • 物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总
  • ESXI主机加入VCENTER现有集群提示出现常规性错误
  • Python【修炼1】
  • LOGO设计新革命:5款AI工具让你秒变设计大师(必藏)
  • Java高级Day50-连接池
  • 深入解析:Kubernetes 如何使用 etcd 作为配置中心和注册中心
  • PHP 递归遍历目录
  • JUC并发编程_四大函数式接口和 Stream 流式计算
  • JetBrains系列产品无限重置免费试用方法
  • 35岁程序员转行大模型岗位:详细学习路线,从零基础到精通2024最新
  • input文本框随其中内容而变化长
  • 【React】(推荐项目)使用 React、Socket.io、Nodejs、Redux-Toolkit、MongoDB 构建聊天应用程序 (2024)
  • QT Creator cmake 自定义项目结构, 编译输出目录指定
  • 用canvas画一个验证码
  • 第十五章 文件上传
  • 自动化学习3:日志记录及测试报告的生成--自动化框架搭建
  • 【LinuxC高级】汇总
  • 【Linux】多线程:线程池的创建、日志类、RAII互斥锁、单例模式:饿汉方式与懒汉方式
  • 【Java】内部类【主线学习笔记】
  • 【微服务即时通讯系统】——etcd一致性键值存储系统,etcd的介绍,etcd的安装,etcd使用和功能测试