zoukankan      html  css  js  c++  java
  • 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: …..

  • 相关阅读:
    C/C++通过WMI和系统API函数获取获取系统硬件配置信息
    C++ 获取mac地址
    解决Win7下UAC开启时无法响应WM_DROPFILES消息
    C++vector迭代器失效的问题
    解决Duilib创建的win32窗口拖到屏幕上边缘自动最大化
    VC++获取计算机Hardware Information (CPU ID, MainBoard Info, Hard Disk Serial, System Information)
    VC++实现在系统托盘来新消息闪烁,鼠标悬停显示窗口
    正则表达式的懒惰匹配?
    thinkphp-许愿墙-3
    thinkphp-许愿墙-2
  • 原文地址:https://www.cnblogs.com/seebro/p/2426078.html
Copyright © 2011-2022 走看看