loop指令

  loop系列的指令有:loop,loope/loopz,loopne/loopnz,它们都是借助于ECX寄存器作为计数来实现循环,每轮循环先ecx自动减1,再来判断ecx值,ecx的自减不会影响OF和CF。通用的格式是

    loopx lab

  • loop
    循环直到ecx为0。
    一个错误的例子:
 1 .section .data
 2 output:
 3     .asciz "array[%d]:%d\n"
 4 array:
 5     .int 1,2,3,4,5,6,7,8,9,10
 6 .section .text
 7 .globl main
 8 main:
 9     nop
10 /**
11 ** 一个错误的例子,ecx在printf中被重写
12 **/
13 /*    movl $9, %ecx
14 Loop1:
15     #pushal
16     pushl array(,%ecx,4)
17     pushl %ecx
18     pushl $output
19     call printf
20     addl $12, %esp
21     #popal
22     loopne Loop1
23 */
24     pushl $0
25     call exit

  在loop循环中调用其他函数极易重写ecx的值,这样一来循环被破坏,这点要特别注意。

  • loope/loopz

    • 循环直到ecx不为0,2个指令无任何区别
  • loopne/loopnz
    • 循环直到ecx为0,2个指令无任何区别

  这样看来,loop ,loopne/loopnz这3个指令好像都是一回事,先看下面的代码:

  这段代码是一个简单的求和代码

 1 .section .data
 2 output:
 3     .asciz "sum:%d\n"
 4
 5 .section .text
 6 .globl main
 7 main:
 8     nop
 9 /*清掉EFLAGS中的ZF*/
10     movl $1, %eax
11     addl $2, %eax
12
13     movl $0, %ecx
14     movl $0, %eax
15 loop1:
16     addl %ecx, %eax
17     loop loop1
18     #loopne loop1
19     pushl %eax
20     pushl $output
21     call printf
22     addl $8, %esp
23
24     pushl $0
25     call exit

  如果采用17行loop作为循环条件,ecx自减1,为-1,不为0,那么继续循环,也就是从0xFFFFFFFF---->0x0,结果是:

    sum:-2147483648

  如果采用18行loopne,结果是:

    sum:0

  细看loop:Loop until the ECX register is zero
  loopne/loopnz:Loop until either the ECX register is zero, or the ZF flag is set
  loopne/loopnz 多了一个条件,ZF也影响其判断。代码中虽然ecx在执行18行时,先ecx自减,为-1,但是同时16行代码导致ZF被置位,所以依旧执行了跳转。

  loope/loopz也判断了ZF。

时间: 2024-11-15 06:22:18

loop指令的相关文章

王爽《汇编语言》第三版 第五章 [BX]和loop指令

5.1 [bx] mov ax,[bx]功能:bx 中存放的数据作为一个偏移地址EA ,段地址SA 默认在ds 中,将SA:EA处的数据送入ax中. 5.2 Loop指令 指令的格式是:loop 标号,CPU 执行loop指令的时候,要进行两步操作: 1.(cx)=(cx)-1: 2.判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行. 通常我们用loop指令来实现循环功能,cx 中存放循环次数. 5.3 在Debug中跟踪用loop指令实现的循环程序 5.4 Debug和汇编编译器

小甲鱼零基础汇编语言学习笔记第五章之[BX]和loop指令

这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀. 1.[BX]的概念 [BX]和[0]类似,[0]表示内存单元的偏移地址是0.要完整描述一个内存单元,需要两种信息:内存单元的地址,内存单元的长度(类型).[BX]同样也表示一个内存单元,它的偏移地址在bx中,比如指令:mov ax,[bx].这里我们以一个程序为例: 1 assume cs:codesg 2 codesg segment 3 start: mov

汇编语言学习第五章-[BX]和loop指令

本博文系列参考自<<汇编语言>>第三版,作者:王爽 1.[bx]和内存单元的描述 [bx]与我们前面见过的[0]类似,mov ax,[0] 的意思是将内存地址为DS:0的两字节内容存入ax中.其中[0]中的0代表的是偏移地址. 类似的,我们有 mov al,[0]的意思是将内存地址为DS:0的单字节内容存入al中.那么我们可以大胆的推断mov ax,[bx]代表的是将偏移地址为bx寄存器中的值的内存地址的两字节内容存入到ax中,其段地址在DS中存储. 2.关于定义的描述性符号: &

