• 80X86学习笔记循环指令


    循环指令类似于条件转移指令,不公属于段内转移,而且也采用相对转移方式,即通过在IP上加一个地址差的方式实现转移,循环指令中也只用一个字节表示地址差,所以如果以循环指令本身作为基准,那么循环转移的范围在-126到+129之间。

    循环指令不影响各标志。

    (1)计数循环指令LOOP

    计数循环指令格式如下:LOOP 标号

    这条指令使寄存器CX的值减1,如果结果不等于0,则转到标号,否则顺序执行。

    该指令类似如下两条指令:

    DEC CX

    JNZ 标号

    通常在利用LOOP指令构成循环时,先要设置好计数器CX的值(循环计数次数),由于首先进行CX寄存器减1操作,再判断结果是否为0,所以最多可循环65536次。

    例:如下程序片段实现把从便宜1000H开始的512个字节数据复制到从偏移3000H开始的缓冲区中(假设在当前数据段中进行移动)

    MOV SI, 1000H

    MOV DI, 3000H

    MOV CX, 512

    NEXT:

    MOV AL, [SI]

    INC SI

    MOV [DI], AL

    INC DI

    LOOP NEXT

    …….

    (2)等于/全零循环指令LOOPE/LOOPZ

    等于/全零循环指令有两个助记符,格式如下:

    LOOPE 标号 或者 LOOPZ 标号

    这条指令使寄存器CX的值减1,当为0或相等时,(且零标志ZF等于1),那么则转到标号,否则顺序执行,注意指令本身实施的寄存器CX减1操作不影响标志

    例:字符串汇总查找第一个非‘A’字符。设字符串长度已保存在CX中,并且DS: DI指向字符串。如果找到,那么使BX指向该非‘A’字符,如果找不到,那么使BX=0FFFFH。

    MOV AL, ‘A’

    DEC DI

    NEXT: INC DI

    CMP AL, [DI]

    LOOPE NEXT

    MOV BX, DI

    JNE OK

    MOV BX, –1

    OK: …….

    (3)不等于/非零循环LOOPNE/LOOPNZ

    这条指令使寄存器CX的值减1,若结果不为0或不相等时,并且ZF等于0,那么则转移到标号,否则顺序执行。CX减1操作不影响标志位。

    (4)跳转指令JCXZ

    格式:

    JCXZ 标号

    指令实现当寄存器CX=0时转移到标号,否则顺序执行。

    通常该指令用在循环开始前,以便在循环次数位0时,跳出循环体。

    例:

    JCXZ OK

    NEXT:

    ….

    LOOP NEXT

    OK: …..

  • 相关阅读:
    mysql笔记
    ssh学习笔记
    oracle数据向历史表数据迁移————procedure
    关于避免模糊查询索引时效问题
    css圣杯布局和双飞翼布局篇
    什么是hasLayout
    高度自适应的水平垂直居中布局
    MAC的GIF动图录屏软件LICECAP
    sublime text 快捷键shortcuts
    为表格合并边框的样式
  • 原文地址:https://www.cnblogs.com/seebro/p/2426078.html
Copyright © 2020-2023  润新知