1.[BX]
mov ax,[bx]
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中。即:(ax)=((ds)*16+(bx))。
mov [bx],ax
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA初。即((ds)*16+(bx))=(ax)。
2.Loop指令
loop指令的格式是:loop标号,cpu执行loop指令的时候,要进行两步操作
①(cx)=(cx)-1;②判断cx中的值,不为0则转至标号处执行程序,如果为0就向下执行
例如,我们要编程计算2^12,可以 mov ax,2,然后做11次add ax,ax
但是这种无疑使程序复杂化
用loop指令:
assume cs:code code segment mov ax,2 mov cx,11 s: add ax,ax loop s mov ax,4c00h int 21h code ends end
从上述程序我们可以总结:
①在cx中存放循环次数
②loop指令中的标号所标识地址要在前面
③要循环执行的程序段,要写在标号和loop指令的中间
用cx和loop指令相配合实现循环功能的程序框架如下:
mov cx,循环次数 s: 要循环执行的程序段 loop s
3.在debug中跟踪用loop指令实现的循环程序
这个内容太长了,想了半天也没有很好的总结方法
书本上实验过程和解析过程相当详细
4.lool和[bx]的联合使用
类型的匹配和结果的不超界的解决办法:用一个16位寄存器来做中介,将内存单元中的8位数据赋值到一个16位寄存器ax中,再将ax中的数据加到dx上。
①(dx)=(dx)+内存中的8位数据
②(dl)=(dl)+内存中的8位数据
在指令中,我们不能用常量来表示偏移地址。我们可以将偏移地址放在bx中,用[bx]的方式访问内存单元。在循环开始前设(bx)=0,每次循环,将bx中的内容+1即可。
在实际编程中,经常会遇到,用同一种方式处理地址连续的内存单元在的数据的问题。我们需要用循环来解决这类问题,同时我们必须能够在每次玄幻的时候按照同一种方式来改变要访问的内存单元的地址。
这时就不能用常量类给出内存单元的地址(比如[0],[1],[2]中,012是常量),而应用变量。“mov al,[bx]”中的bx就可以看作一个代表内存单元地址的变量,我们可以不屑新的指令,仅通过改变bx中的值,改版指令访问的内存单元。
5.段前缀
指令mov ax,[bx]中内存单元的偏移地址由bx给出,而短地址默认在ds中。
我们可以在访问内存单元的指令中显示地给出内存单元的段地址所在的段寄存器,比如:
mov ax,ds:[bx]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ds中。
还有ss,es,cs都是一样,但是段地址分别在ss,es,cs中x