汇编笔记[02]
汇编笔记[02]
内存中字的存储
- 事实:对8086CPU,16位作为一个字
- 问题
16位的字存储在一个16位的寄存器中,如何存储?0 20H 1 4EH 2 12H 3 00H
AX | AX |
---|---|
4EH | 20H |
AH | AL |
- 回答
高八位放高字节,低8位放低字节 - 问题
16位的字在内存中需要2个连续的字节存储,怎么存放? - 回答
低位字节存放在低地址单元,高位字节存放在高地址单元
例:20000D(4E20H)存放0,1两个单元,18D(0012H)存放在2,3两个单元 - 字单元
字单元:有两个地址连续的内存单元组成,存放一个字形数据(16位) - 原理:在一个字单元中,低地址单元存放低位字节,高地址单元存放高位字节。
- 问题:
(1)0地址单元中存放的字节型数据是(20H)
(2)0地址字单元中存放的字型数据是(4E20H)
(3)2地址单元中存放的字节型数据是(12H)
(4)2地址字单元中存放的字型数据是(0012H)
要解决的问题:CPU从内存单元中要读取数据
- 要求
CPU要读取一个内存单元的时候,必须要先给出这个内存单元的地址; - 原理
在8086 PC中,内存地址由段地址和偏移地址组成(段地址:偏移地址) - 解决方案:DS 和 [address] 配合
用DS寄存器存放要访问的数据的段地址
偏移地址用[…]形式直接给出 - 例1
mov bx,1000H
mov ds,bx
mov al,[0]
将10000H(1000:0)中的数据读到al中
这种情况al,[0]并不是没有给定段地址,段地址是直接读取的ds中的值。 - 例2
mov bx,1000H
mov ds,bx
mov [0],al
将al中的数据写到10000H(1000:0)中 - 将段地址送入DS的两种方式
(1)mov ds,1000H 【错误】
(2)mov bx,1000H
mov ds,bx
【正确】 - 8086CPU不支持将数据直接送入段寄存器(硬件设计的问题)
- 套路:数据 -> 一般的寄存器 -> 段寄存器
字的传送
- 例
mov bx,1000H
mov ds,bx
mov ax,[0] 【1000:0处的字型数据送入ax】【将内存中的数据传入寄存器】
mov [0],cx 【cx中的16位数据送到1000:0处】【将寄存器中的数据传入内存】
DS的数据段
对内存单元中数据的访问
- 对于8086PC机,可以根据需要将一组内存单元定义为一个段。
物理地址 = 段地址 x 16 + 偏移地址
将一组长度为N(n <= 64K)、地址连续、起始地址为16的倍数的内存单元当做专门存储数据的内存空间,从而定义了一个数据段。 - 例:用123B0H~123B9H的空间来存放数据
段地址:123BH 起始偏移地址:0000H 长度:10字节
段地址:1230H 起始偏移地址:00B0H 长度:10字节
… - 处理方法:(DS):([address])
用DS存放数据段的段地址
用相关指令访问数据段中的具体单元,单元地址由[address]指出
将123B0H~123BAH的内存单元定义为数据段
- 累加数据段中的前3个单元的数据
mov ax,123BH
mov ds,ax
mov al,0
add al,[0]
add al,[1]
add al,[2] - 累加数据段中的前3个字型数据
mov ax,123BH
mov ds,ax
mov al,0
add al,[0]
add al,[2]
add al,[4]
用mov指令操作数据
指令形式 | 例子 |
---|---|
mov 寄存器,数据 | mov ax, 8 |
mov 寄存器, 寄存器 | mov ax, bx |
mov 寄存器, 内存单元 | mov ax, [0] |
mov 内存单元, 寄存器 | mov [0], ax |
mov 段寄存器, 寄存器 | mov ds, ax |
- 已知:mov 段寄存器,寄存器
推测1 -> mov 寄存器,段寄存器【正确】 - 已知:mov 内存单元,寄存器
推测2 -> mov 内存单元,段寄存器【正确】
推测3 -> mov 段寄存器,内存单元【正确】 - 已知:mov 寄存器,数据
推测4 -> mov 段寄存器,数据【不支持】
栈及栈操作的实现
栈结构
关于"段"的总结
各种段
- 基础
物理地址 = 段地址 x 16 + 偏移地址 - 做法
编程时,可以根据需要将一组内存单元定义为一个段。
可以将起始地址为16的倍数,长度为N(N <= 64k)的一组连续的内存单元,定义为一个段。
将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元–在程序中可以完全由程序员安排。 - 三种段(目前学习的)
数据段
将段地址放在DS中
用mov、add、sub、等访问内存单元的指令时,CPU将我们定义的数据段中的内容当做数据段来访问;
代码段
将段地址放在CS中,将段中第一条指令的偏移地址放在IP中
CPU将执行我们定义的代码段中的指令;
栈段
将段地址放在SS中,将栈顶单元的偏移地址放在SP中
CPU在需要进行栈操作(push,pop)时,就将我们定义的栈段当做栈空间来用。