x86-64是Intel x86架构的64位扩展
我尝试在汇编中制作一个最小的 64 位 Windows GUI 程序(!)。我使用了 MASM 编译器 (ml64.exe) 和 MASM64 包含文件 (https://masm32.com/board/index.php?topic=10052.0)。我这样做哦...
QEMU 中的 MS-DOS 在 GDB 中运行 while 循环后中断
使用 qemu 使用命令 qemu-system-i386 -fda ./images/disk01.img 运行 MS-DOS 3.20 似乎工作正常。附加 GDB(使用命令 qemu-system-i386 -fda ./images/disk01.img -S -s for qemu...
给出以下 C 程序(MSVC 不会为我优化“工作”,对于其他编译器,您可能需要添加 asm 语句): #包括 #包括 给出以下 C 程序(MSVC 不会为我优化“工作”,对于其他编译器,您可能需要添加 asm 语句): #include <inttypes.h> #include <stdlib.h> #define SIZE 10000 typedef struct { int32_t a, b, c; } Struct; void do_work(Struct* data) { int32_t* a = malloc(sizeof(int32_t) * SIZE), * b = malloc(sizeof(int32_t) * SIZE), * c = malloc(sizeof(int32_t) * SIZE); int32_t* a_ptr = a, * b_ptr = b, * c_ptr = c; for (size_t i = 0; i < SIZE; i++, a_ptr++, b_ptr++, c_ptr++, data++) { *a_ptr = data->a; *b_ptr = data->b; *c_ptr = data->c; } free(a); free(b); free(c); } int main() { Struct* data = malloc(sizeof(Struct) * SIZE); for (size_t i = 0; i < SIZE; i++) { data[i].a = i; data[i].b = i; data[i].c = i; } for (int i = 0; i < 500000; i++) { do_work(data); } free(data); } (我在 Rust 中有一个类似的程序,具有相同的结论)。 Intel VTune 报告称,该程序有 63.1% 的内存限制和 52.4% 的存储限制,存储延迟为 26%。它建议搜索虚假共享,但我不明白这里怎么可能有虚假共享。没有并发性,所有数据都由一个核心拥有,访问模式应该很容易预测和预取。我不明白为什么 CPU 需要在这里的商店中停顿。 我认为也许三个分配的地址的低位和高位是相同的,这导致它们被映射到相同的缓存线,但我记得读到现代CPU不只是删除一些位来分配一个缓存行但可以进行更复杂的计算。 另一种想法是,也许在分配被释放后,CPU 仍然忙于刷新存储,并且在下一次运行中,分配器为它们分配了相同的地址(或接近的地址),这给 CPU 带来了问题,因为它已经在存储新数据之前等待。所以我尝试不释放分配,但这导致代码速度慢得多。 我使用的是 Windows 11、笔记本电脑 Intel Core i9-13900HX、32 个逻辑核心、8 个性能核心和 16 个高效核心。 最有可能是 int32_t * SIZE 调用中的 malloc。如果您使用像 SIZE << 2 这样的位移位,您的代码应该更快、更高效。
我想将标志 UP 更改为 1,现在它是 UP = 0。我正在使用 Visual Studio 64 位程序集。 (英特尔称之为“方向标志”,DF)。 我试过这个: 。数据 源数据库“你好,世界!”,0
我在 MSVC 代码生成中偶然发现了一个奇怪的现象,涉及用作返回值的结构。考虑以下代码(此处为现场演示): 结构结果 { uint64_t 值; }; 结果
尝试在汇编 x86 64 位中打印数字 1 到 10 时出现无限循环
我是 ISA x86 64 位的新编程人员,所以我尝试使用十六进制转换在汇编中打印数字 1 到 10,但我得到了无限循环,因为 8 位寄存器 $cl 不能增加...
如何编写给定 C 代码递归计算 int 的平方根(在汇编中)
我正在尝试将 vlue x 传递到汇编代码块中,该代码块使用下面 C 中所示的逻辑递归计算 int 的平方根 int r_sqrt(int x){ 如果(x< 0)
在 Linux 信号处理程序中,x86 扩展状态将始终采用 XSAVE 格式,还是也可以采用 XSAVEC 格式?
在 x86-64 上,当 Linux 用户模式程序崩溃时,但有一个用于该崩溃的信号处理程序,AVX 扩展状态是否始终以 XSAVE 格式保存到堆栈中,或者可以以 XSAVEC 格式保存到堆栈中(“
在 Ubuntu 上使用 VS Code 交叉编译时如何导航到目标架构的结构定义?
我正在Ubuntu上交叉编译Android arm64二进制文件。我定义了一个名为 user_regs_struct old_regs 的结构。当我在 VS Code 中按 ctrl + 单击时,它会将我带到...中的结构定义
C++/C# HostFXR 通过 std::tuple 传递参数
我使用了这个 dotnet 托管示例中的代码并遇到了一些问题。 这就是我获取函数指针的方式: component_entry_point_fn 函数 = nullptr; int rc = 函数指针( ...
我使用 xUbuntu 22.04.4 和 linux 的 vscode 当前版本(1.87.2) 我想设置 .s 程序集 (AT&T) 文件的调试。我创建了一个 task.json 和一个 launch.json 文件并允许
我目前正在开发自己的 64 位 x86-64 内核,现在尝试通过执行 SYSRET 指令来进入环 3。但是它失败了,我无法找出原因 这是我的设置方法...
我的汇编代码是: .intel_syntax noprefix .global imul_function .global IMUL_POSITIVE .global IMUL_NEGATIVE .节.数据 IMUL_POSITIVE: .quad 0 IMUL_NEGATIVE: .quad 0 .节.文本
确保 clang-cl 中自定义 ASM 函数的 x64 合规性
对于我自定义编译的本机 x64 JIT 代码,我有某些固有函数。其中很多只是从我的代码中调用的,因此我将使用自己的编译器生成。然而,其中一些是可怕的......
我正在尝试在 NASM 中创建一个窗口,但在调用 CreateWindowExW 时遇到问题。它似乎接收到了错误的参数。 这是 window.asm 的(相关)代码 安装Win...
我正在尝试在 NASM 中创建一个窗口,但在调用 CreateWindowExW 时遇到问题。它似乎接收到了错误的参数。 这是 window.asm 的(相关)代码 安装Win...
#包括 结构体 st1 { int vi[4]; }; 结构体st2 { char vd[4]; }; 类 cl { 字符 v1[4]; 字符 v3[4]; 长v2[4]; 民众: cl(st1 ss); cl(st1& s1, int ar2[])...
我目前正在第一次尝试在 Kali Linux 中将汇编语言转换为二进制,但是在按照我的书正确编写汇编语言代码时遇到了奇怪的错误...
SymFromAddr 在 AMD 计算机上失败,并显示错误消息“尝试访问无效地址”
结构体StackFrame { DWORD64 地址; std::字符串名称; std::string 模块; std::字符串文件名; int 行号; }; std::vector GetStackTrace(CONTEXT 上下文...
以线程安全方式修改字节长度变量是否必须使用 LOCK 前缀?
为了简单起见,我们假设我们有 8 个线程和一个 8 字节长度的字节数组。每个线程都从这个数组中分配一个字节——也就是说,线程可以自由修改......