我是汇编编程的新手,我正在使用使用内存堆栈的push和pop指令。那么,堆栈默认大小是多少,如何修改它以及它的大小限制是多少? 最佳答案 筹码量取决于很多因素。这取决于你从哪里开始堆栈,你有多少内存,你使用的是什么CPU等等。您使用的CPU不称为“WindowsCPU”。如果您要指定正在使用的CPU,请详细指定该CPU的名称,而且非常重要的是,还要指定CPU的体系结构。在这种情况下,您可能使用的是x86架构。这是x86架构的内存映射:AlladdressesBefore0X100000-Free0x100000-0xc0000-BI
我在研究ZeuS恶意软件时遇到了sourcecode:HMODULE_getKernel32Handle(void){#ifdefined_WIN64returnNULL;//FIXME#else__asm{cld//clearthedirectionflagfortheloopmovedx,fs:[0x30]//getapointertothePEBmovedx,[edx+0x0C]//getPEB->Ldrmovedx,[edx+0x14]//getthefirstmodulefromtheInMemoryOrdermodulelistnext_mod:movesi,[edx+0x
我对汇编很陌生(昨天开始学习)并且遇到循环问题:下面的代码应该打印值0-49,但它打印的是0-49,然后是~20行垃圾(我假设这是堆栈的一部分,其他程序/程序的其他部分正在使用)。我预计问题出在第二个循环.loop,因为它打印了错误的行数,而打印由.loop处理。我正在使用FASM(FlatAssembler)程序来编译它。代码:formatPEconsoleinclude"win32ax.inc"start:movecx,50;numberofloops.mainloop:;fortestingpurposes,justpushes49-0ontothestackpushecx;pu
当在x86-64代码中使用时,我试图了解代码段描述符中D标志的工作原理。它设置在代码段描述符的D/B位22中,如下图所示:英特尔文档(来自3.4.5SegmentDescriptors部分)陈述如下:D/B(defaultoperationsize/defaultstackpointersizeand/orupperbound)flagPerformsdifferentfunctionsdependingonwhetherthesegmentdescriptorisanexecutablecodesegment,anexpand-downdatasegment,orastacksegm
成功制作“Hello,World!”后x86-64中的程序,我想要制作一个可以查看堆栈顶部的程序(无需弹出堆栈,并使用esp寄存器,这样我就可以了解它是如何工作的)。这是NASM中的程序:externGetStdHandle,WriteConsoleA,ExitProcesssection.bssdummyresd1section.text%macroprint3movrcx,%1movrdx,%2movr8,%3movr9,dummypushNULLcallWriteConsoleA%endmacro_start:movrcx,STD_OUTPUT_HANDLEcallGetStdH
编辑/更新所以我认为让我感到困惑的是:LEAESI,[EBX+8*EAX+4]加载一个地址,但是:LEAESI,[EBX+4]加载内容(值?)而不是地址。这怎么不是取消引用?我也不知道是什么mov[eax+1],ecx是吗?原始问题我正在努力学习阅读汇编,但我开始挣扎了。抱歉,如果有拼写错误,我无法从我的实验室机器上复制。这是来自恶意代码,因此它可能不是最佳的。我想我在某处理解有缺陷,但我就是想不通。var_30=byteptr-30hleaeax,[ebp+esi+var_30]我的理解是,加载有效地址将成为从[basepointer-30h+esi]计算出的任何地址。我不知道esi
我目前正在尝试将空终止符append到(a?)用户输入的字符串:.386.modelflat,stdcallWriteFilePROTOSTDCALL:DWORD,:PTR,:DWORD,:PTRDWORD,:PTROVERLAPPEDReadFilePROTOSTDCALL:DWORD,:PTR,:DWORD,:PTRDWORD,:PTROVERLAPPEDGetStdHandlePROTOSTDCALL:DWORD.databuffDB100hDUP(?)stdInHandleDWORD0bytesReadDWORD?.codestart:;readstringfromstdinI
这很难说/问,所以请耐心等待:当我们看到汇编的输出时,这就是将要在CPU核心上执行的内容。但是,如果一个CPU有多个内核——所有的程序集都是在同一个内核上执行的吗?来自同一程序的程序集会在什么时候开始在不同的内核上执行?所以如果我有(汇编伪):ADDx,y,zSUBp,x,q我如何知道ADD和SUB是否会在同一个内核上执行?这与亲和性有关吗?我以为affinity只是将进程固定到CPU,而不是核心?我问这个是因为我想尝试了解您是否可以合理地预测连续的汇编指令是否在同一个内核上执行,以及我是否可以控制它们只在同一个内核上执行。我想了解如何决定将执行相同的程序代码从一个内核更改为另一个内核
正如我在另一个问题中向我建议的那样,我检查了WindowsABI,如果我自己不调用WindowsAPI,我对我能做什么和不能做什么感到有点困惑。我的场景是我正在编写.NET程序,并且需要在asm中针对特定处理器编写一小段代码,用于对数组执行大量多channel处理的时间关键代码部分。在https://msdn.microsoft.com/en-us/library/9z1stfyw.aspx处检查ABI中的注册信息时我对什么适用于我感到有点困惑1)不要从asm代码调用windowsAPI2)不要返回一个值,只接受一个参数。这是我的理解,我的理解是否正确?RAX:我可以在不保留它的情况下
在下面的玩具程序中,我在.text部分声明了一个变量并写入它,这给出了一个段错误,因为.text部分被标记为只读:Breakpoint1,0x00401000instart()(gdb)disassembleDumpofassemblercodeforfunctionstart:=>0x00401000:movl$0x2,0x40100aEndofassemblerdump.(gdb)stepiProgramreceivedsignalSIGSEGV,Segmentationfault.0x00401000instart()(gdb)这是objdump输出:test.exe:filef