汇编-loop指令

汇编语言中的约定

(…)和[ ]

(…):表示寄存器和单元的内容

(ax)=100 意思为ax寄存器中的值为100.

[ ]:表示内存单元,通常与DS段寄存器一起使用

mov ax,DS:[100] 意思为将DS:[100]单元的内容送入ax中

idata

符号idata的意思表示一个常量。

mov ax,idata 意思是将一个常量送入ax中,idata指代这里可以使用某个具体的数

标号

在汇编中标号代表一个地址。

assume cs:code
code segment
	mov ax,2

	mov cx,11
s:  add ax,ax       ;标号s表示这一段的地址
	loop s			;重复执行地址s的内容

	mov ax,4c00h
	int 21h			;这里两句相当与c语言的return 0;
	code ends
	end

在这里可以看到除了我们的汇编语句以外,还有一个单独的s,这个s就是标号,表示add ax,ax的地址。loop表示循环,后面会介绍。
在前一章里面的start表示代码段的开始地址,就是一个标号。

loop指令

某些时候我需要重复的执行一条语句,我们书写多遍会很麻烦,这个时候loop指令就可以完成这个工作,loop指令在使用的时候有那种情况

单独使用

首先我们给cx赋值,然后每执行一遍,给cx减一,cx不为0则重复执行。
就如上面的代码,我们先给cx赋值要执行的次数,然后标记要重复执行的代码地址,接着使用loop执行。
每执行一遍cx=cx-1,当cx=0时则停止执行。

与bx连用

这里我们需要结合bx一起使用。bx表示起始偏移地址,cx表示循环次数,每执行一次cx=cx-1。当cx为0时停止。
使用情况:操作一段连续的空间时

将ffff:0~ffff:b单元中的数据累加结果存储到dx中:
assume cs:code
code segement
	mov ax,0ffffh
	mov ds,ax        ;给ds寄存器赋值
					 ;使ds:[bx]指向数据的起始地址
	
	mov bx,0         ;起始地址偏移为0
	mov dx,0         ;初始化dx
	mov cx,12        ;设置循环次数

s:  mov al,[bx]  ;这里传输的为字节数据,数据类型决定后面bx增加的值			     
	mov ah,0
	add dx,ax
	inc bx       ;高八位,低八位分别占1字节,所以加一,如果为字型则加二
	loop s       ;循环
	
	mov ax,4c00h
	int 21h
	code ends
end

需要注意的是:
bx增加多少取决与累加的数据类型,数据类型可以看寄存器是ax还是al,ah,详细的将在后面介绍。

段前缀

我们在使用内存内容时,是采用的DS:[…],但是当有多个地址要操作时,我们也会使用操作附加数据的es寄存器。同样也是使用ES:[…]来表示。
因此我们引入了一个段前缀:

mov ax,DS:[100]           ;将DS:[100]单元的数据传入ax中
或者
mov ax,ES:[100]           ;将ES:[100]单元的数据传入ax中

即显示的在前面加上段寄存器。

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&阿权&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值