默认情况下,CPU 是顺序加载并执行程序。但是,当前指令有可能是有条件的,也就是说,它按照 CPU 状态标志(零标志、符号标志、进位标志等)的值,把控制转向程序中的新位置。
汇编语言程序使用条件指令来实现如 IF 语句的高级语句与循环。每条条件指令都包含了一个可能的转向不同内存地址的转移(跳转)。控制转移,或分支,是一种改变语句执行顺序的方法,它有两种基本类型:

  • 无条件转移:无论什么情况都会转移到新地址。新地址加载到指令指针寄存器,使得程序在新地址进行执行。JMP 指令实现这种转移。
  • 条件转移:满足某种条件,则程序出现分支。各种条件转移指令还可以组合起来,形成条件逻辑结构。CPU 基于 ECX 和标志寄存器的内容来解释真 / 假条件。

JMP 指令

JMP 指令无条件跳转到目标地址,该地址用代码标号来标识,并被汇编器转换为偏移 量。语法如下所示:

JMP destination

当 CPU 执行一个无条件转移时,目标地址的偏移量被送入指令指针寄存器,从而导致迈从新地址开始继续执行。

JMP 指令提供了一种简单的方法来创建循环,即跳转到循环开始时的标号:

top:
.
.
jmp top ;不断地循环

JMP 是无条件的,因此循环会无休止地进行下去,除非找到其他方法退岀循环。

LOOP 指令

LOOP 指令,正式称为按照 ECX 计数器循环,将程序块重复特定次数。ECX 自动成为计数器,每循环一次计数值减 1。语法如下所示:

LOOP destination

循环目标必须距离当前地址计数器 -128 到 +127 字节范围内。LOOP 指令的执行有两个步骤:

  • 第一步,ECX 减 1。
  • 第二步,将 ECX 与 0 比较。

如果 ECX 不等于 0,则跳转到由目标给岀的标号。否则,如果 ECX 等于 0,则不发生跳转,并将控制传递到循环后面的指令。
实地址模式中,CX 是 LOOP 指令的默认循环计数器。同时,LOOPD 指令使用 ECX 为循环计数器,LOOPW 指令使用 CX 为循环计数器。
下面的例子中,每次循环是将 AX 加 1。当循环结束时,AX=5, ECX=0:

mov ax,0
mov ecx,5
L1:
inc ax
loop L1

一个常见的编程错误是,在循环开始之前,无意间将 ECX 初始化为 0。如果执行了这个操作,LOOP 指令将 ECX 减 1 后,其值就为 FFFFFFFFh,那么循环次数就变成了 4 294 967 296!如果计数器是 CX (实地址模式下),那么循环次数就为 65 536。

有时,可能会创建一个太大的循环,以至于超过了 LOOP 指令允许的相对跳转范围。下面给出是 MASM 产生的一条错误信息,其原因就是 LOOP 指令的跳转目标太远了:

error A2075: jump destination too far : by 14 byte(s)

基本上,在一个循环中不用显式的修改 ECX,否则,LOOP 指令可能无法正常工作。下例中,每次循环 ECX 加 1。这样 ECX 的值永远不能到 0,因此循环也永远不会停止:

top:
.
.
inc ecx
loop top

如果需要在循环中修改 ECX,可以在循环开始时,将 ECX 的值保存在变量中,再在 LOOP 指令之前恢复被保存的计数值:

.data
count DWORD ?
.code
mov ecx, 100 ;设置循环计数值
top:
mov count, ecx ;保存计数值
.
mov ecx, 20 ;修改 ECX
.
mov ecx, count ;恢复计数值
loop top

循环嵌套

当在一个循环中再创建一个循环时,就必须特别考虑外层循环的计数器 ECX,可以将它保存在一个变量中:

.data
count DWORD ?
.code
mov ecx, 100 ;设置外层循环计数值
L1:
mov count, ecx ;保存外层循环计数值
mov ecx, 20 ;设置内层循环计数值
L2 :
loop L2 ;重复内层循环
mov ecx, count ;恢复外层循环计数值
loop L1 ;重复外层循环

提示:作为一般规则,多于两重的循环嵌套难以编写。如果使用的算法需要多重循环,则将一些内层循环用子程序来实现。

