草庐IT

Assembly

全部标签

c++ - 将高级语言编译成机器码

在阅读了网站上的一些答案并查看了一些源代码后,我认为编译器将高级语言(例如C++)直接转换为机器码,因为计算机本身不需要将其转换为汇编,它仅将其转换为程序集供用户查看代码,并在需要时可以对代码进行更多控制。但是这是在我的一张讲义上找到的,所以如果有人能进一步解释并纠正我,如果我错了,或者下面的截图,我将不胜感激。 最佳答案 您的幻灯片大部分是错误的...汇编代码和机器代码之间存在一对一的映射。汇编是信息的文本表示,机器代码是二进制表示。然而,有些机器支持额外的汇编指令,但生成的汇编代码中包含哪些指令仍然是在编译时确定的,而不是运行时

c++ - 没有调用单例的构造函数

我有单例类,旨在用于一个线程(GUI线程),为了防止错误使用,我添加了assert//headerfileclassImageCachefinal{public:ImageCache(constImageCache&)=delete;ImageCache&operator=(constImageCache&)=delete;staticImageCache&instance(){staticImageCachecache;returncache;}voidf();private:QThread*create_context_=nullptr;ImageCache();};//cppIm

c++ - 为什么gcc/clang要用两个128bit的xmm寄存器来传递一个值?

所以我偶然发现了一些我想了解的东西,因为它让我头疼。我有以下代码:#include#includetypedefunion{struct{floatx,y,z,w;}v;__m128m;}vec;vec__attribute__((noinline))square(veca){vecx={.m=_mm_mul_ps(a.m,a.m)};returnx;}intmain(intargc,char*argv[]){floatf=4.9;veca=(vec){f,f,f,f};vecres=square(a);//?printf("%f%f%f%f\n",res.v.x,res.v.y,re

c++ - ldr [pc, #value] 的奇怪行为

我正在调试一些C++代码(ARM平台上的WinCE6),我发现有些行为很奇怪:4277220Cmovr3,#0x93,3042772210strr3,[sp]42772214ldrr3,[pc,#0x69C]42772218ldrr2,[pc,#0x694]4277221Cmovr1,#042772220ldrr0,[pc,#0x688]42772214ldrr3,[pc,#0x69C]行用于从.DATA部分获取一些常量,至少我是这么认为的。奇怪的是,根据代码r2应该从地址pc=0x42772214+0x69C=0x427728B0填充内存,但根据它从0x427728B8(8字节+)加

c++ - 从 vc++ 调用存储在堆中的代码

假设我正在做这样的事情:void*p=malloc(1000);*((char*)p)=some_opcode;*((char*)p+1)=another_opcode;//forthesakeoftheexample:theopcodesareok....etc...我怎样才能定义一个函数指针来调用p就好像它是一个函数一样?(我正在使用VC++2008Express)。谢谢 最佳答案 评论空间不足。Joe_Muc是正确的。您不应该将代码填充到通过malloc或new获得的内存中。如果您更改Windows分配的页面的页面属性,您将遇

c++ - 分解/分解函数的函数

我以前有,here,表明C++函数不容易在汇编中表示。现在我有兴趣以一种或另一种方式阅读它们,因为Callgrind是Valgrind的一部分,在组装时显示它们已损坏。所以我想要么破坏Valgrind函数输出,要么破坏函数的程序集名称。有人试过这样的东西吗?我在看website并发现以下内容:CodetoimplementdemanglingispartoftheGNUBinutilspackage;seelibiberty/cplus-dem.candinclude/demangle.h.有没有人试过类似的东西?我想在C中进行demangle/mangle。我的编译器是gcc4.x。

windows - 仅注入(inject)函数并通过 CreateRemoteThread 运行它? C++

我正在尝试注入(inject)这个函数:voiddoubleValue(intpointer){*((int*)pointer)*=2;}通过VirtualAllocEx&WriteProcessMemory进入进程:intsize=1024*1024*4;HANDLEh=GetCurrentProcess();void*func=&doubleValue;intarg=(int)&HP;DWORDadr=(DWORD)VirtualAllocEx(h,0,size,MEM_COMMIT,PAGE_EXECUTE_READWRITE);WriteProcessMemory(h,(LPV

windows - 是否可以在 .text 段中使用 NASM 中的 DB 指令创建可写变量?

我试过在.text段中使用例如声明变量file_handle:dd0.但是,尝试在此变量中存储一些内容,例如mov[file_handle],eax会导致写入错误。我知道,我可以在.data段中声明可写变量,但为了使代码更紧凑,我想像上面那样尝试。使用堆栈来存储这些值(例如文件句柄)是唯一的可能性吗?还是我可以以某种方式写入上面的变量? 最佳答案 可执行代码段默认是不可写的。这是一项基本的安全预防措施。不,这不是一个好主意。但如果你坚持,因为这毕竟是一个玩具项目,那就去吧。您可以通过让链接器知道将其标记为可写,例如将以下参数提供给M

c++ - 如何从 Windows x64 的汇编程序访问 C 数组?

我编写了一个汇编程序函数来加快图像处理的速度(图像是使用CreateDIBSection创建的)。对于Win32,汇编程序代码可以正常工作,但对于Win64,我在尝试访问我的数组数据时立即崩溃。我将相关信息放入一个结构中,我的汇编程序函数获得指向该结构的指针。结构指针被放入ebx/rbx并通过索引从结构中读取数据。知道我做错了什么吗?我将nasm与VisualStudio2008一起使用,对于Win64,我设置了“默认rel”。C++代码:structmyData{tUInt32ulParam1;void*pData;};CallMyAssemblerFunction(&myData)

windows - 关于汇编远程调用和天堂之门,触发异常的段调用是否会在抛出异常之前推送 cs 和 eip?

目前我正在玩被称为“天堂之门”的windows/WOW64技巧,正如你们中的一些人可能知道的那样,即使在x86程序中,它也允许我们进入x64模式(我很惊讶当我测试了它,它成功了!)但我知道并非所有Windows版本都支持它,所以我的代码(因为有代码)使用seh,它看起来像这样:start:use32;;setupseh...call$33:.64bits_code;specify0x33segment,it'sthateasy;;successinx64mode,quitseh...jmp.exit.64bits_code:use64;;...use32retf.seh_handler