2012-11-05 24 views
0
sample: 
pushq %rbp 
movq %rsp, %rbp 

movl %edi, -20(%rbp) 
movl $1, -16(%rbp) 
movl $0, -12(%rbp) 
movl $0, -8(%rbp) 
cmpl $2, -20(%rbp) 

讓我們說的輸入值是1如何設置1爲%RBP或%RSP我們在哪裏放的輸入值在寄存器在x64彙編

比什麼是%EDI的價值雖然

+0

這甚至不是8086彙編代碼。這是x64: -/ –

+0

哦,我的老師給了我這個,我們正在學習8086,所以我認爲這是,但什麼是1%edi的輸入值是正確的? – Nabmeister

+0

然後你的老師知道sh * t關於程序集。 –

回答

2

讓我們一步一步來:

  • 功能sample首先設置一個堆棧幀:pushq %rbp; movq %rsp, %rbp
  • 這樣可以節省0堆棧上的:movl %edi, -20(%rbp)。如果它是葉函數,則沒有明確遞減rsp
  • 它在堆棧中放置更多立即數:movl $1, -16(%rbp); movl $0, -12(%rbp); movl $0, -8(%rbp)
  • 它將在-20(%rbp)-20(%rbp)堆棧上的edi的保存值與2進行比較。假設它根據該比較做了某些事情(也許其餘代碼是相關的),則該函數的輸入必須是edi中的值。

另一種解決此問題的方法是AMD64 ABI,它指定rdi用於將第一個參數傳遞給函數。然後你可以進一步推斷出sample的第一個參數是一個32位寬的整數。