我正在尝试学习汇编——Linux环境中的x86。我能找到的最有用的教程是WritingAUsefulProgramWithNASM.我给自己设定的任务很简单:读取文件并将其写入标准输出。这是我的:section.text;declaringour.textsegmentglobal_start;tellingwhereprogramexecutionshouldstart_start:;thisiswherecodestartsgettingexec'ed;getthefilenameinebxpopebx;argcpopebx;argv[0]popebx;thefirstrealar
在Mac、Windows、Linux、iOS等典型计算机上,当用户启动程序/二进制文件/应用程序时,程序的静态部分是否总是在执行开始之前完全加载到内存中?这是否包括程序中的所有数据段/部分,如字符串和任何其他嵌入的BLOB数据?假设我将一个巨大的图像文件嵌入到二进制文件中(例如在__DATA段中)。此图像数据是否会在启动时完全加载到内存中? 最佳答案 在OSX、Windows、Linux和iOS下,可执行文件在执行时不会加载到RAM中。相反,可执行文件被映射到进程的虚拟地址空间。当进程访问尚未加载到RAM中的可执行文件的映射页面时,
在Mac、Windows、Linux、iOS等典型计算机上,当用户启动程序/二进制文件/应用程序时,程序的静态部分是否总是在执行开始之前完全加载到内存中?这是否包括程序中的所有数据段/部分,如字符串和任何其他嵌入的BLOB数据?假设我将一个巨大的图像文件嵌入到二进制文件中(例如在__DATA段中)。此图像数据是否会在启动时完全加载到内存中? 最佳答案 在OSX、Windows、Linux和iOS下,可执行文件在执行时不会加载到RAM中。相反,可执行文件被映射到进程的虚拟地址空间。当进程访问尚未加载到RAM中的可执行文件的映射页面时,
我想在我的电脑上通过USB控制遥控模型。我不需要真正的radio控制,所以直接通过电缆控制Helm机就足够了(是的,模型和控制单元之间会有电缆)。我想我会构建一些基于微Controller的设备,该设备将通过USB连接到计算机,而伺服系统将连接到该设备。我正在寻求一些提示,我应该从哪里开始。我知道伺服系统是如何控制的,我最终应该如何对微Controller进行编程来控制伺服系统,但我真正不太了解的是设备端和计算机端(将是Linux)上的USB通信。我想用C语言进行编程(也许是微Controller的汇编程序)。感谢您的每一个提示。 最佳答案
我想在我的电脑上通过USB控制遥控模型。我不需要真正的radio控制,所以直接通过电缆控制Helm机就足够了(是的,模型和控制单元之间会有电缆)。我想我会构建一些基于微Controller的设备,该设备将通过USB连接到计算机,而伺服系统将连接到该设备。我正在寻求一些提示,我应该从哪里开始。我知道伺服系统是如何控制的,我最终应该如何对微Controller进行编程来控制伺服系统,但我真正不太了解的是设备端和计算机端(将是Linux)上的USB通信。我想用C语言进行编程(也许是微Controller的汇编程序)。感谢您的每一个提示。 最佳答案
我正尝试像这样对全局变量使用内联汇编,但编译器报错说未定义对saved_sp的引用。__asm____volatile__("movqsaved_sp,%rsp\n\t");saved_sp全局声明为staticlongsaved_sp(对于文件)。我在这里犯了什么错误? 最佳答案 如果saved_sp是static,但在不工作时工作,那么编译器似乎已决定saved_sp未在您的源文件中使用,因此决定从编译代码中完全省略它传递给汇编程序。编译器不理解asmblock中的汇编代码;它只是将其粘贴到它生成的汇编代码中。所以它不知道asm
我正尝试像这样对全局变量使用内联汇编,但编译器报错说未定义对saved_sp的引用。__asm____volatile__("movqsaved_sp,%rsp\n\t");saved_sp全局声明为staticlongsaved_sp(对于文件)。我在这里犯了什么错误? 最佳答案 如果saved_sp是static,但在不工作时工作,那么编译器似乎已决定saved_sp未在您的源文件中使用,因此决定从编译代码中完全省略它传递给汇编程序。编译器不理解asmblock中的汇编代码;它只是将其粘贴到它生成的汇编代码中。所以它不知道asm
我试图清楚地了解谁(调用者或被调用者)负责堆栈对齐。64位汇编的情况很清楚,它是由caller完成的。引用SystemVAMD64ABI,第3.2.2节堆栈框架:Theendoftheinputargumentareashallbealignedona16(32,if__m256ispassedonstack)byteboundary.换句话说,应该安全地假设,对于被调用函数的每个入口点:16|(%rsp+8)持有(额外八个是因为call隐含地将返回地址压入堆栈)。它在32位世界中看起来如何(假设cdecl)?我注意到gcc使用以下构造将对齐放在被调用函数中:andesp,-16这似乎
我试图清楚地了解谁(调用者或被调用者)负责堆栈对齐。64位汇编的情况很清楚,它是由caller完成的。引用SystemVAMD64ABI,第3.2.2节堆栈框架:Theendoftheinputargumentareashallbealignedona16(32,if__m256ispassedonstack)byteboundary.换句话说,应该安全地假设,对于被调用函数的每个入口点:16|(%rsp+8)持有(额外八个是因为call隐含地将返回地址压入堆栈)。它在32位世界中看起来如何(假设cdecl)?我注意到gcc使用以下构造将对齐放在被调用函数中:andesp,-16这似乎
有了这个功能:mov1069833(%rip),%rax#0x2b5c1bf9ef90add%fs:0x0,%raxretq我如何解释第二条指令并找出添加到RAX中的内容? 最佳答案 这段代码:mov1069833(%rip),%rax#0x2b5c1bf9ef90add%fs:0x0,%raxretq返回线程局部变量的地址。%fs:0x0是TCB(线程控制block)的地址,1069833(%rip)是从那里到变量的偏移量,这是已知的,因为变量驻留在程序中或在程序加载时加载的某些动态库中(在运行时通过dlopen()加载的库需要一