- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我有一个 malloc
编辑的变量,我想将它的地址移动到 %rdi
,所有这些都是从 C 生成操作码的。它应该寻找一些东西像这样:
unsigned char op_1[] = { 0x48, 0x8B, 0x3C, 0x25 }; //movq
unsigned char *a = malloc(1); // Let's asume a is now at 0x1234567812345678
unsigned char *bytecode = malloc(sizeof(op_1) + sizeof(void *)); // 12 bytes
memcpy(bytecode, op_1, sizeof(op_1)); // 4 bytes
memcpy(bytecode + sizeof(op_1), &a, sizeof(void *)); // 8 bytes
那应该把bytecode
的内容留给:48 8B 3C 25 78 56 34 12 78 56 34 12
。无论如何,这是无效的字节码,因为(如果我没有误读文档)48 8B 3C 25
后面可以跟 4 个字节作为地址。
我的问题是我应该如何将一个 8 字节长的地址移动到 %rdi
?
最佳答案
看起来正确的操作码是48 bf
。我编译了以下程序集(使用 Intel 语法和 nasm
):
BITS 64
mov rdi, 0x1234567812345678
然后我通过 objdump -d -w -Mintel
传递结果:
0000000000000000 <.text>:
0: 48 bf 78 56 34 12 78 56 34 12 movabs rdi,0x1234567812345678
操作码48 bf
由REX.W前缀48
组成,指定64位操作数,操作码b8 +
rd io
,以及RDI
(111
) 的寄存器选择器:
MOV r64, imm64
: Moveimm64
tor64
关于c - 将四字移动到 %RDI 的操作码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20455494/
我正在分析一段低效的代码,但其中有些代码是如此困惑? 原代码: #include void lowwer(char *str) { for (int i = 0; i This Inner Lo
我正在分析一段低效的代码,但其中有些代码是如此困惑? 原代码: #include void lowwer(char *str) { for (int i = 0; i This Inner Lo
C++调用函数时push rdi和pop rdi的作用是什么?VS2010,x64,调试,无优化 C++ int calc() { return 8 + 7; } 反汇编: int calc(
考虑这个简单的函数: struct Foo { int a; int b; int c; int d; int e; int f; }; Foo foo() { Foo f
假设我有一个 malloc 编辑的变量,我想将它的地址移动到 %rdi,所有这些都是从 C 生成操作码的。它应该寻找一些东西像这样: unsigned char op_1[] = { 0x48, 0x
我有一个 64 位 C 程序,其函数声明如下所示: #include extern double wartosc (double a, double b, double x, int n); int
在 Intel x86 64 位架构中,有 rax...rdx 寄存器,它们只是 A...D 通用寄存器。 但也有称为rsi和rdi的寄存器,它们分别是“源索引”和“目标索引”寄存器。为什么这些寄存器
我正在 Scientific Linux 6.3 x86_64 下编写内核模块,我希望使用 kprobes。在这个模块中,我需要在返回时访问函数的第一个参数,所以 jprobes 不可用。 我发现这篇
我正在熟悉如何让 C/C++ 与 ASM 函数对话。为此,我首先了解寄存器如何用于参数。 我有 2 个例程,它们只会乘以 2 个 64 位 float 。其中一个返回结果,另一个将结果保存在第一个参数
在 RDi 中, 右键单击要调试的程序, 选择“调试或代码覆盖率” 然后“设置服务入口点” 然后在另一个 session 中从命令行启动程序。 RDi 确认“调试”透视开关。但是,我没有选择使用更新生
我想我明白 movzbl (%rdi, %rcx, 1) , %ecx 意思是“将零扩展字节移到长”,并表示将 ecx 扩展为 32 位,但我不完全确定语法 (%rdi, %rcx, 1) 指的是什么
x64 寄存器是否可以互换,从某种意义上说,使用它们的一种组合的任何指令都可以与其他任何组合一起使用?除了名称之外,是否存在性能差异或任何其他考虑因素使它们彼此不同? 最佳答案 不是。虽然大多数 x8
这个问题已经有答案了: What do the E and R prefixes stand for in the names of Intel 32-bit and 64-bit registers
这个问题在这里已经有了答案: How can you pull a value from a register? (1 个回答) 关闭 9 年前。 假设我想从双核 x64 CPU 上的那些寄存器(以
我可以检查提供的用户是否是系统管理员,或者在使用 JRE 1.6 的 Windows 计算机上是否为 String groups[] = (new com.sun.security.auth.modu
我是一名优秀的程序员,十分优秀!