我是汇编的初学者,我正在汇编中编写一段代码,与python进行比较,然后看看是否相同。你知道吗
mov eax, x ; x
mov ebx, y ; y
mov ecx, z ; z
loop: ; loop
inc eax ; plus 1 to x
cmp eax,ecx ; compare x and z
jne add_1 ; if not equal then jump to add_1
je done ; if equal then jump to done
add_1: ; add_1 statement
add ebx, 1 ; y=y+1
jmp cmp_x_and_z ; jump back to loop
done:
我想和python中的这个进行比较
for x in range(z):
y = y + 1
我的逻辑是正确的,还是有什么我可以改变的?你知道吗
你的想法是对的,干得好!你知道吗
跳转标签的目标
cmp_x_and_z
应该是loop
,我想只是一个输入错误。x
中的eax
应该初始化为0而不是x
。x
是一个循环局部变量,不是一个参数(因此x=x没有意义,但是x=0在这里有意义)。虽然我们希望
cmp
和下面的分支位于循环的顶部(因此它的行为就像一段时间,即使超出边界也不会执行一次主体),但是inc
应该延迟到超过循环的主体,尽管在向后分支期间执行的部分内,以形成循环。根据大多数语言的定义,我们希望循环迭代变量在主体过程中具有预先递增的值(因此我们可以执行[x]之类的操作)。如果要将(条件)分支改进为(无条件)分支,请反转条件测试:
把
je
和jne
背靠背地写是没有意义的。他们是相反的条件,所以第二个总是采取如果达到了。如果两条执行路径都需要转到其他地方,请使用jmp
作为第二条路径。如果不是,则使用一个单独的条件分支,该分支将转到其他地方或通过。对于分支机构来说,失败是最有效的情况。你知道吗您还可以重新安排这个循环,以避免底部的
jmp
,将条件分支作为循环分支。Why are loops always compiled into "do...while" style (tail jump)?或者如果你真的想优化,你应该做
y += z
而不是循环做z
增量1。你知道吗还有其他一些可能的改进,但这对于这个问题可能已经足够了。
相关问题 更多 >
编程相关推荐