汇编语言学习

前言

开始学习汇编语言,学习的B站课程链接:https://www.bilibili.com/video/BV1Wu411B72F?spm_id_from=333.788.videopod.episodes&vd_source=737c6257f76c5f1bba2796b3bf263fad&p=3

参考书是王爽老师的《汇编语言第3版)


提示:以下是本篇文章正文内容,下面案例可供参考

机器语言与机器指令

  • 机器语言是机器指令的集合;
  • 机器指令是一台机器可以正确执行的命令;
  • 机器指令由一串二进制数表示,例:01010000
  • 电平脉冲
    在这里插入图片描述

汇编语言与汇编指令

  • 汇编语言的主体s是汇编指令
  • 汇编指令和机器指令的差别在于指令的表示方法上
    • 汇编指令是机器指令便于记忆的书写格式
    • 汇编指令是机器指令的助记符
操作:将寄存器BX的内容送到AX中
机器指令:1000100111011000
汇编指令:MOV AX, BX

在这里插入图片描述

用汇编语言编写程序的工作过程

在这里插入图片描述
汇编语言程序示例

assume cs : codesg	# 告诉汇编器 CS(代码段寄存器)应该指向 codesg 段
codesg segment
start:
	mov ax, 0123H	# 将 0123H 装载到寄存器 AX
	mov bx, 0456H	# 将 0456H 装载到寄存器 BX
	add ax, bx		# 将 AX 和 BX 中的值相加,结果存储在 AX 中
	add ax, ax		# 再次将 AX 加上它自己(即 AX = AX + AX)

	mov ax, 4c00H	# 设置 AX 为 4C00H, 这是 DOS 的终止函数调用
	int 21H			# 调用中断 int 21H 来执行 DOS 功能
codesg ends
end

注意事项

  • DOS 中断:int 21H 是一个常见的 DOS 中断,用于调用各种 DOS 功能。AH=4Ch 表示程序终止功能,AL中的内容作为返回码给操作系统。
  • 假设指令:assume cs : codesg 告诉汇编器 CS(代码段寄存器)应该指向 codesg 段;

计算机组成

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4aad09bd0be648a9a5c398c3db5a5b6f.png
CPU是计算机的核心部件,它控制整个计算机的运作并进行运算,要想让一个CPU工作,就必须向它提供指令和数据;

指令和数据在存储器(内存)中存放,离开内存,性能再好的CPU也无法工作;

指令和数据的表示

计算机中的数据和指令,存储在内存或磁盘上;

数据和指令,都是二进制信息;

问题:二进制信息1000100111011000是数据,还是指令

  • 1000100111011000 -> 89D8H(数据)
  • 1000100111011000 -> MOV AX, BX(指令)

计算机中的存储单元

存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号;

计算机中的总线

在计算机中专门有连接CPU和其他芯片的导线,通常称为总线;

  • 物理上:一根根导线的集合;
  • 逻辑上划分为:
    • 地址总线
    • 数据总线
    • 控制总线

在这里插入图片描述

三类总线

地址总线:

  • CPU是通过地址总线来指定存储单元的;
  • 地址总线宽度决定了可寻址的存储单元大小;
  • N根地址总线(宽度为N),对应寻址空间 2^N

在这里插入图片描述
数据总线:

  • CPU与内存或其他器件之间的数据传送是通过数据总线来进行的;
  • 数据总线的宽度决定了CPU和外界的数据传输速度;

例:向内存中写入数据89D8H时的数据传输
在这里插入图片描述
在这里插入图片描述

控制总线:

  • CPU通过控制总线对外部器件进行控制;
  • 控制总线是一些不同控制线的集合;
  • 控制总线宽度决定了CPU对外部器件的控制能力;

在这里插入图片描述

X86 CPU性能一览

CPU地址总线宽度寻址能力数据总线宽度一次传送数据读取1KB数据要读的次数
80801664KB81B1024
8088201MB81B1024
8086201MB162B512
802862416MB162B512
80386324GB324B256

CPU对存储器的读写

