我已经阅读并观看了很多 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
说实话,我不认为对此有足够的解释,所以如果有人能帮我理解这个程序实际上在做什么,我将不胜感激。
答案 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)。
现在,我将尝试解释代码的某些部分:
imul eax, eax, -1795719608
表示您获取寄存器eax
的值并将其乘以-1795719608这是一个整数,然后再将结果保存在eax
中。mov eax, DWORD PTR [ebp+8]
。为了解释这一行see the following question,也许他们会给你一个更好的答案。