您的位置:首页 > 其它

汇编学习--7.10--循环

2012-07-10 14:49 239 查看
[bx]:同样表示一个内存单元,他的偏移地址在bx中(可把bx看做一个变量名)。

loop指令:循环指令。当执行loop指令的时候,先将(cx)=(cx)-1,然后再判断(cx)的值是否为0,如果不为0,则跳转至“标号:”处执行程序,如果为0则向下继续执行。

注意:循环语句之前,在cx中存放循环的次数。

loop指令中的标号所标识地址要在前面。

循环体在标号和loop指令的中间。

loop循环指令格式:

标号:

…………

loop 标号

描述性符号——():表示一个寄存器或者一个内存单元中的内容,括号中的内容可以是寄存器、段寄存器、物理地址。示例:(ax) (ds) (20000H) ((ds)*16+(bx)) , 而(2000:0) ((ds):1000H)是错的!

描述性符号——idata:表示一个常量。

描述性符号——SA:EA :段地址SA,偏移地址EA。
inc bx:表示(bx)=(bx)+1。

dec bx:表示(bx)=(bx)-1。
汇编语言当中,数据不能以字母开头,如果想将段地址ffff送入ax中,只能在数据前加上0才行,即:mov ax,0ffff
汇编程序的跟踪:在debug中,用debug 文件名.exe指令来加载程序进入内存,让CPU执行。然后用r命令-r和u命令-u cs:(IP) 来查看当前个寄存器和内存指令的值;用t命令跟踪执行每一条指令,用p命令执行int 21H指令。

-----------------------------------------------------------------------------------------------------------------------------

跟踪技巧:1、如果只想跟踪循环过程,而一次性执行完循环标号前的语句,就可以用g命令-g (IP)来是实现,他将执行(CS):(IP)的指令。

2、 如果在循环语句中,由于次数太多而想一次性执行完循环内容,就可以使用p命令:当遇到loop语句执行的时候,-p就能够实现;或者也可以用g命令-g (IP)来实现。

-----------------------------------------------------------------------------------------------------------------------------

masm编译器中,访问内存单元的指令mov ax , [0]被解释成mov ax , 0 。因此为了避免这种差异带来的错误,我们有两种解决方法。

1、将偏移地址0保存在bx中,再mov ax , [bx]。这样做可行,但不常用 ;

2、在[0]前面显式地加上段前缀,即:段名: 。示例:mov ax ds:[0] 。

注意:如果[]利用寄存器,如[bx],则默认为ds段,可以不用加上段前缀;如果不是访问ds段,则同样需要加上段前缀,如cs:[bx] 。

-----------------------------------------------------------------------------------------------------------------------------

在循环累加的过程中,如果用DX存放累加值,用DS:BX中的值累加到DX中,会出现两个问题:1、add dx,[bx] 类型不匹配;2、add dl,[bx] 可能结果超界,进位丢失。因此方法之一是使用16位寄存器做中介:

mov ah,0

mov al,[bx]

add dx,ax

-----------------------------------------------------------------------------------------------------------------------------

安全操作空间:在DOS方式(实模式)下,DOS和其他合法的程序一般都不会使用0000:0200——0000:02ff的256个字节的空间,因此我们使用这段空间是安全的。可以用debug -d 查看一下,如果这段空间内容均为0则说明未被使用。

-----------------------------------------------------------------------------------------------------------------------------

操作数:有三种,分别是寄存器操作数(如:ax ,ds),存储器操作数( 如:[ 0 ]),立即数(如:05H 、段名)。

-----------------------------------------------------------------------------------------------------------------------------

mov用在寄存器之间传送数据的指令是2个字节,用在寄存器和立即数之间是3个字节。所以,movax,cs 占2个字节
; movax,code 占3个字节。

-----------------------------------------------------------------------------------------------------------------------------

CX在载入程序后保存程序的总长度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: