汇编学习--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在载入程序后保存程序的总长度。
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在载入程序后保存程序的总长度。
相关文章推荐
- 汇编学习-分支与循环
- 汇编学习--7.10--程序编写
- 汇编学习-分支与循环
- LinuxC学习之简单C循环看汇编
- 汇编学习---循环结构程序设计
- 汇编语言学习历程(一)分支、循环控制
- 汇编--学习笔记(八)-字符输入、输出(1号、2号、循环)
- 汇编语言学习系列 for循环实现
- 汇编入门学习笔记 (六)—— si、di,双重循环
- 32位汇编语言学习笔记(8)--分析do-while循环的汇编代码
- 32位汇编语言学习笔记(9)--分析while循环的汇编代码
- 【Ruby学习笔记】4:循环及其跳转
- Python学习笔记(七)—— 循环
- 【汇编语言学习01】寻址方式
- java学习入门必备:循环语句
- python学习2——if语句、elif、if嵌套、while循环、while嵌套
- pl/sql 之三大循环的完全学习指南
- 汇编学习之路(二)标号后定义数据产生错误
- muduo网络库学习(八)事件驱动循环线程池EventLoopThreadPool
- shell与awk学习复习例子(循环与字符串截取判断)