这两个问题是:1、处理的数据在什么地方。2、要处理的数据有多长。
在本书中
reg:register,表示非段寄存器。
sreg:segment register,表示段寄存器。
BX:Base
Mix,基址寄存器。
SI:
(Source index),源变址寄存器。
DI:(Destination index),目的变址寄存器。
BP:(Base Pointer),基址指针寄存器。
只有这四个寄存器可以放在[]中用来表示偏移地址,并且它们可以组合出现。
[bp]默认的段地址存放在SS(Stack Segment)中,当然你也可以指定其他的段寄存器。
这类指令按照功能分为3类——读取、写入、运算。
被处理的数据可以存放在CPU、内存、端口。
立即数:直接包含在机器指令中,实际位置在CPU指令缓冲期中的数值型数据,就是上面提到的idata。
寄存器:存储在寄存器中的数据。
段地址和偏移地址:……
上述3个概念表达数据的位置。
本节给出了寻址方式的概念和总结,见表8.2。
8086CPU能处理的数据长度只有字节和字两种。
汇编语言通过如下方式指明数据长度:
1、通过寄存器名。
2、X ptr指明字或者字节,具体可分为word ptr和byte ptr。P163展示了它们的使用方法。
3、有些操作默认就是字操作或者字节操作,比如说PUSH和POP就是字操作。
[bx+idata+si]可以写成[bx].idata[si],[bx+idata]可以写成[bx].idata。
div是除法指令。
1、除数,有8位和16位两种,在一个寄存器或这内存单元中。
2、被除数,默认放在AX,或者AX+DX。
除数是8位,被除数就应该是16位。除数是16位被除数应该是32位。
前者被除数存储在AX中,后者高位存储在DX,低位存储在AX中。
3、结果,
如果除数是8位,AL存储商,AH存储余数。
如果除数是16位,AX存储商,DX存储余数。
DIV用法如下:
DIV寄存器或者内存单元
为什么只有一个操作数呢?因为被除数已经在AX或者DX+AX中了,所以这个操作数只需要是除数即可。
P168给出了各种商和余数的计算式,很好理解,在这里我只想解释一下下图红圈所示的内容应该如何理解:
AX是16位寄存器,DX也是16位寄存器,它们又表示一个数字,所以(dx)×10000实际上代表的是高16位。因为2进制中每4位是一个16进制数字,所以AX中就有4个16进制数字,因此如果(dx)想表示高16位,那它只能用它的值×0x10000了。如果还没反应过来,那么(es)×16也可以写成(es)×0x1。
dd:double
word,用来定义双字型数据。
dup定义了一段数据,这段数据可能会被重复多次。其用法如下所示:
DUP (数据)
这个数据可以是字节型、字型和双字型,它经常和db、dw、dd搭配使用,P170给出了具体的用法。