10.15汇编

Posted on Oct 15, 2020
i remember you

今天只学习了2.12-3.5,进度稍微有一点落后,希望周末可以补回来

内存中字的存储

8086是16位的,显然一次可以处理16位的数据,虽然内存以字节为单位存储数据,但是仍然可以以字为单位存储,一个字为16位。存储字的内存单元被称为字单元。特别需要注意的一点,字单元中,高地址单元存储高位

若一个子单元起始地址为N,则我们称这是N地址字单元。

存储数据时是存到字单元还是单个内存单元,取决于数据的类型,比如

mov [0],ax 就会改变[0]和[1]中的数据。

mov [0],al 就只会改变[0]中的数据。


DS和[address]

DS是另一种段寄存器(已经碰到的另一种是CS),通常用来存放要访问的段地址。

[address]表示一个内存单位address表示偏移地址,当然光有偏移地址是不够的,所以要[],cpu会自动从DS中调用段地址。

注意:8086没有提供将数据直接赋给段寄存器的方法,所以mov ds,1000是不合法的。所以改变DS等,可以通过一个寄存器间接复制的方法。

mov ax,1000
mov ds,ax

同时mov [0],1000同样不合法,要用与上类似的方法。

注:[立即数]表示物理地址,仅仅在debug中可以使用,汇编程序中,则要加上段前缀


几种合法操作

mov ax,ds ;段寄存器赋值到通用寄存器
mov [0],ds ;段寄存器复制到内存单元
mov ds,[0] ;内存单元复制到段寄存器

然而书上要求实验的add ds,ax则是不合法的,加法运算一般只能用通用寄存器完成。


数据段

其实我觉得这个没什么特别的,权当介绍了一下内存段可以做的一种思路。即把一段内存都当做数据来看,通过[address]的方法调用这些数据。(现在我猜也许数组就是这么整的)