CPU要想进行数据的读写,必须和外部器件进行三类信息的交互:

  • 存储单元的地址(地址信息)
  • 器件的选择,读或写命令(控制信息)
  • 读或写的数据(数据信息)

演示:

机器码:1010 0000 0000 0011 0000 0000
16进制:A00300
汇编指令:MOV AL, [3]
含义:从3号单元读取数据送入寄存器AL

在这里插入图片描述

内存地址空间

  • CPU地址总线宽度为N,寻址空间为 (2^N) B
  • 8086CPU的地址总线宽度为20,那么可以寻址1MB个内存单元,其内存地址空间为1MB

从CPU角度看地址空间分配

  • RAM
    • 主板上的RAM
    • 扩展槽上的RAM(例显卡)
  • ROM
    • 系统BIOS
    • 接口卡上的BIOS

将各类存储器看作一个逻辑存储器 —— 统一编址

所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器;

每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间;

CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据;
在这里插入图片描述

内存地址空间的分配方案 —— 以8086 PC机为例

在这里插入图片描述

寄存器及数据存储

CPU的组成

在这里插入图片描述

寄存器是CPU内部的信息存储单元

8086 CPU有14个存储器:

  • 通用寄存器:AX、BX、CX、DX
  • 变址寄存器:SI、DI
  • 指针寄存器:SP、BP
  • 指令指针寄存器:IP
  • 段寄存器:CS、SS、DS、ES
  • 标志寄存器:PSW

共性:

  • 8086 CPU所有的寄存器都是16位的,可以存放两个子节;

在这里插入图片描述

通用寄存器 —— 以AX为例

一个16位寄存器存储一个16位的数据
在这里插入图片描述

问题:8086上一代CPU中的寄存器都是8位的,如何保证程序的兼容性

方案:通用寄存器均可以分为两个独立的8位寄存器使用

细化:

  • AX可以分为AH和AL
  • BX可以分为BH和BL
  • CX可以分为CH和CL
  • DX可以分为DH和DL
寄存器寄存器中的数据所表示的值
AX01001110001000020000(4F20H)
AH0100111078(4EH)
AL0010000032(20H)
“字” 在存储器中的存储

8086是16位CPU

  • 8086的字长为16bit

一个字可以存在一个16位寄存器中

  • 这个字的高位字节存在这个寄存器的高8位寄存器
  • 这个字的低位字节存在这个寄存器的低8位寄存器

在这里插入图片描述

mov和add指令

学习汇编指令 —— 用中学

汇编指令控制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

注:汇编指令不区分大小写

写出汇编指令执行的结果(1)

假设原AX、BX中的值均为0000H

程序段中的指令指令执行后AX中的数据指令执行后BX中的数据
mov AX, 4E20H4E20H0000H
add AX, 1406H6226H0000H
mov BX, 2000H6226H2000H
add AX, BX8226H2000H
mov BX, AX8226H8226H
add AX, BX044CH(最高位溢出)8226H

写出汇编指令执行的结果(2)

假设原AX、BX中的值均为0000H

程序段中的指令指令执行后AX中的数据指令执行后BX中的数据
mov AX, 001AH001AH0000H
mov BX, 0026H001AH0026H
add AL, BL0040H0026H
add AH, BL2640H0026H
add BH, AL2640H4026H
mov AH, 00040H4026H
add AH, 85H00C5H4026H
add AL, 93H0058H4026H

确定物理地址的方法

物理地址

CPU访问内存单元时要给出内存单元的地址;

所有的内存单元构成的存储空间是一个一维的线性空间;

每一个内存单元在这个空间中都有唯一的地址,这个唯一地址称为物理地址

事实:

  • 8086有20位地址总线,可传送20位地址,,寻址能力为1M
  • 8086是16位结构的CPU
    • 运算器一次最多可以处理16位的数据,寄存器的最大宽度为16位
    • 在8086内部处理的,传输,暂存的地址也是16位,寻址能力也只有64KB

在这里插入图片描述

问题:8086如何处理在寻址空间上的这个矛盾?

