目录
用于内存寻址的寄存器
bp
组合
两个基本问题
数据位置
立即数
寄存器
内存
数据长度
除法指令
dup指令
总结
接下来,我们要处理的是有关数据处理的两个基本问题,那么这两个基本问题是什么呢?我们先告诉大家这两个问题,到时候再来慢慢解决:第一个就是我们要处理的数据在什么地方?第二个就是要处理的数据有多长?好啦,就让我们开始吧!
用于内存寻址的寄存器
我们之前介绍过,8086一共有14个寄存器:
通用寄存器:AX、BX、CX、DX;
变址寄存器:SI、DI;
指针寄存器:SP、BP;
指令指针寄存器:IP;
段寄存器:CS、SS、DS、ES;
标志寄存器:PSW
之前介绍的是通用寄存器,但是我们用来寻址的寄存器有哪些呢?答案是只有bx、bp、si、di可以用在[...]对内存单元寻址,但是他们也不能乱用,我们接下来就来详细的介绍一下用法。
bp
bp寄存器和bx寄存器是类似的,但是两者也有区别:bx默认指ds段;bp默认指ss段。但是呢,只需要在前面加上段地址即可改变。
组合
这些寄存器的用法也不是可以乱用的,我们来看看,bx和bp只能搭配si和di来用,bx和bp,si和di不能组合,具体关系如下图所示:
两个基本问题
好啦,我们接下来就来介绍一下这两个基本问题:要处理的数据在什么地方?要处理的数据有多长?
数据位置
我们在程序中,数据位置一般是由三个:立即数,寄存器,内存。
立即数
对于直接包含在机器指令中的数据,称为立即数(idata),数据包含在指令中。
寄存器
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。
内存
主要包括段地址(SA)和偏移地址(EA),指令要处理的数据在内存中,由SA:EA确定内存单元。
数据长度
数据长度主要包括了字和字节。我们一般是用word ptr或byte ptr指明,在没有寄存器参与的内存单元访问指令中,用word ptr或byte ptr显性地指明所要访问的内存单元的长度是很必要的,否则,CPU无法得知所要访问的单元是字单元,还是字节单元。
除法指令
div是除法指令,使用div作除法的时候,被除数:(默认)放在AX或DX和AX中,除数:8位或16位,在寄存器或内存单元中。总而言之,就是高位放余数,低位放商。
被除数 | AX | DX和AX |
除数 | 8位内存或寄存器 | 16位内存或寄存器 |
商 | AL | AX |
余数 | AH | DX |
我们来看一个例子,用div计算data段中第一个数据除以第二个数据后的结果,商存放在第3个数据的存储单元中。
// 数据段
data segment
dd 100001
dw 100
dw 0
data ends
// 代码段
mov ax,data
mov ds,ax
mov ax,ds:[0]
mov dx,ds:[2]
div word ptr ds:[4]
mov ds:[6],ax
dup指令
其实dup指令的话,不难理解,但是却非常重要,dup和db、dw、dd等数据定义伪指令配合使用,用来进行数据的重复。我们举个例子就好了,比如你想定义一个容量为200字节的栈段,我们可能会这样去做:
// 不使用dup
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
但是我们如果使用dup指令的话,代码就会变成下面这样。怎么样,是不是特别简介明了。好啦,关于dup指令我们就介绍这么多。
// 使用dup
stack segment
db 200 dup(0)
stack ends
总结
状态恢复,继续学习,加油!!!!