2017-08-25 98 views
-3

我正在學習裝配/倒車。例如,我只用一個參數來查找idiv和imul的文檔,同時也明白哪個參數是第一個和最後一個是在sub/add中。我已被給予以下代碼(與我的理解在評論)逆向工程彙編代碼

start: 
mov $1024, %rax ; move int value 1024 to register rax 
mov $4096, %rbx ; move int value 4096 to register rbx 
mov $2048, %rcx ; move int value 2048 to rax rcx 
xor %rdx, %rdx ; rcx XOR rcx. rcx = 0 
sub %rcx, %rbx ; sucstract rcx from rbx? rbx = 2048? 
cmp %rbx, %rax ; compare rbx to rax 
jge loopa ; if rax > rbx, jump to loopa ? (false first time) 
jmp loopb ; else jump to loopb 
loopa: ; start loop a 
cmp $4, %rdx ; compare int value 4 to register rdx 
jg end ; if rdx > 4 jump to end 
inc %rdx ; rdx++ (rdx = 1 first time) 
loopb: 
xchg %rax, %rbx ; (switch value of rax and rbx) 
idiv %rbx ; signed divide, but divide on what? 
add %rdx, %rax ; add rdx to rax ? 
imul %rcx ; (multiple what?) 
jmp loopa ; jump to loopa 
end: 

這是一個給定的x86彙編方言嗎?我已經尋找指示,我發現他們有所不同。無論在參數,語法等。

+7

這是[at&t語法](https://sourceware.org/binutils/docs/as/i386_002dVariations.html)。至於idiv和imul,它們當然在[官方英特爾指令集參考手冊]中以極小的細節描述(https://software.intel.com/sites/default/files/managed/a4/60/325383-sdm -vol-2abcd.pdf)和各種[互聯網上的副本](http://x86.renejeschke.de/)。 – Jester

+1

'IDIV'就像'DIV'一樣工作(除了將參數視爲有符號)。股息預計在'AX' /'DX:AX' /'EDX:EAX'。 http://www.felixcloutier.com/x86/IDIV.html – Thilo

+0

這是一種不完整的AT&T語法,說明可能有大小後綴,即'cmpq%rbx,%rax',因爲它與'qword'類型的寄存器一起工作,或者'cmpb%bl,%al',如果它只使用字節類型的話,如果你不知道AT&T語法是否存在,並且有人會告訴你這樣的x86程序集,這又是另一個混​​亂的來源......(通常我建議而是學習+使用英特爾語法,如果您可以自由選擇) – Ped7g

回答

2

可能是輸入錯誤,但我想讓你注意無論如何:在這行 jge loopa ; if rax > rbxjge意味着如果跳大或等於,所以if rax >= rbx。請記住,每個AT指令(是的,這是intel語法的一種方言)指令都有這種模式:指令源,目標地址爲。因此,對於算術或比較指令,您必須從第二個操作數開始「思考」。

關於idivimul說明,您應該閱讀this