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

《汇编语言》笔记一 寄存器

通用寄存器

8086CPU的所有的寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器为通用寄存器。

一个16位寄存器可以存储一个16位的数据。

8086CPU的上一代CPU中的寄存器都是8位,为了保证兼容,使原来基于上代CPU编写的程序稍加修改就可以运行在8086之上

8086CPU的 AX、BX、CX、DX、这4个寄存器可以分为两个独立使用的8位寄存器来用

字在寄存器中的存储

8086CPU可以一次性处理以下两种尺寸的数据

  • 字节:byte,一个字节由8个bit组成,可以存在8位寄存器中
  • 字:word,一个字由两个字节组成,两个字节分别称为这个字的高位字节和低位字节

汇编指令

汇编指令CPU操作高级语言
mov ax,18将18送入寄存器AXAX=18
mov ah,78将78送入寄存器AHAH=78
add ax,8将寄存器AX中的数值加上8AX=AX+8
mov ax,bx将寄存器BX中的数据送入寄存器AXAX=BX
add ax,bx将AX和BX中的数值相加,结果存在AX中AX=AX+BX

程序段指令执行情况 (原AX的值:0000H 原BX的值:0000H)

程序段中的指令指令执行后AX中的数据指令执行后BX中的数据
mov ax,4E20H4E20H0000H
add ax,1406H6226H0000H
mov bx,2000H6226H2000H
add ax,bx8226H2000H
mov bx,ax8226H8226H
add ax,bx044CH8226H

程序段中的最后一条指令 add ax,bx,在执行前 ax和 bx 中的数据都为 8226H,相加后所得的值为:1044CH,但是 ax 为 16 位寄存器,只能存放 4位十六进制的数据,所以最高位的 1不能在 ax 中保存,ax中的数据为:044CH。

程序段指令执行情况 (原AX的值:0000H 原BX的值:0000H)

程序段中的指令指令执行后AX中的数据指令执行后BX中的数据
mov ax,001AH001AH0000H
mov bx,0026H001AH0026H
add al.bl0040H0026H
add ah,bl2640H0026H
add bh,al2640H4026H
mov ah,00040H4026H
add al,85H00C5H4026H
add al,93H0058H4026H

程序段中的最后一条指令 add al,93H,在执行前,al 中的数据为 C5H,相加后所得的值为:158H,但是 a1为8位寄存器,只能存放两位十六进制的数据,所以最高位的1丢失,ax 中的数据为:0058H。

段地址x16+偏移地址=物理地址 本质含义

“段地址x16+偏移地址=物理地址”的本质含义是:CPU 在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。

“基础地址+偏移地址=物理地址”的思想

你要去图书馆,问我那里的地址,我可以用两种方式告诉你图书馆的地址:

(1)从学校走 2826m 到图书馆。这 2826m 可以认为是图书馆的物理地址。

(2)从学校走 2000m 到体育馆,从体育馆再走 826m 到图书馆。第一个距离 2000m,是相对于起点的基础地址,第二个距离 826m 是相对于基础地址的偏移地址(以基础地址为起点的地址)。

第一种方式是直接给出物理地址 2826m,而第二种方式是用基础地址和偏移地址相加来得到物理地址的。

第二个比喻进一步说明“段地址x16+偏移地址=物理地址”的思想。

比如,只能通过纸条来互相通信,你问我图书馆的地址我只能将它写在纸上告诉你。显然,我必须有一张可以容纳4位数据的纸条,才能写下 2826 这个数据。

可不巧的是,我没有能容纳4位数据的纸条,仅有两张可以容纳3位数据的纸条。这样我只能以这种方式告诉你 2826 这个数据。

在第一张纸上写上 200(段地址),在第二张纸上写上 826(偏移地址)。假设我们事前对这种情况又有过相关的约定:你得到这两张纸后,做这样的运算:200(段地址)x10+826(偏移地址)=2826(物理地址)。

8086CPU 就是这样一个只能提供两张3位数据纸条的CPU。

段的概念

内存并没有分段,段的划分来自于CPU,由于 8086CPU 用“基础地址(段地址x16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。

可以认为:地址10000H~100FFH 的内存单元组成一个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H;我们也可以认为地址 10000H1007FH、10080H100FFH 的内存单元组成两个段,它们的起始地址(基础地址)为:10000H和10080H,段地址为:1000H和1008H,大小都为80H。

段寄存器

段地址在 8086CPU 的段寄存器中存放。8086CPU有4个段寄存器:CS、DS、SS、ES。当8086CPU要访问内存时由这4个段寄存器提供内存单元的段地址。

CS和IP

CS为代码段寄存器 IP为指令指针寄存器

在 8086PC 机中,任意时刻,设CS 中的内容为 M,P 中的内容为N,8086CPU 将从内存 Mx16+N 单元开始,读取一条指令并执行。

执行指令工作原理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改CS、IP指令

jmp指令

同时修改CS IP的内容,可以使用 jmp段地址:偏移地址的指令完成

jmp 2AE3:3CS=2AE3H,IP=0003HCPU将从2AE33H处读取指令
jmp 3:0B16CS=0003H,IP=0B16HCPU将从00B46HH处读取指令

只下IP的内容

jmp ax
执行前ax=1000H,CS=2000H,IP=0003H
执行后ax=1000H,CS=2000H,IP=1000H
jmp bx
执行前bx=0B16H,CS=2000H,IP=0003H
执行后bx=0B16H,CS=2000H,IP=0B16H

http://www.kler.cn/news/359847.html

相关文章:

  • 软件I2C的代码
  • PROFIENT开发和Ethernet IP开发—嵌入式板卡:赋予通讯设备之间的神奇力量
  • 机器学习与深度学习1:神经网络概念
  • 高级java每日一道面试题-2024年10月19日-消息队列[RabbitMQ]-RabbitMQ中积压了大量的消息,如何处理?
  • 相同的树算法
  • 手机ip地址怎么切换城市
  • Zookeeper 快速入门到实战
  • VAS1802奇力线性芯片LED驱动芯片车规认证AEC-Q100
  • 深度学习-模型部署
  • python 爬虫 入门 四、线程,进程,协程
  • Go 切片详解
  • 智能安全配电装置在老旧建筑防火中的应用
  • 解决Git合并冲突:掌握版本控制的精髓
  • (计算机毕设)基于SpringBoot的就业平台开题报告
  • MATLAB | 绘图复刻(十八) | K-means 聚类分组热图
  • 【MySQL数据库】MySQL高级语句(SQL语句进阶版)
  • Hive优化:Hive的执行计划、分桶、MapJoin、数据倾斜
  • 大模型输出的outputs为什么要取[0](即outputs[0])
  • STM32G4系列MCU的启动项配置
  • CIM系统:智慧城市的数字基石