c51汇编语言循环指令,汇编语言循环指令loop

loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为:-128--127

Loop指令的格式:

loop标号((cx)=(cx)-1,如果(cx) ≠ 0,转移到标号处执行。

操作:

(1)(cx)=(cx)-1

(2)判断cx的值是否为0

如果cx ≠ 0,跳转到标号出执行 (IP)=(IP)+8 位位移

8位位移=标号处的地址-loop指令后的第一个字节的地址;

8位位移的范围为-128--127,用补码表示;

8位位移由编译程序在编译时算出。

如果cx=0,执行loop后面的其它指令。

我们从loop的功能中可以看出,"loop标号”的功能相当于:

(CX)--

if((cx) ≠0) jmp short标号,

cx中的值影响着loop指令的执行结果。通常我们用loop指令来实现循环功能,cx中存放循环次数。

测例

任务1:编程计算2^12

assume cs:code

code segment

mov ax,2

mov cx,11

s:add ax,ax

loop s

mov ax,4c00h

int 21h

code ends

end

分析:

(1)标号

在汇编语言中,标号代表一个地址,此程序中有一个标号s。它实际上标识了一个地址,这个地址处有一条指令:add ax,ax

(2)loop s

CPU执行loop s的时候,要进行两步操作:

(cx)=(cx)-1;

判断cx中的值,不为0则转折标号s所标识的地址处执行(这里的指令是"add ax,ax"),如果为0则执行下一条指令(这里的下一条指令是"mov ax,4c00h")

(3)以下三条指令

mov cx,11

s:add ax,ax

loop s

执行loop s时,首先要将(cx)减一,然后若(cx)不为0,刚向前转至s处执行add ax,ax。

所以,我们可以利用cx来控制add ax,ax的执行次数。

任务2:计算ffff:0006单元中的数乘以3,结果存储在dx中。

(1)运算后的结果是否会超出dx所能储存的范围?

ffff:0006单元中的数是一个字节型的数据,范围在0~255之间,

则用它和3相乘结果不会大于65535,可以在dx中存放下。

(2)我们用循环累加来实现乘法,用哪个寄存器进行累加?

我们将ffff:0006单元中的数赋给ax,用dx进行累加。先设(dx)=0,然后做3次

(dx)=(dx)+(ax)。

(3)ffff:0006单元是一个字节单元,ax是一个16位寄存器,数据长度不一样,如何赋值?

注意,“赋值”是让ax中数据的值和ffff:0006单元中的数据的值相等。

8位数据01h和16位数据0001h的数据长度不一样,但它们的值是相等的。

赋值过程:

令(ah)=0,(al)=(fff6h)

程序:

assume cs:codesg

codesg segment

mov ax,0ffffh ;汇编源程序中,数据不能以字母开头

mov ds,ax

mov bx,6

mov al,[bx] ;以上,设置(ah)=0,(al)=((ds)*16+bx)

mov ah,0

mov dx,0 ;累加寄存器清零

mov cx,3 ;循环3次

s:add dx,ax

loop s

mov ax,4c00h

int 21h

codesg ends

end

任务3:求7+7+7+7+7的和:

CODE SEGMENT ;定义代码段

ASSUME CS:CODE,DS:DATA ;将CS和CODE,DS和DATA段建立联系

START:

MOV AX,0 ;初始化AX,用于存储求和结果

MOV CX,5 ;初始化循环次数,每循环一次,CX会自动减1,不需要自己写代码减

L: ;循环累加

ADD AX,7

LOOP L

MOV AH,4C00H ;将控制权返回给终端。

INT 21H

CODE ENDS

end

你可能感兴趣的:(c51汇编语言循环指令)