使用汇编语言实现WHILE循环
WHILE 循环在执行语句块之前先进行条件测试。只要循环条件一直为真,那么语句块就不断重复。下面是用 C++ 编写的循环:
【示例】循环内的 IF 语句嵌套
高级语言尤其善于表示嵌套的控制结构。如下 C++ 代码所示,在一个 WHILE 循环中有嵌套 IF 语句。它计算所有大于 sample 值的数组元素之和:
while( val1 < val2 )
{
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 ( 常数 )。标号名称也已经添加到逻辑框上。
汇编代码
从流程图生成汇编代码最简单的方法就是为每个流程框编写单独的代码。注意流程图标签和下面源代码使用标签之间的直接关系: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