程序集和python之间的传输

2024-09-27 07:31:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我是汇编的初学者,我正在汇编中编写一段代码,与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

我的逻辑是正确的,还是有什么我可以改变的?你知道吗


Tags: andtoloopaddifequalmovcmp
1条回答
网友
1楼 · 发布于 2024-09-27 07:31:06

你的想法是对的,干得好!你知道吗

  1. 跳转标签的目标cmp_x_and_z应该是loop,我想只是一个输入错误。

  2. x中的eax应该初始化为0而不是xx是一个循环局部变量,不是一个参数(因此x=x没有意义,但是x=0在这里有意义)。

  3. 虽然我们希望cmp和下面的分支位于循环的顶部(因此它的行为就像一段时间,即使超出边界也不会执行一次主体),但是inc应该延迟到超过循环的主体,尽管在向后分支期间执行的部分内,以形成循环。根据大多数语言的定义,我们希望循环迭代变量在主体过程中具有预先递增的值(因此我们可以执行[x]之类的操作)。


    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: 

jejne背靠背地写是没有意义的。他们是相反的条件,所以第二个总是采取如果达到了。如果两条执行路径都需要转到其他地方,请使用jmp作为第二条路径。如果不是,则使用一个单独的条件分支,该分支将转到其他地方或通过。对于分支机构来说,失败是最有效的情况。你知道吗

您还可以重新安排这个循环,以避免底部的jmp,将条件分支作为循环分支。Why are loops always compiled into "do...while" style (tail jump)?

或者如果你真的想优化,你应该做y += z而不是循环做z增量1。你知道吗


还有其他一些可能的改进,但这对于这个问题可能已经足够了。

相关问题 更多 >

    热门问题