我正在尝试学习如何在汇编中调用操作系统函数,并得到了一个示例,该示例将创建并关闭一个文件(在关闭时删除该文件)。在研究ExitProcess的用法时,我遇到了一些清理堆栈的示例,有些则没有;更令人困惑的是,不管有没有清理步骤,事情似乎都能正常工作……在这种情况下处理堆栈的正确方法是什么?externCloseHandle:procexternCreateFileA:procexternExitProcess:procincludeFileAccess.incincludeFileDisposition.incincludeFileFlag.incincludeFileShare.inc
返回地址和数据是混合/存储在同一个堆栈中,还是在2个不同的堆栈中? 最佳答案 它们是混合的。但是,这取决于实际的编程语言/编译器。我可以想象一个编译器在堆上为局部变量分配空间,并在堆栈上保留一个指向存储的指针。每个进程中的每个线程都有一个堆栈。因此,例如,一个有20个线程的进程有20个独立的堆栈。 关于windows-Windows程序使用多少个堆栈?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/
当写入一个寄存器时,比如movax,1,它会覆盖它之前可能拥有的值。现在我想知道的是,我可以将多大的数字/字符串输入寄存器,并且另一个应用程序可以覆盖我的应用程序的寄存器值吗?我的意思是,寄存器是在进程之间共享,还是它们接收自己的沙盒/虚拟寄存器?我对Intelx86(-64)核心CPU和Windows很感兴趣。 最佳答案 在单个内核上一次只能调度一个线程。核心是有寄存器的东西。调度新线程时,首先保存寄存器,恢复线程之前保存的寄存器。这包括程序计数器寄存器,它指向下一条要执行的指令。寄存器(来自内存):AX、BX、CX、DX是16位
我正在尝试编译libsoxr(它由Audacity团队派生自libsox库)库。我可以编译osx32、osx64和win32。他们使用内联汇编,而Windowsx64平台不支持内联汇编。有问题的代码是这样的:#ifHAVE_FENV_H#include#elifdefined_MSC_VER#defineFE_INVALID1#defineFE_DIVBYZERO4#defineFE_OVERFLOW8#defineFE_UNDERFLOW16#defineFE_INEXACT32#defineFE_ALL_EXCEPT(FE_INEXACT|FE_DIVBYZERO|FE_UNDER
首先我要证明我对堆栈的理解很差,然后我要问一个不太连贯的问题,但不能很好地回答,因为这个问题不够具体,无法引出一个精心设计的问题回答。那么,当程序运行时,函数会被压入堆栈-这意味着堆栈指针会递增或递减?栈内存分配到底存放了什么?指向变量数据的指针,指向程序其余部分的指针?我只是不明白堆栈中到底存储了什么(什么数据类型,什么类型的引用,它们是如何存储的)我希望一个函数存储它的局部变量指针和一个指向调用它的地址的指针,以便它可以返回.此外,windowsx86虚拟内存分配实际上将单个虚拟内存块映射到任意多个物理内存地址,因此堆栈在windowsx86系统的物理内存中是否连续?最后,假设堆栈
我是硬件方面的新手,接近使用汇编代码编程。所以我读了一本关于它的书并找到了NASM汇编程序的示例代码:segment.text;codesegmentglobalmain;mustbedeclaredforlinkermain:;telllinkerentrypointmovedx,len;messagelengthmovecx,msg;messagetowritemovebx,1;filedescriptor(stdout)moveax,4;systemcallnumber(sys_write)int0x80;callkernelmoveax,1;systemcallnumber(s
我正在尝试着手研究如何创建一种简单的编程语言。语法和编译器本身。我对这个主题做了一些研究,但我真的不明白我真正的问题是什么。我认为,现有的编程语言——编译器,是建立在现有的编程语言之上的,因此,让我的编译器也基于其中一种语言才有意义。尽管如此,因为这在理论上是第一种带有编译器的语言,没有其他语言可以作为基础,所以这不可能是真实的事实,而且确实必须基于其他东西,比如核心计算机系统语言。要实现我的目标(创建一种简单的(有扩展空间的)编程语言),哪条路是最好的路以及如何走?感谢任何答案! 最佳答案 最早的编译器是基于汇编代码的。汇编程序从
使用NASM和Mingw-w64我一直在尝试运行以下程序,该程序应该使用WindowsAPI将消息打印到屏幕上。它运行,但控制台上没有显示任何内容,并导致对内存位置的访问无效(错误代码0x3e6h)。为什么会这样,我怎样才能让程序正常运行?globalmainexternExitProcessexternGetStdHandleexternWriteFilesection.textmain:movrcx,0fffffff5hcallGetStdHandlemovrcx,raxmovrdx,NtlpBuffermovr8,NtnNBytesToWritemovr9,NtlpNBytesW
我明白这是做什么的,但是如下所示将ProcessHandle设置为-1是什么意思?.text:004011D283EC20subesp,20h.text:004011D58D0424leaeax,[esp+20h+TokenHandle].text:004011D850pusheax;TokenHandle.text:004011D96A28push28h;DesiredAccess.text:004011DB6AFFpush0FFFFFFFFh;ProcessHandle.text:004011DDE896040000callOpenProcessToken
我正在尝试编写一个程序来从内存中读取二进制文件执行它并退出但是操作系统似乎不允许我从内存中执行它,这个练习的全部目的是加载一个二进制文件没有头进入内存。这是我的二进制文件代码:pusheaxmoveax,3movedi,eaxsubeax,edipopeaxleaveret而我的loader如下:intmain(intargc,char**argv){void(*ptr)(void);FILE*fo=fopen(argv[1],"r");intl=fseek(fo,0,SEEK_END);fread((void*)ptr,l*sizeof(char),1,fo);ptr();retur