和标识内存单元的偏移量相同,[bx]是用BX寄存器中的值作为偏移量表示内存单元。
()用来表示寄存器和内存单元中的内容,这个作用有点像解引用操作符。它可以表示字或字节,具体是哪个由寄存器名或具体的运算决定。
本书用了一个idata表示常量。
INC
BX:(BX)+=1,因此我想INC指令的作用就是给操作数加1。
我个人感觉loop有点像goto语句,它的用法如下所示:
loop标号
它的循环次数在CX中,每执行一次就先执行一次(CX)-=1,如果(CX)!=0就执行loop。所以,loop又有点像while而不是do……while循环。它的用法实例可以见P105程序5.1。
标号实际上代表了一个地址,该地址处有一条指令。
在汇编指令中,数据不能以字母开头。比如说,A000H要写成0A000H。
Debug是把[idata]中的idata当成偏移量来处理,而Masm把[idata]直接当成数值idata来处理。
因为汇编语法把idata当成偏移量,于是[bx]解决了这一问题。
另一种办法是显式地给出段基址和偏移量,比如下面:
MOV al,ds:[0]
本节提出了一个问题。
字和字节是不同的类型,16位寄存器和8位寄存器也是不同的类型,所以你不能直接在16位寄存器中计算8位的数据,反之亦然。那又如何解决字节型数据累加越界的问题?作者的办法是将8位数据送入一个临时的16位寄存器中,然后在这个16位寄存器中进行累加,最后再把结果送入目的16位寄存器中。
从本节讲解可以看出bx实际上就是一个变量,因此[bx]是可变的偏移地址,(bx)是一个可变的数值。
像MOV AL DS:[idata]这种写法中的DS叫做段前缀,该处也可以出现CS、SS、ES等,DS:[idata]可以作为一个整体表示一个内存单元地址。