汇编语言JMP和LOOP(转移)指令相关推荐

  1. 汇编语言笔记10-CALL和RET指令

    ☞模块化程序设计 模块化程序设计 汇编语言通过call和ret指令实现了模块化程序设计.可以实现多个相互联系.功能独立的子程序来解决一个复杂的问题. 子程序的框架 1 assume cs:code 2 ...

  2. 汇编语言--jmp指令

    jmp为无条件转移,转到标号处执行指令可以只修改IP,也可以同时修改CS和IP: jmp指令要给出两种信息: 转移的目的地址 转移的距离(段间转移.段内短转移,段内近转移) ​ jmp short 标 ...

  3. Win-MASM64汇编语言-JMP指令

    jmp是转移指令,且是无条件转移指令,在8086架构下,可以只修改IP,也可以同时修改CS和IP,转移指的就是转移CPU在代码段中执行的代码位置,分段内转移和段间转移,如果只修改IP,则叫段内转移,如 ...

  4. 汇编:汇编语言实现冒泡排序(loop指令实现)

    1 ;=============================== 2 ;循环程序设计 3 ;loop指令实现 4 ;冒泡排序 5 ;for(int i=0;i<N;i++){ 6 ; for ...

  5. [汇编语言][bx]和loop指令

    目录 一.[bx]与loop基本描述 二.[BX] 三.Loop指令 四.在Debug中跟踪用loop指令实现的循环程序 五.Debug和汇编编译器masm对指令的不同处理 六.loop和[bx]的联 ...

  6. 汇编语言[BX]和loop指令

    1.使用bx来描述内存单元 我们知道mov ax,[0],是将偏移0的地址的值给寄存器ax,我们可以使用寄存器bx来动态的访问,比如: mov ax,1000 mov ds,ax mov bx,000 ...

  7. 用7ch中断例程完成jmp near ptr s指令的功能,用bx向中断例程传送转移位移。

    应用举例:在屏幕的第12行,显示data段中以0结尾的字符串. assume cs:codedata segmentdb 'conversation',0 data endscode segments ...

  8. 转移指令jmp和跳转指令call

    [-1]写在前面 以下内容文字描述来自于 王爽老师的<汇编语言>教材,建议大家都买一本,哈哈.不是我打广告,确实人家写的好,应该支持.我只是附上了自己的图片和理解而已. [0]先上干货 只 ...

  9. 汇编语言中的loop循环

    在高级语言中常常需要对于一些数组或者是列表进行遍历操作,这些在我们可以使用for循环.while循环和do-while循环进行便利操作.在一些实际问题中,循环指令常常使用用于解决需要连续重复的问题. ...

最新文章

  1. python数据分析基础 余本国_Python数据分析基础
  2. JavaScript是如何同时做到单线程和异步执行的
  3. IOS 控件 - Swift 集成 IOS 自带 API 扫描二维码
  4. 【转】log4net使用详解
  5. case when 多条件_3年前的设计如今被iPhone强推 PITAKA磁吸生态设计的前瞻性到底有多可怕?...
  6. 【活动预告】数据资产化论坛
  7. Q: 为什么如果我们把这两个组件安装在同一个COM+组件包中问题就不会出现(zz)...
  8. eclipse安装Android模拟器genymotion及其插件
  9. ecshop 全目录说明
  10. SQOOP对分隔符支持情况的验证
  11. xsd 生成 java 类_如何从Java类生成XSD
  12. 测试用例入门(二) - 使用等价类划分法编写测试用例
  13. js实现农历和公历相互转换(完整demo)
  14. 云寻觅中文分词 (Yunxunmi Chinese Word Segmentation) ,词汇440万,10万字文章分词并计算频率不超过1秒
  15. Python argparse.ArgumentParser的add_argument()用法
  16. 计算机主板的典型布局,主板布局
  17. PPT多张图片的融合插件
  18. checkpatch海思SDK代码遇见的常见错误《二》
  19. shell if 未找到命令
  20. js 三大家族(offset/scroll/client)

热门文章

  1. 全国竞赛算不算全国计算机二级,竞赛证书的等级如何区分
  2. Java随笔——逻辑运算符和(|和||)之间的区别
  3. mysql数据库怎么查看端口号_怎么查看数据库端口号(mysql怎么查看端口号)
  4. IP CAMERA 介绍
  5. Microsoft store 无法联网。你似乎没有联网。代码: 0x80131500
  6. 一款超好的省市区三级联动插件citypicher的使用(数据分从数据库获取或从js文件获取)
  7. C语言入门:立体几何计算题
  8. 计算机中录音文件以什么格式保存,手机录音是什么格式
  9. 实验7 蓝桥ROS1使用外设 适用kinetic/melodic/noetic
  10. Java Main如何被执行?(转)