汇编语言实现eax到ebx区间计数程序运行结果异常求解
汇编区间计数程序错误排查
你的代码存在4个核心逻辑问题,完全没有实现预期的计数功能,所以运行后得到的是异常值:
- 多余定义了无用的
x存储区:你在.data段给x分配的两个long类型空间从头到尾没有被读写过,属于完全无效的代码。你误以为把x的地址存入ecx就能当计数变量,但实际上你全程没有修改过ecx里存的这个地址值,也没有对这个地址指向的内存做任何计数操作。 - 完全缺失计数累加逻辑:整个循环过程中你只做了比较eax、ebx和递增eax的操作,从来没有对任何一个变量做计数累加,自然得不到正确的差值结果。
- 循环判断和递增顺序有问题:你把
incl %eax放在比较结果判断之前,哪怕后续补上计数逻辑,也很容易出现边界多算/少算一次的问题。 - 结果存储逻辑完全错误:最后执行
movl %ecx, sum时,ecx里存的一直是x标签对应的内存地址,根本不是计数值,把地址写入sum的存储位置,得到的自然是和计数无关的异常数字。
修正后可正常运行的代码
不需要多余的x变量,直接用通用寄存器做计数器即可,逻辑如下:
.data # 数据段 sum: .long 0 .text # 代码段 .globl _start _start: movl $5, %eax # 初始化区间起始值为5,存入eax movl $10, %ebx # 初始化区间结束值为10,存入ebx movl $0, %ecx # 计数器ecx初始值置0 top: cmpl %ebx, %eax # 比较当前值和结束值 je done # 当前值等于结束值时,跳出循环 incl %ecx # 不相等则计数器加1 incl %eax # 当前值自增 jmp top # 回到循环头部继续判断 done: movl %ecx, sum # 将最终计数结果存入sum对应的内存空间
运行后sum里存储的值就是你预期的5。如果你确实要把计数存在内存的x空间而不是寄存器里,只需要把ecx相关的计数操作换成对x内存的直接操作即可,注意访问内存位置直接用标签名引用,不要提前把地址存到寄存器里却不做间接寻址。
内容的提问来源于stack exchange,提问作者shmoop maggedon
相关产品推荐
相关产品推荐

