汇编语言-[bx]和loop的使用
前言
在之前,我们使用"ds:[0]、ds:[1]"等方式进行内存单元访问。其中,ds表示段地址,[0]表示偏移地址。在此次文章中,我们将介绍新的内存单元描述方式[bx],[bx]表示一个内存单元,其偏移地址在bx中。同时,在C++、C、Java中均有相应的循环结构避免不必要的重复性代码,类似的在汇编语言中也面临重复代码的执行,我们本章将介绍loop指令,完成汇编语言中的循环操作。一、[bx]与内存单元描述
首先我们需要知道的是,完整地描述一个内存单元需要两种信息:(1)内存单元地址;(2)内存单元长度(长度)。下面将介绍两种内存单元描述方式:
1.类似[0]表示内存单元方式: 用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出。
例:
mov ax,ds:[0]
;上述指令表示,将一个内存单元的内容送入ax。
;这个内存单元的长度为两个字节,存放一个字,偏移地址为0,段地址在ds中。
;值得注意的是:ax为16位寄存器,故其决定了内存单元长度为2个字节。
mov al,ds:[0]
;上述指令表示,将一个内存单元的内容送入ax。
;这个内存单元的长度为一个字节,存放一个字节,偏移地址为0,段地址在ds中。
;值得注意的是:ax为16位寄存器,由高8位(ah)和低8位(al)组成,故其决定了内存单元长度为一个字节。
2.[bx]表示一个内存单元: [bx]表示一个内存单元。它的偏移地址在bx中,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出。
例:
mov bx,0020H
mov ax,ds:[bx]
;上述指令表示,将一个内存单元的内容送入ax。
;这个内存单元的长度为两个字节,存放一个字,偏移地址在bx中,为20H,段地址在ds中。
;值得注意的是:ax为16位寄存器,故其决定了内存单元长度为2个字节。
mov bx,0020H
mov ax,ds:[bx]
;上述指令表示,将一个内存单元的内容送入ax。
;这个内存单元的长度为一个字节,存放一个字节,偏移地址在bx中,为20H,段地址在ds中。
;值得注意的是:ax为16位寄存器,由高8位(ah)和低8位(al)组成,故其决定了内存单元长度为一个字节。
二、loop指令
为了解决汇编语言中循环的问题,我们首先想到的是使用jmp指令,使CPU重复执行cs:ip开始处内存单元中的指令,例:;计算2的n次方
assume cs:code
code segment
mov ax,2
addNumber: add ax,ax
jmp addNumber
;程序返回
mov ax,4c00H
int 21H
code ends
end
上述解决代码中,通过jmp指令解决了重新执行"add ax,2"指令的问题,但存在的问题是 ** jmp指令无法控制循环次数** ,因此我们引入loop指令和cx寄存器(存放循环次数)。
1.loop指令格式
- loop指令格式
loop 标号
例: loop addNumber
;addNumber为标号
;标号实质标识某一处内存地址
- CPU执行loop指令过程
(1)(cx) = (cx)-1;
(2)判断cx中的值,不为零则转至标号处执行程 序,如果为零则向下执行。
- 循环次数存放在cx中
;循环次数存放于cx中
;例:
assume cs:code
code segment
mov ax,2
mov cx,9
addNumber: add ax,ax
loop addNumber
;程序返回
mov ax,4c00H
int 21H
code ends
end
;上述代码中,循环次数存放在cx中,"add ax,ax"被执行9次。
;程序实质为计算2的10次方
2.使用案例
编程题目:
计算ffff:0~ffff:b单元中的数据和,结果存在dx中。
程序代码:
assume cs:code
code segment
mov ax,0FFFFH
mov ds,ax ;设置段地址
mov bx,0 ;初始化偏移地址
mov cx,12 ;设置循环次数
mov dx,0 ;初始化dx寄存器
addNumber: mov al,ds:[bx] ;将内存单元数据存入ax寄存器中
mov ah,0
add dx,ax ;内存单元数据逐项递加
inc bx ;bx递增
loop addNumber ;循环自行11行和12行指令
mov ax,4c00H ;程序返回
int 21H
code ends
end
程序运行结果:
3.debug中使用p指令执行loop 指令
在debug中,我们通常使用 t命令逐语句执行程序,但当loop循环次数较多时,我们可采用p指令一次性完成loop指令的执行。
总结
- 个人对loop指令理解为:相当于do{…} while()循环;
- 若初始cx=1,那么循环体执行一次;若初始cx=0,循环体执行后,cx=FFFF,程序可继续执行下去,但这种行为有可能造成内存中数据混乱,属于危险行为;
- loop指令可以说是一种特殊的跳转指令。