如何将嵌套循环的C代码转为x86汇编?需修正现有代码问题
汇编代码修正与问题解答
原C代码的问题说明
原C代码存在笔误与未定义标识符问题,修正后逻辑如下:
int array_list[] = {10, 11, 13, 18, 21, 23, 24, 17, 45, 0}; // 补充1个元素满足40字节总大小 // 原代码的sample是笔误,正确应为数组元素类型大小 int array_size = sizeof array_list / sizeof(array_list[0]); int index = 0; int sum = 0; for (int current_size = array_size ; current_size > 0 ; current_size--) { while ( index < current_size) { if( array_list[index] % 2 == 0 ) // 判断偶数的标准写法 { sum += array_list[index]; } index += 1; } }
注:你提到希望array_size为40/4=10,因此数组需包含10个int元素(每个int占4字节),原数组仅9个元素,需补充1个元素(如0)实现该需求。
你的汇编代码核心问题
sample标识符问题:C代码里的sample是未声明的笔误,无需在汇编中额外声明,你用($ - array_list) / TYPE array_list计算数组元素个数的写法是正确的,对应C代码中sizeof(array_list)/sizeof(array_list[0])的逻辑。- 外层for循环逻辑错误:你的汇编代码在
L1开头直接dec ecx,跳过了初始的array_size值,且循环跳转逻辑完全不符合原C代码的外层循环逻辑。 - 偶数判断逻辑错误:
cmp array_list[esi], array_list[esi%2]完全偏离偶数判断逻辑,正确做法是检测数值的二进制最低位是否为0。
修正后的汇编代码
.386 .model flat, stdcall .stack 4096 ExitProcess PROTO, dwExitCode: DWORD .data sum DWORD 0 ; 补充1个元素,总大小40字节,array_size计算结果为10 array_list DWORD 10,11,13,18,21,23,24,17,45, 0 array_size = ($ - array_list) / TYPE array_list .code main PROC mov eax, 0 ; 初始化sum到eax寄存器 mov esi, 0 ; 初始化index为0 mov ecx, array_size ; current_size初始化为array_size L_OuterLoop: ; 外层for循环入口 L_InnerLoop: cmp esi, ecx jge L_EndInner ; index >= current_size时退出内层循环 ; 取出当前数组元素(esi是索引,需乘元素类型大小) mov edx, array_list[esi*TYPE array_list] test edx, 1 ; 检测最低位,ZF=1则为偶数 jnz L_SkipAdd ; 非偶数则跳过累加 add eax, edx ; 偶数元素累加到sum L_SkipAdd: inc esi ; index +=1 jmp L_InnerLoop ; 回到内层循环判断 L_EndInner: dec ecx ; current_size-- jnz L_OuterLoop ; current_size>0时继续外层循环 mov sum, eax ; 将结果存入sum变量 INVOKE ExitProcess, 0 main ENDP END main
关键修正点解释
- 数组大小调整:补充1个元素使数组总大小为40字节,
array_size计算结果为10,符合你的需求。 - 循环逻辑还原:
- 外层循环先处理
current_size初始值,执行完内层循环后再dec ecx并判断是否继续迭代。 - 内层循环通过
cmp esi, ecx判断index < current_size,满足则执行逻辑,否则退出内层。
- 外层循环先处理
- 偶数判断:用
test edx,1检测数值最低位,若结果为0(ZF标志位为1),说明是偶数,执行累加;否则跳过。 - 数组元素访问:汇编中访问数组元素时,索引
esi需要乘以元素类型大小(TYPE array_list,此处为4),否则会访问错误内存地址。
内容的提问来源于stack exchange,提问作者Thy Nguyen
相关产品推荐
相关产品推荐

