汇编语言第3章 寄存器(内存访问)
Posted 鱼竿钓鱼干
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言第3章 寄存器(内存访问)相关的知识,希望对你有一定的参考价值。
推荐文章:【汇编语言 王爽第三版】学习笔记目录+习题解析+实验
【汇编语言】第3章 寄存器(内存访问)
本文分为4个部分:
- 书本知识点概览
- 书本自带的小结
- 书本习题解析
- 个人小结
知识点概览
3.1 内存中字的存储
CPU用16为寄存器来存储一个字。高8为存高位字节,低8位存放低位字节。一个字要两个内存单元来存储。
字单元,存放一个字型数据的内存单元,有两个地址连续的内存单元组成
起始地址位N的字单元称为N地址字单元
问题3.1
主要看清是字型数据还是字节型数据
3.2 DS 和 [address]
DS 存放要访问数据的段地址。
mov指令也可以将一个内存单元中的内容传入到一个寄存器中。
mov 寄存器名 内存单元地址
mov al,[0]
[]表示一个内存单元,[0]中的0表示内存单元的偏移地址,8086CPU自动取DS中的数据为内存单元的段地址
但是8086CPU不支持将数据直接送入段寄存器
也就是说你可以
mov bx,1000H
mov ds,bx
但是不能
mov ds,1000H
问题3.2
mov bx,1000H
mov ds,bx
mov [0],al
3.3 字的传送
8086CPU是16为架构可以一次性传一个字
问题3.3
ax=1000 H
ds=1000 H
ax=1123 H (1000:0)
bx=6622 H (1000:2)
cx=2211 H (1000:1)
bx=8833 H (6622 H+2211 H)
cx=8833 H (2211 H+6622 H)
问题3.4
ax=1000 H
ds=1000 H
ax=2C34 H
1000:0=2C34 H
bx=2C34 H
bx=1B12 H
1000:2 1B12 H
3.4 mov,add,sub 指令
MOV
指令 | 例子 |
---|---|
mov 寄存器 数据 | mov ax,8 |
mov 寄存器,寄存器 | mov ax,bx |
mov 寄存器,内存单元 | mov ax,[0] |
mov 内存单元,寄存器 | mov [0],ax |
mov 段寄存器,寄存器 | mov ds,ax |
mov 寄存器,段寄存器 | mov ax,dx |
mov 内存单元,寄存器 | mov [0 |
mov 段寄存器,内存单元 | mov ds,[0] |
但是不能对段寄存器操作
3.5 数据段
我们可以定义一组长度为N(N<=64KB),地址连续,起始地址为16倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段
问题3.5
A指令输入后U指令查看
可以发现123B H被送入到DS中了
但是我们使用D指令查看的话发现数据段里都是0
所以我们先用E指令修改相应内存单元的值
然后成功执行了
3.6 栈
后进先出原则(LIFO)
3.7 CPU提供的栈机制
任意时刻,SS:SP指向栈顶元素,段寄存器SS存放栈顶的段地址,寄存器SP存放偏移地址.
push和pop指令执行时,CPU通过SS和SP获得栈顶地址
入栈时,栈顶从高地址向低地址增长
push ax
(1) SP=SP-2
(2) 把ax内容送入SS:SP指向的内存单元
pop ax和push ax相反
(1)SS:SP 指向的内存单元出数据送入ax
(2)SP=SP+2
问题3.6
栈空,SS:SP指向栈空间最高地址单元的下一个单元
3.8 栈顶超界的问题
push和pop可能造成超界问题,但是8086CPU不保证我们对栈的操作不会越界。
如果发送越界可能造成数据覆盖,所以要小心
3.9 push、pop指令
注意,栈操作都是以字为单位的。
指令 | 功能 |
---|---|
push 寄存器 | 将一个寄存器中的数据入栈 |
push 段寄存器 | 将一个段寄存器中的数据入栈 |
push 内存单元 | 将一个内存单元中的字入栈 |
pop 寄存器 | 出栈,用一个寄存器接受出栈的数据 |
pop 段寄存器 | 出栈,用一个段寄存器接受出栈的数据 |
pop 内存单元 | 出栈,用一个内存单元接受出栈的数据 |
问题3.7
A指令编写命令后U查看,T执行
问题3.8
A输入命令,U查看,T执行
问题3.9
和前面差不多懒得打了,这边主要利用LIOF的性质
问题3.10
就用栈传数据嘛,想办法指向10000H就行了
mov ax,1000H
mov ss,ax
mov sp,0002H
3.10 栈段
把长度为N(N<=64 KB)的一组地址连续,起始为16倍数的内存单元当作栈空间来用,从而定义了一个栈段
问题3.11
栈最底的字单元地址为1000:FFFE。SS=1000,SP=FFFE,所以栈为空的时候SP=0
这题主要两点
1根据栈段确定栈最底字单元地址
2计算栈为空时SP
问题3.12
一个栈段最大可以设为多少?为什么?
64 KB,push和pop使用的时候知识修改SP,所以栈顶变化范围0~FFFF H,所以64 KB
书本小结
习题解析
指令 | AX | BX | CS | IP | DS |
---|---|---|---|---|---|
初始 | 0 | 0 | 2000 H | 0 | 1000 H |
MOV AX,6622 H | 6622 H | 0 | 2000 H | 3 | 1000 H |
JMP 0FF0:0100 | 6622 H | 0 | 0FF0 H | 0100 H | 1000 H |
MOV AX,2000 H | 2000 H | 0 | 0FF0 H | 0103 H | 1000 H |
MOV DS,AX | 2000 H | 0 | 0FF0 H | 0105 H | 2000 H |
MOV AX,[0008] | C389 H | 0 | 0FF0 H | 0108 H | 2000 H |
MOV AX,[0002] | EA66 H | 0 | 0FF0 H | 010B H | 2000 H |
MOV AX,2000H
MOV SS,AX
MOV SP,0010H
MOV AX,1000H
MOV SS,AX
MOV SP,0
个人总结
这章主要两个,寄存器访问内存和栈段
寄存器访问内存要记住如何找到内存地址
栈段的话主要记住push操作和pop操作流程
新增的几个寄存器
段寄存器DS:存内存访问时段地址
段寄存器SS存放栈顶的段地址,寄存器SP存放偏移地址.
还有就是段的概念应用到变成中:数据段,代码段,栈段
以上是关于汇编语言第3章 寄存器(内存访问)的主要内容,如果未能解决你的问题,请参考以下文章