簡體   English   中英

組件和 python 之間的傳輸

[英]transfer between assembly and 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

我的邏輯是正確的還是有什么我可以改變以使其變得更好?

你有正確的想法,做得很好!

  1. 跳轉 label 目標cmp_x_and_z應該是loop ,我認為只是一個錯字。

  2. eax中的x應初始化為 0 而不是x x是一個循環局部變量,而不是一個參數(所以 x=x 沒有意義,但這里的 x=0 有意義)。

  3. 雖然我們希望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是沒有意義的。 它們是相反的條件,因此如果達到第二個條件,總是會被采用。 如果兩條執行路徑都需要 go 其他地方,請使用jmp作為第二條。 如果不是,請使用單個條件分支,該分支會轉到其他地方或通過. Fall-through 是分支最有效的情況。

您還可以重新排列此循環以避免底部的jmp ,將條件分支作為循環分支。 為什么循環總是編譯成“do...while”風格(尾跳)?

或者如果你真的想優化,你會做y += z而不是循環做z遞增 1。


還有其他一些可能的改進,但這對於這個問題可能已經足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM