第五章
1.【bx】和内存单元的描述
要完整地描述一个内存单元,需要两种信息:(1)内存单元的地址(2)内存单元的长度(类型)
用【0】表示一个内存单元时,0表示内存单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(例如寄存器)来指出。
mov ax,[bx]表示:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ds中。
2.loop
loop有循环的意思,这个指令与循环有关系。
这一章主要讲【bx】和loop指令的应用和相关的内容。
3.我们定义的描述性的符号:“()”
(ax)表示ax中的内容。
((ds)*16+(bx))
ds中的内容为ADR1,bx中的内容为ADR2。表示内存 ADR1*16+ADR2中的内容。
4.约定符号idata为常量。
mov ds idata 为非法指令
5.1 【BX】
mov ax 【bx】
功能:(ax)=((ds)*16+(bx))
P97 注意看问题5
5.2 Loop指令
CPU执行loop指令的时候,需要进行两步操作:(1)(cx)=(cx)-1 (2)判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
P99 注意任务1
我们可以总结出用cx和loop指令相配合实现循环功能的3个步骤:
(1)在cx中存放循环次数
(2)loop指令中的标号所标识地址要在前面
(3)要循环执行的程序段,要写在标号和loop指令的中间
5.3 在debug中跟踪用loop指令实现的循环程序
考虑三个问题:
(1)循环运算之后的结果会不会超过dx能储存的范围? 不会,放心用
(2)用哪个寄存器来进行累加?dx add dx,ax
(3)如何将字节单元中的值赋给寄存器? ah,al分下来赋值
-g 0012 执行CS:0012之前的程序段
5.4 loop和【bx】的联合应用
把几个内存单元中的数据相加放到一个dx中需要一个中介寄存器ax,
如何将内存单元中的值赋给ax?(ah)=0,(al)=。。。
之后循环即可
5.6 段前缀
可以在偏移地址的前面显式地加上 【段寄存器】:来表示指定地段寄存器
PS:段寄存器有哪些?
5.7 一段安全的空间
0:200~0:2ff这段空间,用之前可以先用debug查看一下
PS:查看用哪个命令?
我们不能向一些存放系统或其他程序数据或代码的内存空间写入内容(???????)
PS:dos?
5.8段前缀的使用
0:200和0020:0表示相同
bx可以用来存放被作为变量的偏移地址
0020:0更利于操作