8086 CPU给出物理地址的方法

8086 CPU的解决方法

  • 用两个16位地址(段地址、偏移地址)合成一个20位的物理地址

地址加法器合成物理地址的方法

  • 物理地址 = 段地址 * 16 + 偏移地址
    在这里插入图片描述

在这里插入图片描述

演示:物理地址 = 段地址 * 16 + 偏移地址

在这里插入图片描述

"段地址 * 16 + 偏移地址 = 物理地址"的本质含义

要解决的问题:

  • 用两个16位的地址(段地址、偏移地址),相加得到一个20位的物理地址;

本质含义:

  • CPU在访问内存时,用一个基础地址(段地址 * 16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址;

内存的分段表示法

用分段的方式管理内存

8086 CPU用 “(段地址 * 16) + 偏移地址 = 物理地址” 的方式给出内存单元的物理地址;

内存的地址空间是连续的,内存并没有分段,段的划分来自于CPU

同一段内存,多种分段方案

起始地址(基础地址)为10000H;

段地址为1000H,大小为100H;
在这里插入图片描述
起始地址(基础地址)为10000H和10080H,大小为80H;
段地址为1000H和1008H,大小为80H;
在这里插入图片描述

段地址 * 16 必然是16的倍数,所以一个段的起始地址也一定是16的倍数;
偏移地址为16位,16位地址的寻址能力为64K,所以一个段的长度最大为64K;

用不同的段地址和偏移地址形成同一个物理地址

偏移地址16位,变化范围为 0~FFFFH,用偏移地址最多寻址64KB;

例:给定段地址2000H,用偏移地址寻址的范围是:20000H ~ 2FFFFH,共64K;

物理地址段地址偏移地址
21F60H2000H1F60H
21F60H2100H0F60H
21F60H21F0H0060H
21F60H21F6H0000H
21F60H1F00H2F60H

在8086 PC机中存储单元地址的表示方法

例:数据在21F60H内存单元中,段地址是2000H,说法

  • 数据存在内存 2000:1F60H单元中;
  • 数据存在内存的2000H段中的1F60H单元中;

段地址很重要,用专门的寄存器存放地址;

4个段地址

英文名称寄存器名称
CS代码段寄存器
DS数据段寄存器
SS栈段寄存器
ES附加段寄存器

Debug的使用

Debug是什么?

Debug是DOS系统中的著名的调试程序,也可以运行在Windows系统实模式下;

使用Debug程序,可以查看CPU各种寄存器中的内容、内存的情况,并且在机器指令跟踪程序的运行;

Debug就是传奇!

Debug能做什么?

  • 用R命令查看、改变CPU寄存器的内容;
  • 用D命令查看内存中的内容;
  • 用E命令改变内存中的内容;
  • 用U命令将内存中的机器指令翻译成汇编指令;
  • 用A命令以汇编指令的格式在内存中写入机器指令;
  • 用T命令执行机器指令;

CS、IP与代码段

两个关键的寄存器

  • CS:代码段寄存器;
  • IP:指令寄存器;
  • CS / IP:CPU将内存中CS: IP指向的内容当作指令执行;
    在这里插入图片描述

在CS和IP指示下代码的执行

  • 8086 CPU当前状态:CS中内容为2000H,IP中内容为0000H;
  • 内存20000H ~ 20009H处存放着可执行的机器代码;

在这里插入图片描述
8086 PC工作过程的简要描述:

  • (1)从CS: IP指向内存单元读取指令,读取的指令进入指令缓冲器;
  • (2)IP = IP + 所读取指令的长度,从而指向下一条指令;
  • (3)执行指令,转到步骤(1),重复这个过程;

在这里插入图片描述

问:内存中有数据BB 23 01 BB 03 00 89 D8 01 D8,究竟用作一般数据,还是用作指令?

答:CPU将CS:IP指向的内存单元中的内容看作指令

JMP指令

修改CS、IP指令

事实上,执行何处的指令,取决于CS:IP

可以通过改变CS、IP中的内容,来控制CPU要执行的目标指令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值