相关疑难解决方法(0)

x86,x32和x64架构之间的区别?

请解释一下之间的区别x86,x32x64?它有点令人困惑x86,x32因为大多数时候32位程序在x86上运行...

architecture 64-bit intel

49
推荐指数
3
解决办法
11万
查看次数

x86的MOV真的可以"免费"吗?为什么我不能重现这个呢?

我一直看到人们声称MOV指令可以在x86中免费,因为寄存器重命名.

对于我的生活,我无法在一个测试用例中验证这一点.每个测试用例我尝试揭穿它.

例如,这是我用Visual C++编译的代码:

#include <limits.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
    unsigned int k, l, j;
    clock_t tstart = clock();
    for (k = 0, j = 0, l = 0; j < UINT_MAX; ++j)
    {
        ++k;
        k = j;     // <-- comment out this line to remove the MOV instruction
        l += j;
    }
    fprintf(stderr, "%d ms\n", (int)((clock() - tstart) * 1000 / CLOCKS_PER_SEC));
    fflush(stderr);
    return (int)(k + j + l);
}
Run Code Online (Sandbox Code Playgroud)

这为循环生成以下汇编代码(随意生成这个你想要的;你显然不需要Visual C++):

LOOP:
    add edi,esi
    mov …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly cpu-registers micro-optimization

23
推荐指数
2
解决办法
2113
查看次数

你能在内核模式之外输入x64 32位"长兼容子模式"吗?

这可能完全重复 是否可以通过模式切换在64位进程中执行32位代码?,但这个问题是从一年前开始的,只有一个答案没有给出任何源代码.我希望得到更详细的答案.

我正在运行64位Linux(Ubuntu 12.04,如果重要的话).这里有一些代码可以分配页面,将一些64位代码写入其中,然后执行该代码.

#include <assert.h>
#include <malloc.h>
#include <stdio.h>
#include <sys/mman.h>  // mprotect
#include <unistd.h>  // sysconf

unsigned char test_function[] = { 0xC3 };  // RET
int main()
{
    int pagesize = sysconf(_SC_PAGE_SIZE);
    unsigned char *buffer = memalign(pagesize, pagesize);
    void (*func)() = (void (*)())buffer;

    memcpy(buffer, test_function, sizeof test_function);

    // func();  // will segfault 
    mprotect(buffer, pagesize, PROT_EXEC);
    func();  // works fine
}
Run Code Online (Sandbox Code Playgroud)

现在,纯粹是为了娱乐价值,我想做同样的事情,但buffer包含任意32位(ia32)代码,而不是64位代码.此页面意味着您可以通过将CS段描述符的位设置为"长兼容性子模式"来在64位处理器上执行32位代码LMA=1, L=0, D=1.我愿意将我的32位代码包装在执行此设置的序言/结尾中.

但我可以在Linux中以usermode进行此设置吗?(BSD/Darwin的答案也将被接受.)这是我开始对这些概念感到朦胧的地方.我认为解决方案涉及向GDT添加新的段描述符(或者是LDT?),然后通过lcall指令切换到该段.但是所有这些都可以在usermode中完成吗?

这是一个示例函数,在兼容性子模式下成功运行时应返回4,在长模式下运行时应返回8.我的目标是获取指令指针以获取此代码路径并从另一端出来%rax=4,而不会进入内核模式(或仅通过记录的系统调用执行此操作). …

linux kernel x86-64 compatibility-mode

12
推荐指数
1
解决办法
1593
查看次数

如何在64位应用程序中使用32位指针?

我们学校的项目只允许我们将c程序编译成64位应用程序,并测试我们的程序速度和内存使用情况.但是,如果我能够使用32位指针,那么我的程序将比64位消耗更少的内存,也许它运行得更快(更快到malloc?)

我想知道我是否可以在64位应用程序中使用32位指针?

谢谢您的帮助

c pointers 32bit-64bit

8
推荐指数
2
解决办法
7321
查看次数

如何在x86_64上的前4GB内'malloc'

平台:Mac OS X
Lang:Obj-C/C.

有可能以某种方式让'malloc'在进程地址空间的前4GB内分配内存吗?

我正在模拟i386堆栈,需要保证地址位于允许的32位范围内.

使用mmap + MAP_FIXED需要在任何'malloc'之前保留内存,这不太方便.带有约束的'malloc'会更方便.

c memory-management

5
推荐指数
1
解决办法
404
查看次数

有没有比malloc/calloc更好的实现在C中分配内存?

因为malloc/calloc是stdlib for C中定义的旧实现.有没有更好的实现可以取代malloc/calloc?请不要回答malloc/calloc方法的任何包装器方法.在C中分配内存的新实现不应该调用malloc/calloc,而应该实现自己的方法.

c malloc memory-management

3
推荐指数
1
解决办法
5405
查看次数