x86-64相关内容
我有一项任务是将一些C++代码转换为ASM,我想知道我的想法是否有意义。首先,我会将整数转换为浮点数。我想得到数组数据到SSE寄存器,但这里有问题,因为我只想要3而不是4个整数,有什么方法可以克服这个问题吗?然后,我将使用CVTDQ2PS将这些整数转换为浮点数,并将这些数字保存在内存中。对于像0.393这样的常量数字,我会做3个浮点数的矢量,然后我会做同样的操作三次,所以我只考虑sepiaRed。
..
在MASM中,我总是插入独立的Break指令 00007ff7`63141120 cc int 3 但是,用MSVCDebugBreak函数替换该指令将生成 KERNELBASE!DebugBreak: 00007ff8`6b159b90 6690 xchg ax,ax 00007ff8`6b159b92 cc
..
我正在用x64汇编和SIMD编写一些代码。 xmm15寄存器中打包了9个字节。为简单起见,让我们看一下以下代码: .data Masks BYTE 0, -1, 0, -1, 5, -1, 0, -1, 0 .code GetSumOfMasks proc movdqu xmm15, xmmword ptr [Masks] ; xmm15 now contains { 0,-1,0,-
..
使用MASM for ml64,我正在尝试将R9和R10中的两个无符号qword作为无符号128B int移到xmm0中 到目前为止,我想出了这个: mov r9, 111 ;low qword for test mov r10, 222 ;high qword for test movq xmm0, r9 ;move
..
这是一些集合。使用Windows clang,我可以编写clang -c my.s并获得目标文件。我可以使用 链接它 &Q;C:程序文件(X86)Microsoft Visual Studio2019BuildToolsVCToolsMSVC14.29.30133inHostx64x64link.exe";n.o/Entry:Main (库路径为c:/Program Fil
..
我使用的是Windows 10,安装了Cygwin。我一直在使用Cygwin编译/汇编c语言程序和使用Cygwin安装的“GCC”和“NASM”汇编程序。据我所知,NASM有一个-f win64模式,所以它可以汇编64位程序。现在,对于Windows上的x64汇编编程,YouTube似乎缺乏教程。YouTube上的大多数汇编编程教程要么适用于x64 Linux,要么适用于x32 Windows,我
..
C代码: void PtrArg1(int* a,int* b,int* c, int* d, int* e, int* f) { return; } void PtrArg2(int* a,int* b,int* c, int* d, int* e, int* f, int* g, int* h) { return; } 使用 编译 gcc -c -m64 -o
..
在Compiler Explorer周围测试时,我尝试了以下无溢出函数来计算2个无符号32位整数的平均值: uint32_t average_1(uint32_t a, uint32_t b) { if(a
..
/* Inner product. Accumulate in temporary */ void inner4(vec_ptr u, vec_ptr v, data_t *dest) { long i; long length = vec_length(u); data_t *udata = get_vec_start(u); data_t *vda
..
我正在编写一个使用UEFI引导的小型x86-64操作系统。我试图通过将内核的可执行文件移到0x800000000000来使内核成为更高的半内核。此地址应该在PML4的中间。基本上,我应该填写PML4的第256项来处理这较高的一半。我试图这样做,但我的代码出现了三重错误。由于我在QEMU上测试内核并使用gdb进行调试,因此我在gdb中使用monitor info mem来查看虚拟地址到物理地址的映射
..
在Intel 32位体系结构中,我可以使用MODR/M字节使用32位地址位置进行调用。根据英特尔手册,操作码扩展需要/2(010B),MOD需要00B,101B允许32位位移。 如果我想在64位体系结构中进行远调用,以便有空间容纳64位地址,我知道我可以/3(011B)用于操作码扩展。然而,仍然只提供32位位移。是否可以将目标指定为64位地址? 我主要想知道如何在给定该位置的64位地址的情
..
以下代码使用RSI寄存器作为循环计数器,将Hello World打印10次。 section .data hello: db 'Hello world!',10 helloLen: equ $-hello section .text global _start _start: mov rsi, 0
..
https://www.cs.fsu.edu/~langley/CNT5605/2017-Summer/assembly-example/assembly.html 我看到类似下面的例子。但我找不到Syscall的手册。例如,60表示退出,1表示写入。是否有针对所有系统调用的完整手册(包括调用编号和参数含义)? global _start section .text
..
我正在阅读《计算机系统:程序员的视角》(CS:APP3E),下面的代码是本书中的一个示例: long call_proc() { long x1 = 1; int x2 = 2; short x3 = 3; char x4 = 4; proc(x1, &x1, x2, &x2, x3, &x3, x4, &x4); return (x1
..
当我在https://godbolt.org上尝试不同的编译器时,我注意到编译器生成如下代码是非常常见的: push rax push rbx push rcx call rdx pop rcx pop rbx pop rax 我知道每个push或pop做两件事: 将操作数移入/移出堆栈空间 递增/递减堆栈指针(RSP) 因此
..
我一直在阅读x86内存模型的工作原理和x86上屏障指令的重要性,并将其与其他体系结构(如ARMv8)进行比较。在x86和ARMv8体系结构中,似乎(没有双关语意思)内存模型尊重传递性/累积性,即,如果CPU1通过CPU0看到存储,并且CPU2通过CPU1看到只有在CPU1看到CPU0存储时才可能发生的存储,那么CPU2也必须看到CPU0的存储。我提到的例子是Paul McKenney的著名论文6.
..
我用C语言实现了bubble sort,在测试它的性能时,我注意到-O3标志使它的运行速度比根本没有标志还要慢!同时,-O2使其运行速度大大快于预期。 未进行优化: time ./sort 30000 ./sort 30000 1.82s user 0.00s system 99% cpu 1.816 total -O2: time ./sort 30000 ./sor
..
https://www.exploit-db.com/exploits/46907 我的理解是,由于x64调用约定,execve的第三个参数envp应该存储在RDX中。但是这个外壳代码不会将该寄存器置零,它只会将RSI寄存器(存储ARV)置零。因此,如果RDX的当前值未指向有效位置,则会导致段错误,不是吗? 我是否遗漏了什么? 推荐答案 写rdx(带0):注意syscall
..
我知道拦截系统调用的方法如下。 使用ptrace,但这似乎有很高的开销。据我所知,像strace这样的工具也在内部使用ptrace。 使用内核模块更改系统调用表,但据我所知,这种方法在以后的Linux内核中不再可行。 使用LD_PRELOAD。但是,例如,如果您直接进行系统调用,而没有为该系统调用使用某些包装库函数,则这将不起作用。 所以您可以看到上面提到的所有方法都有缺陷。因此,
..
我正在查看我的程序的混乱之处(因为它崩溃了),并注意到许多 xchg ax, ax 我谷歌了一下,发现它本质上是NOP,但为什么Visual Studio要做xchg而不是noop? 该应用程序是由Visual Studio编译的C#.NET3.5 64位应用程序 推荐答案 在x86上NOP指令是XCHG AX, AX 这两条助记符指令汇编成相同的二进制操作码。
..