《汇编语言》(王爽)第3章 寄存器(内存访问)--笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
举例:我们要存储一个字4E20H
(1)在内存单元是这样的:
CPU 中,用16位寄存器来存储一个字,这个字的低位字节放在低地址单元中,高位字节存放在高地址单元中。
1.我们将起始地址为N 的字单元简称为N 地址字单元。比如上面那个例子,字4E20H 的起始地址是0,所以我们就叫0地址字单元。(以低地址单元的编号作为N )
2.当然我们也可以说“0地址单元中存放的字节型数据为20H ”或者“0地址字单元中存放的字型数据为4E20H ”
3.3.1 内存中字的存储
在默认情况下,8086CPU 取DS 中的数据作为内存单元的段地址,其偏移地址用“[...]"表示1.错误示范:
(1)mov ds,1000H
正确示范:(用BX 作为中转寄存器)
(2)MOV BX,1000H MOV DS, BX
归纳:8086CPU 不支持直接将数据送入段寄存器,只能通过其他通用寄存器作为中转,原因和其硬件设计有关,我们不需要深究。
举例:不能直接把1000H 给段寄存器
2.3.2 DS 和[address]
8086CPU 是16位结构,有16根数据线,所以一次可以传送16位的数据,也就是一次可以传送一个字。
1.举例:
(1)mov bx,[2](ds:1000)实际上读的是1000:0001(低八位)和1000:0002(高八位)两个字节的数据
读字单元是读“[...]"所指向的内存单元以及下一个内存单元,其中指向的那个单元是低八位。
2.比如:mov ax ,11316 →mov ax ,2C34H
(1)其他注意:在分析mov ax,idata 这类指令的时候,最好先把idata 转化为十六进制,便于后面的分析。
3.举例:(第7章笔记中有写过)
(1)补充其他(内存和寄存器之间字单元的传送):
在内存和寄存器之间传送数字型数据的时候,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。
4.3.3 字的传送
MOV 寄存器,数据 比如:MOV AX,8
(1)MOV 寄存器,寄存器 比如:MOV AX,BX
(2)MOV 寄存器,内存单元 比如:MOV AX,[0]
(3)MOV 内存单元,寄存器 比如:MOV [0],AX
(4)MOV 段寄存器,寄存器 比如:MOV DS,AX
(5)MOV 寄存器,段寄存器 比如:MOV AX,DS
(6)MOV 内存单元,寄存器 比如:MOV [0],CS
(7)MOV 段寄存器,内存单元 比如:MOV DS,[0]
(8)MOV 指令
1.ADD 寄存器,数据
(1)ADD 寄存器,寄存器
(2)ADD 寄存器,内存单元
(3)ADD 内存单元,寄存器
(4)ADD 指令
2.SUB 寄存器,数据
(1)SUB 寄存器,寄存器
(2)SUB 寄存器,内存单元
(3)SUB 内存单元,寄存器
(4)SUB 指令
3.ADD 和SUB 都不能对段寄存器操作
•3.4 MOV 、ADD 、SUB 指令
其中4E 是该字的高八位存在了高
地址单元中,而其低八位20H 存
在了低地址单元中。
第3章寄存器(内存访问)
2019年9月23日20:02
ADD 和SUB 都不能对段寄存器操作
•注意:这三种的两个操作数不能都是内存单元!(后面的cmp 指令也是,几乎所有的指令都是)
•我们可以将一组长度为(N 、地址 。起始地址为16的倍数的内存单元当做专门存储
数据的内存空间,即定义一个数据段
(1)结合之前段的概念,如果我们安排这个段存储数据,那么就叫做数据段。
1.例子1:
(1)各寄存器的初始值为:CS=2000H,IP=0,DS=1000,AX=0,BX=0
所以可以发现程序是从CS:IP =2000:0000的位置开始执行的,第一条指令为“mov ax,6622H"。
由于第二条指令是跳转指令,跳转的位置是0FF0:0100,乍一看感觉图中好像没有段地址为0FF0的段,但是通过计算,我们发现0ff0:0100的物理地址为10000H ,等于1000:0000。所以我们知道下一个执行的指令就是"mov ax,2000H"
例子2:
(2)
题目给出了内存空间中的两行存储内容:
又给出了代码:
我们发现现在ds=0001,我们将要把0001:0000位置的数据传送到ax 中,但是上图中并没有这样的SA:EA 。遇到这种问题的时候,我们一定要先计算物理地址,因为内存单元就那么多个,每个内存单元对应唯一的物理地址,但是可以映射出很多歌SA:EA 的形式。通过计算发现,0001:0000=
0000:0010,所以ax=2662H
不同的SA (段地址):EA (偏移地址)可能对应同一个物理地址。
2.3.5 数据段
栈顶的元素总是最后入栈,需要出栈的时候,又最先被从栈中取出。
1.这种操作规则叫做:LIFO (Last In First)先进先出。
3.6 栈
这种操作规则叫做:LIFO (Last In First)先进先出。
主要的操作是:入栈和出栈1.入栈和出栈都是以字为单位进行的2.
任何时刻,SS:SP 指向栈顶元素。 SS :栈的段地址,SP :栈顶的偏移地址3.
SP=SP-2,SS:SP 向上移动 的两个内存单元(使得栈内容(非栈空间(栈段),栈空间预先设定
了)增大的方向)
(1)将ax 中的内容送入SS:SP 指向的字单元中(按照字单元传送规则),当前SS :SP 所指的位置为新的
栈顶
(2)push ax 的执行过程:
4.图示:
将SS:SP 指向的字单元内容传送给AX
(1)SP=SP+2,SS:SP 向下移动 的两个内存单元(向使得栈内容减少的方向),当前SS:SP 指向的为
新的栈顶。
(2)POP ax 的执行过程:
5.图示:
注意:1000CH 处的2266H 依然存在,但是,它已经不在栈中。当再次执行push 等入栈指令后,SS:SP 移至1000CH ,并在里面写入新的数据,它将被覆盖。
3.7 CPU 提供的栈机制
执行push 指令的时候,压入的数据已经超出栈顶
(1)栈顶超界的定义:
1.3.8 栈顶超界的问题