[英]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
我的邏輯是正確的還是有什么我可以改變以使其變得更好?
你有正確的想法,做得很好!
跳轉 label 目標cmp_x_and_z
應該是loop
,我認為只是一個錯字。
eax
中的x
應初始化為 0 而不是x
。 x
是一個循環局部變量,而不是一個參數(所以 x=x 沒有意義,但這里的 x=0 有意義)。
雖然我們希望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:
背靠背寫je
和jne
是沒有意義的。 它們是相反的條件,因此如果達到第二個條件,總是會被采用。 如果兩條執行路徑都需要 go 其他地方,請使用jmp
作為第二條。 如果不是,請使用單個條件分支,該分支會轉到其他地方或通過. Fall-through 是分支最有效的情況。
您還可以重新排列此循環以避免底部的jmp
,將條件分支作為循環分支。 為什么循環總是編譯成“do...while”風格(尾跳)?
或者如果你真的想優化,你會做y += z
而不是循環做z
遞增 1。
還有其他一些可能的改進,但這對於這個問題可能已經足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.