2025年4月7日 星期一 乙巳(蛇)年 正月初八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 汇编

使用汇编语言实现WHILE循环

时间:03-05来源:作者:点击数:98

WHILE 循环在执行语句块之前先进行条件测试。只要循环条件一直为真,那么语句块就不断重复。下面是用 C++ 编写的循环:

while( val1 < val2 )
{
    val1++;
    val2 --;
}

汇编语言实现这个结构时,可以很方便地改变循环条件,当条件为真时,跳转到 endwhile。假设 val1 和 val2 都是变量,那么在循环开始之前必须将其中的一个变量送入寄存器,并且还要在最后恢复该变量的值:

  • mov eax, val1 ; 把变量复制到 EAX
  • beginwhile:
  • cmp eax, val2 ; 如果非 val1 < val2
  • jnl endwhile ; 退出循环
  • inc eax ; val1++;
  • dec val2 ; val2--;
  • jmp beginwhile ; 重复循环
  • endwhile:
  • mov val1, eax ;保存 val1 的新值

在循环内部,EAX 是 val1 的代理(替代品),对 val1 的引用必须要通过 EAX。JNL 的使用意味着 val1 和 val2 是有符号整数。

【示例】循环内的 IF 语句嵌套

高级语言尤其善于表示嵌套的控制结构。如下 C++ 代码所示,在一个 WHILE 循环中有嵌套 IF 语句。它计算所有大于 sample 值的数组元素之和:

  • int array[] = {10,60,20,33,72,89,45,65,72,18};
  • int sample = 50;
  • int ArraySize = sizeof array / sizeof sample;
  • int index = 0;
  • int sum = 0;
  • while( index < ArraySize )
  • {
  • if( array[index] > sample )
  • {
  • sum += array[index];
  • }
  • index++;
  • }

在用汇编语言编写该循环之前,用下图的流程图来说明其逻辑。为了简化转换过程,并通过减少内存访问次数来加速执行,图中用寄存器来代替变量:EDX-sample, EAX=sum, ESI=index, ECX=ArraySize ( 常数 )。标号名称也已经添加到逻辑框上。 

包含IF语句的循环

汇编代码

从流程图生成汇编代码最简单的方法就是为每个流程框编写单独的代码。注意流程图标签和下面源代码使用标签之间的直接关系:

  • array DWORD 10,60,20,33,72,89,45,65,72,18
  • ArraySize = ($ - Array) / TYPE array
  • .code
  • main PROC
  • mov eax,0 ; 求和
  • mov edx,sample
  • mov esi,0 ; 索引
  • mov ecx,ArraySize
  • L1: cmp esi,ecx ; 如果 esi < ecx
  • jl L2
  • jmp L5
  • L2: cmp array[esi*4], edx ; 如果array[esi] > edx
  • jg L3
  • jmp L4
  • L3: add eax,array[esi*4]
  • L4: inc esi
  • jmp L1
  • L5: mov sum,eax
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门