python - 汇编和Python之间的传输

标签 python assembly x86

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

我的逻辑正确吗?还是有什么我可以改变以使其变得更好?

最佳答案

你的想法是正确的,干得好!

  1. 跳转标签目标cmp_x_and_z应该是loop,我认为只是一个拼写错误。

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

  4. 虽然我们希望 cmp 和后续分支位于循环的顶部(所以它的作用就像一段时间,即使一次也不会执行主体,如果越界),尽管在向后分支形成循环期间执行的部分内,但 inc 应延迟到循环体之后。根据大多数语言的定义,我们希望循环迭代变量在主体期间具有预增量值(因此我们可以执行 a[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。

<小时/>

还有其他一些可能的改进,但这可能足以解决这个问题。

关于python - 汇编和Python之间的传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58848982/

相关文章:

assembly - `test` 指令是如何工作的?

optimization - 长延迟指令

python - 如何使用 PyQt 或 PySide 在系统托盘中显示一些文本而不是图标?

Python:给一个与函数同名的参数是不是不好的风格?

python - 这个 tensorflow 安装有什么问题?我已经安装了GPU版本的tensorflow

performance - ARM7 Cortex A8上的浮点状态传输

linux - 汇编函数整型局部变量

python - 了解经过训练的神经网络内存使用情况

gcc - 无法编译程序集 :/usr/bin/ld: i386 architecture of input file `array1.o' is incompatible with i386:x86-64 output

c - 使用 ptrace 检测调用的偏移量