x86 intel汇编语言,不完全可理解

时间:2017-03-04 23:48:38

标签: assembly x86 intel

我已经阅读并观看了很多 youtube 视频而没有任何进展。 我试图从名为 hackcenter 的网站上学习,他们在汇编代码中向我提出了类似的问题。

testazza: //No idea what this is doing
.LFB0:  //No idea what this is doing either
        push    ebp 
        mov     ebp, esp //Creating the stack i guess
        mov     eax, DWORD PTR [ebp+8] //Moves 8bytes of memory allocation (Dont know what DWORD PTR DOES though)
        imul    eax, eax, -1795719608 //(Multiply what? Is -1795719608  a memory adress?                                       
        pop     ebp     //Pop the pointer                                                      
        ret   //Return

说实话,我不认为对此有足够的解释,所以如果有人能帮我理解这个程序实际上在做什么,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

评论代码。在入口处,[esp + 0] = 32位返回地址,[esp + 4} = 32位参数。在push ebp mov ebp, esp之后,[ebp + 4] = 32位返回地址,[ebp + 8] = 32参数(这是32位stdcall调用约定)。 imul实际上是无符号乘法,因为它只保留64位乘积的底部32位,而有符号或无符号乘法的底部32位相同。因此有符号整数-1795719608等效于无符号整数2499247688。

testazza:                    ; probably function label
.LFB0:                       ; probably not needed
        push    ebp          ; save ebp
        mov     ebp, esp     ; ebp = esp after the push
        mov     eax, DWORD PTR [ebp+8] ;move first parameter (32 bit) into eax
        imul    eax, eax, -1795719608  ;eax = eax * -1795719608
                                   ; or eax = eax * 0x94F77E48
                             ; eax is returned value
        pop     ebp          ; restore ebp, esp                                                      
        ret                  ; return to caller

答案 1 :(得分:0)

如果您想学习英特尔x86架构的汇编语言,我完全推荐Kip R. Irvine的x86处理器汇编语言。它是可以理解的并实现了一些库(例如输入/输出),以便专注于汇编语言的更重要的主题。 (link to the book on Amazon)。

现在,我将尝试解释代码的某些部分:

  1. imul eax, eax, -1795719608表示您获取寄存器eax的值并将其乘以-1795719608这是一个整数,然后再将结果保存在eax中。
  2. mov eax, DWORD PTR [ebp+8]。为了解释这一行see the following question,也许他们会给你一个更好的答案。