汇编语言:第五章 [BX]和loop指令

1.[bx]与内存单元 [bx]是指 段地址在DS中,偏移地址在bx中的内存单元 2.loop 用于描述循环 3.我们定义的描述性符号 "()" 寄存器: (ax/al)表示ax/al寄存器中的内容 段寄存器:   ((ds)*16+(bx))表示段地址为ds内容,偏移地址为bx内容的内存单元的内容 内存单元:   (20000H)表示20000H内存单元中的内容 4.约定符号idata表示常量 mov ax,idata 表示mov ax,1 mov ax,2 等 mov ax,[id

汇编入门学习笔记 (四)—— [BX] 和 loop指令

疯狂的暑假学习之  汇编入门学习笔记 (四)-- [BX]  和 loop指令 参考:<汇编语言> 王爽 第5章 1.[BX] mov al,[1] 在debug中,会把bs:1 中数据赋给al,但在在masm中不会把bs:1 中数据赋给al,而是把 [1] 认为是 1 赋给al. 如果要实现在debug中的mov al,[1],在masm中就需要[bx] 如: mov bx,1 mov al,[bx] 还可以用 bs:[1] 的方式 如: mov al,bs:[1] 2.loop 循环 要使

第五章 [bx]和loop指令

要完整描述一个内存单元,需要两种信息:1.内存单元的地址:2.内存单元的长度(类型). 用[0]表示一个内存单元时,0代表单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如寄存器)指出. 我们定义描述性符号:"()",为了描述上的简洁,在以后的课程中,我们将用一个描述性的符号"()"来表示一个寄存器或一个内存单元中的内容. .Loop指令 其中cx是四个通用寄存器之一. 第一次读的时候没仔细研究,执行loop s,确实是先cx

[bx]和loop指令

1.[bx]的含义 [bx]表示一个内存单元,它的偏移地址在bx中,比如:mov ax,[bx]会将一个内存单元的内容送入ax,这个内存单元的长度是2个字节,存放一个字,偏移地址存放在bx中,段地址在ds中.mov al,[bx]则是移动半个字. 2.loop指令 loop 标号 CPU执行loop指令的时候分两步: 1.(cx)=(cx)-1 2.判定cx中的值,不为零则转至标号出执行程序,如果为0则向下执行. 从上面的描述中,我们可以看到,cx中的值影响着loop指令的执行效果.通常我们lo

汇编语言——[bx]和loop指令

[bx] 由于在编译器中mov AX,[0]指令会被编译器认为是mov AX,0所以引入[bx]的概念 mov [bx],AX的意思是将(ds)*16+(bx)内存位置的值赋给AX 用法和之前的ds[address]一样 小Tips 1 ; [bx]的使用方法 2 mov ax,1000H 3 4 mov bx,2000H 5 6 mov ds,ax ; 将ds数据段寄存器赋值为2000H 7 8 mov [bx],ax ; 将ax寄存器的值赋给内存单元21000H位置 9 10 ; 其他方式

实验四 [BX]和loop指令

一.练习1 编写完整汇编源程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0430h. 源程序如下: 运行结果如下: 二.练习2 综合使用loop和[bx],编写完整汇编源程序,实现向内存0:200~0:23f依次传送数据0~63(3FH). 源程序代码如下: assume cs:code code segment mov ax,00020h mov ds,ax mov bx,0 mov cx,64 s: mov [bx],bx inc bx loop s mov ax,4

‘第五章 [BX]和loop指令

<1>[BX] 想要完整地描述一个内存单元,需要两种信息:(1)内存单元的地址(2)内存单元的长度(类型).[BX]和[0]有些相似,表示一个内存单元,它的偏移地址在bx中.指令mov ax,[bx]的功能为将bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中,即(ax)=((ds)*16+(bx)).ps:此处的()表示的为括号内寄存器或者内存单元的内容. <2>Loop指令 loop在英语中有循环的含义,所以这个指令应该和循环有关.lo