第五章 [BX]和loop

1、[BX]表示的是内存单元,它的偏移地址在bx中,间接给出内存单元的偏移地址,则段地址默认在ds中

2、内存单元间接表示:[bx]

(1)mov dl,[bx]

间接寻址,可以使用bx间接访问内存单元,间接给出内存单元的偏移地址,默认段地址在ds中

(2)mov ax,[bx]

bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中。即:(ax)=((ds)*  16  +(bx))

(3)mov [bx],ax

bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处。即:((ds)*  16  +(bx))=(ax)

3、loop指令是否执行取决于cx的值,若cx=0,则执行loop后面的其他指令,若cx≠0,则跳转到标号处执行

4、遇到loop指令时,使用p命令来执行,Debug就会自动重复执行循环中的命令,直到(cx)=  0为止

5、如果段地址不在ds中,则需要使用cs,ss,es等段前缀,显式地指明内存单元的段地址

6、系统中某些地址处存放着重要的数据,dos方式下,一般情况,可以把数据写在0:200~0:2ff空间中

 

六、包含多个段的程序

1、dw:字型数据;db:字节型数据

2、如果代码和数据放在一个段中,反汇编时,如果从0开始,会把数据当成指令机器码反汇编,所以反汇编时注意sp的值

3、8086CPU不允许将一个数值直接送入段寄存器中

4、调试时,可以通过r命令修改ip的值或在t/g命令中指定执行的起始地址

5、end 标号:表示程序到标号处开始,到此结束,后面的标号有时候可以省略

6、使用assume仅仅表示将某个逻辑段和某个段寄存器关联起来;真正当做特定的段使用,需要在代码段中设置相应的段寄存器值

7、使用伪指令segment和ends定义逻辑段后,究竟使用作伪代码、数据段还是栈由程序员指定

8、段名代表的是段地址,是常数。不能使用mov直接送入段寄存器

 

七、更灵活的定位内存地址的方法

1、and指令

(1)and指令语法格式及对操作数要求与add指令相同

(2)可以实现将操作数指定位设置为0

2、or指令

(1)or指令语法格式及对操作数要求与add指令相同

(2)可以实现将操作数指定位设置为1

3、在debug环境中,默认十六进制;在完整汇编源程序中,默认十进制,支持二/十六进制

4、数据段中的数据可以逐个定义,也可以连续定义,支持字符形式和ASCΙΙ码书写形式,支持十/二/十六进制

5、字母的大小写转换

(1)大写->小写:

mov dl,'A'            mov dl,'A'

add dl,32            or dl,20H(or dl,00100000B)

(2)小写->大写

mov dl,'a'            mov dl,'a'

sub dl,32            and dl,0dfh(and dl,11011111B)

6、内存单元地址表示小结

 

八、数据处理的两个基本问题

1、汇编指令中操作数类型

2、在8086中,可用于表示内存偏移地址的寄存器只有:bx,si,di,bp

(1)这些寄存器可以单个出现在[ ]中,也可以以特定组合方式出现

(2)使用bx,si,di表示偏移地址时,默认段地址在ds中,可以加前缀es,cs,ss

(3)使用bp表示偏移地址时,默认段地址在ss中,可以加前缀ds,es,cs

3、把内存单元ds:[0]作为字节单元还是字单元,依赖于另一个操作数是8位还是16位

(1)mov byte ptr [0],5:5作为字节数据送到ds:[0]对应的字节单元

(2)mov word ptr [0],5:5作为字数据送到ds:[0]对应的字单元

4、无符号除法指令div

5、无符号乘法指令mul

6、db 8 dup(0)预留8个字节单元,每个单元值为0

 

总结:

感觉自己基础不扎实,刚开始学的时候花的时间不够,导致学后面的东西觉得很困难

不管是对于汇编还是其他任何一门课,课前预习,课后预习其实都是必不可少的

posted on 2018-12-20 23:21  樱花飘落の季節  阅读(304)  评论(0编辑  收藏  举报