我是汇编的初学者,我正在用汇编编写代码来与 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
应初始化为 0 而不是x
。x
是一个循环局部变量,而不是参数(因此 x=x 没有意义,但这里的 x=0 有意义)。虽然我们希望
cmp
和后续分支位于循环的顶部(所以它的作用就像一段时间,即使一次也不会执行主体,如果越界),尽管在向后分支形成循环期间执行的部分内,但inc
应延迟到循环体之后。根据大多数语言的定义,我们希望循环迭代变量在主体期间具有预增量值(因此我们可以执行 a[x] 等操作)。
eax
中的 mov eax, 0 ; x ... =0 (not x=x)
mov ebx, y ; y (y is an unknown input value)
mov ecx, z ; z (z is the end point)
loop: ; loop
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
inc eax ; increment of x++ done after loop body
jmp loop ; jump back to loop
done:
<小时/>
如果您想改进(条件)分支而不是(无条件)分支,则反转条件测试:
mov eax, 0 ; x ... =0 (not x=x)
mov ebx, y ; y (y is an unknown input value)
mov ecx, z ; z (z is the end point)
loop: ; loop
cmp eax,ecx ; compare x and z
je done ; if not equal then jump to add_1
add ebx, 1 ; y=y+1
inc eax ; increment of x++ done after loop body
jmp loop ; jump back to loop
done:
连续编写 je
和 jne
是没有意义的。它们是相反的条件,因此如果达到的话,总是采用第二个。如果两条执行路径都需要转到其他地方,请使用 jmp
作为第二条路径。如果没有,请使用一个条件分支,该分支会转到其他地方或失败。对于分支来说,失败是最有效的情况。
您还可以重新排列此循环,以避免底部的 jmp
,并将条件分支作为循环分支。 Why are loops always compiled into "do...while" style (tail jump)?
或者,如果您确实想要优化,您可以执行 y += z
而不是循环执行 z
递增 1。
还有其他一些可能的改进,但这可能足以解决这个问题。
关于python - 汇编和Python之间的传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58848982/