-
[bx]
1.表示一个内存单元,它的偏移地址在bx中
mov ax,[bx] ;内存的数据送入寄存器,此时bx中存放的数据作为一个偏移地址,段地址默认在ds中
mov [bx],ax ;寄存器数据送入内存
-
loop指令
1.该指令可以用来实现循环功能,cx中存放循环次数
2.解释:
(1)标号:实际上标识了一个地址(偏移地址)
(2)loop s的执行:
先cx=cx-1;
再判断cx中的值,不为0则转至标号s所标识的地址处执行;若为零则执行下一条指令;
3.格式:
(1)在cx中存放循环次数
(2)loop指令中的标号所标识地址要在前面
(3)要循环执行的程序段,要写在标号和loop指令的中间
mov cx,循环次数 s: 要循环执行的程序段 loop s
-
定义性描述符号()——表示一个寄存器或一个内存单元中的内容
1. ()中的元素可以有三种类型:
(1)寄存器名
(2)段寄存器名
(3)内存单元的物理地址(一个20位数据)
2. ()中表示的数据可以有两种类型:
(1)字节
(2)字
-
在debug中跟踪loop指令实现的循环程序
1.用u反汇编程序,可以看到loop s中的标号s已经变成一个地址
2.遇到loop指令时,使用p命令来执行,debug就会自动重复执行循环中的指令;也可以g命令直接执行
3.注意:在汇编程序中,数据不能以字母开头,要在前面加0
-
debug和汇编编译器masm对指令的不同处理
1. debug将[idata]解释为一个内存单元,idata是内存单元的偏移地址
2.编译器将[idata]解释为idata
3.在汇编程序中
(1)想让[idata]用来表示内存单元,必须在[idata]的前面显式地给出段地址所在的段寄存器
mov al , ds:[0]
(2)在[ ]里面用寄存器,则间接给出内存单元的偏移地址,段地址默认在ds中,也可以显式地给出段地址所在的段寄存器
-
loop和[bx]的联合应用
1.类型的匹配和结果的不超界的解决办法:用一个16位寄存器来做中介,将内存单元中的8位数据赋值到一个16位寄存器ax中,再将ax中的数据加到dx上。
mov al , ds:[0] mov ah , 0
-
段前缀
1.用于显示式指明内存单元的段地址的“ds:”、“cs:”、“ss:”、“es:”等
-
一段安全空间
1. 我们向一段内存中写入内容,这段空间不应该存放系统或其他程序的数据或代码
(在csapp中关于循环的做法)
1.利用了test指令来判断循环条件,有条件的跳转指令将使程序循环
2.test s1,s2 —— s1&s2(与and功能一样,但其只设置条件码,不改变目的寄存器的值)
3.jmp是无条件跳转,而除此之外的跳转指令都是有条件的(例如je 相等时;jne 不相等时;js 负数时;jg 大于时;jl 小于时等等)
4.一些条件码:(除了leap,一般的指令都会设置条件码)
(1)CF:进位标志
(2)ZF:零标志
(3)SF:符号标志
(4)OF:溢出标志