【问题标题】:x86 intel assembly language, not fully understandablex86 intel 汇编语言,不能完全理解
【发布时间】:2017-07-24 23:19:21
【问题描述】:

我已经阅读并观看了很多 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

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

【问题讨论】:

  • 第一行是标签,你应该已经知道了。 -1795719608 只是一个数字,eax 是乘以它。 PS:确保你有一个指令集参考,这样你就可以自己查找指令。
  • imul eax, eax, constant 不是指令。检查你的工作。
  • 考虑阅读汇编教程。这些问题非常基本,最好通过系统地学习汇编编程来回答。
  • 我想知道 -1795719608 是否是一些“神奇”的数字。如果你看一下 hackcenter 的例子,这解释了吗?

标签: assembly x86 intel


【解决方案1】:

注释代码。在入口处,[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

【讨论】:

    【解决方案2】:

    如果您想学习英特尔 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,也许他们会给你一个更好的答案。

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 2010-12-21
      相关资源
      最近更新 更多