【笔记】8086汇编-数据处理的两个基础问题

前言:本篇仅仅是笔记,整理于2017/8/9,结构可能会略有混乱,见谅。

-为了表示方便,我们使用reg表示一个寄存器,使用sreg表示段寄存器

–reg的集合包括:ax、bx、cx、dx、ah、al、ah、bl、bh、cl、ch、dl、dh、sp、bp、si、di;

–sreg的集合包括:ds、ss、cs、es。

-【8.1 bx、si、di、bp】

–在8086CPU中,只有这四个寄存器可以放在中括号中。

—关于两个寄存器的联合使用:要注意si和di不可以放在一起,bx与bp不可以放在一起!!(指同一个括号)

–其中bp的特殊性在于,如果指令中没有显性地给出段地址,段地址就默认在ss中。它可用来帮助sp“解决负担”。

-【8.2 机器指令处理的数据在什么地方】

–在指令执行前,所要处理的数据可以放在3个地方:CPU内部、内存、端口(后面章节讨论)。

–mov bx,1的数据1存放在CPU内部的指令缓冲器

-【8.3 汇编语言中数据位置的表达】

-1)立即数(idata)

–对于直接包含在机器指令中的数据(存放在CPU的指令缓冲器中),在汇编语言中称为:立即数(idata)

-2)寄存器

-3)段地址(SA)和偏移地址(EA)

–正如我们前边所说,存放段地址的寄存器可以显性给出(这样就可以使用中括号加数值),也可以隐性给出(使用寄存器传址)

-【8.4 寻址方式】

–只使用idata的方式称为直接寻址, 只使用寄存器的方法称为寄存器间接寻址,结合一个寄存器和一个常数叫做寄存器相对寻址,结合两个寄存器的方法叫做基址变址寻址,同时使用两个寄存器以及常数的方式叫做相对基址变址寻址。

-【8.5 指令要处理的数据有多长】

–8086CPU可以处理byte和word,8086CPU的word长度为16位。

–在有寄存器的情况下,数据的长度会有寄存器大小来决定。

–在指令中没有寄存器的情况下,我们使用X ptr,X可以填byte或word

—如:mov word ptr ds:[0],1【ptr是pointer的缩写】

–push与pop这类的指令默认了是访问字单元

-【8.6 寻址方式的综合利用】

–通常的方式是:用bx定位整个结构体,用idata定位结构体中某一个数据项,用si定位数组项中的每个元素。

—为此,汇编语言提供了更为贴切的书写方式,这与c语言中我们的书写方法十分相似:如:

—-[bx].idata

—-[bx].idata[si]

-【div指令】

–div(division)

–除数:8位或16位,在一个reg或内存单元中

–被除数:默认放在AX(16位)或DX和AX(一共32位)中,如果除数为8位,被除数要有16位;如果除数有16位,被除数要有32位,并且DX中存放高16位,AX中存放低16位。

–结果的存放:

—1)如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数是16位,则AX存储除法操作的商,DX存放除法操作的余数。【记忆:原来存放高位的地方要存放余数】

–【注意:DX与AX中数据的关系是组合,而不是相加。】

–【注意:就笔者而言,关于div指令的计算原理与限制还有待进一步研究,首先应当知道,不当的值可能会引发运行时divide overflow错误】

-【8.8 伪指令dd】

–dd是用来定义dword(double word,双字)型数据的。

-【8.9 dub】

–操作符,由编译器处理,和db、dw、dd配合使用。

–使用方法:

—db 重复次数 dup (重复的字节型数据)

—dw 重复次数 dup (重复的字型数据)

—dd 重复次数 dup (重复的双字型数据)

–解释说明:

—对于“db 3 dup (‘abc’)”是什么意思?首先我们要明确,这里的db不可改为dw或dd,那样会造成syntax error;而这里将会在数据段中依次存放abcabcabc,也就是说,这条代码等价于db 3 dup (‘a’,’b’,’c’)。

—而如果输入dw 3 dup (‘a’,’b’,’c’),则不会引发语法错误,不过这与上面的语句产生的效果不同,每个字型数据的第八位代表字符,高八位则由0填补。

–应用:

—这一功能主要用于开辟大量的内存空间,比如我们想有一段包含200字节的内存空间,这时我们就需要使用db 200 dup (0)来快速声明。

-【实验七:寻址方式在结构化数据访问中的应用】

–我们花费了空间,得到了效率,这在算法中常常见到【牺牲空间得到时间】。在这个试验中,我们根据一种数据的最大长度,来决定使用了多长的数据类型(这里我们用了4个字节的dword型),这样,我们可以很方便的确定他们的位置。