x86相关内容

JA和JG在汇编中的区别

你能告诉我汇编语言中 JUMP IF ABOVE 和 JUMP IF GREATER 之间的区别吗?我什么时候使用它们?他们会给我不同的结果吗? 解决方案 正如英特尔手册说明, JG 将标志解释为比较有符号,而 JA 将标志解释为比较无符号(当然,如果设置标志的操作不是比较或减法,那可能没有意义).所以是的,它们是不同的.准确地说, ja 如果 CF = 0 和 ZF = 0 则跳转 ..
发布时间:2022-01-20 23:09:46 其他开发

设置 GDB 硬件观察点/如何设置软件观察点

一个较早的问题解释说,在 x86 上,正在监视的对象的大小受调试寄存器的限制.正如所料,我可以“观察"一个双变量.但是我不能看双数据成员,例如, 观看 pObject->dPrice 生产 硬件观察点 1:pObject->dPrice 但是当你尝试继续执行时,它会说 无法插入硬件断点:您可能请求了太多的硬件断点/观察点. 即使这是唯一断点/观察点. 我很好奇为什么会这样 ..
发布时间:2022-01-20 20:22:34 服务器开发

GDB 可以更改正在运行的程序的汇编代码吗?

我想为/bin/ls 添加一些额外的功能. 所以我在gdb上启动它,并在开头添加了一个断点. 现在的问题是:如何更改内存中正在运行的程序的代码?我可以看到汇编代码,但我无法修改.我该怎么做? 例如,在 Windows 上,我可以使用 oldbg 轻松做到这一点.在 Linux 上怎么样? (我知道这样做只会更改内存中进程的代码.所以我可以将内存转储到文件中,然后我会将更改保存在 ..
发布时间:2022-01-20 20:22:06 服务器开发

局部变量的内存分配浪费

这是我的程序: void test_function(int a, int b, int c, int d){整数标志;字符缓冲区[10];标志 = 31337;缓冲区[0] = 'A';}int main() {test_function(1, 2, 3, 4);} 我用调试选项编译这个程序: gcc -g my_program.c 我使用 gdb 并使用 intel 语法反汇编 tes ..
发布时间:2022-01-20 20:13:33 其他开发

使用 GDB 读取 MSR

在使用 GDB 调试程序时,有什么方法可以读取特定于 x86-64 模型的寄存器,特别是 IA32_FS_BASE 和 IA32_GS_BASE? 不太可取的是使用动态仪器包(如英特尔的 Pintool)的解决方案,但同样值得赞赏. 解决方案 如果您不想更改代码(或者如果代码不可用),您可以通过以下方式执行类似于 amdn 的答案的操作.对 arch_prctl 的调用需要一个指向 ..
发布时间:2022-01-20 20:11:04 其他开发

为什么我的数据部分在编译后的二进制文件中出现两次?Ubuntu、x86、nasm、gdb、reaelf

之前的 相关问题已回答.谢谢!然而,这给我带来了一个新问题.为什么 nasm 将数据字节放在两个不同的内存位置?我在下面包含程序信息和其他数据转储. ---------- 使用 nasm, ld 编译的代码片段 -----部分 .text...零:jmp 短二一:流行ebxxor eax, eaxmov [ebx+12], eaxmov [ebx+8], ebxmov [ebx+7], 人lea ..
发布时间:2022-01-20 20:06:04 其他开发

使用 gdb 在指定可执行文件之外单步汇编代码会导致错误“找不到当前函数的边界";

我在 gdb 的目标可执行文件之外,我什至没有对应于该目标的堆栈.无论如何我都想单步执行,这样我就可以验证我的汇编代码中发生了什么,因为我不是 x86 汇编方面的专家.不幸的是,gdb 拒绝进行这种简单的汇编级调试.它允许我在适当的断点处设置和停止,但是一旦我尝试单步前进,gdb 就会报告错误“找不到当前函数的边界"并且 EIP 不会改变. 其他细节: 机器代码是由 gcc asm 语 ..
发布时间:2022-01-20 19:51:24 服务器开发

编译器中的 8 位布尔值.对它们的操作效率低吗?

我正在阅读 Agner Fog 的“Optimizing software in C++"(特定于 x86 处理器Intel、AMD 和 VIA),它在第 34 页上声明 布尔变量存储为 8 位整数,值为 0 表示假,1 表示真.布尔变量是超定的,因为所有具有布尔值的运算符变量作为输入检查输入是否有任何其他值而不是 0 或 1,但运算符将布尔值作为输出只能产生 0 或 1 以外的任何值.这使 ..
发布时间:2022-01-19 17:06:04 C/C++开发

布尔读/写操作可以在 x86 上不是原子的吗?

假设我们有两个线程,一个在循环中读取布尔值,另一个可以在特定时间切换它.就我个人而言,我认为这应该是原子的,因为 C++ 中的 sizeof(bool) 是 1 个字节,您不会部分读/写字节,但我想 100% 确定. 是还是不是? 编辑: 为了将来参考,同样适用于 int 吗? 解决方案 这完全取决于您所说的“原子"一词的实际含义. 您的意思是“最终值将一次性更新" ..
发布时间:2022-01-19 16:56:51 C/C++开发

该问题与Assembly x86-32 RET n指令有关

我知道 Ret n 的含义,但我不知道它在维护程序的运行时堆栈中的作用?我有点困惑.ret 与堆栈有关吗? 解决方案 ret n 就像 ret + add esp, n.您可以将它用于 caller-pops 调用约定. 普通的 ret 类似于 pop eip.(pop eip 不是有效指令,但它很好地表达了 ret 的作用).是的,它使用堆栈;阅读文档.http://felixcl ..
发布时间:2022-01-19 15:33:01 其他开发

RET 之后的指令总是 CALL 之后的指令吗?

在行为良好的 C 程序中,返回语句 (RET) 是否总是返回到 CALL 语句之后的指令?我知道这是默认设置,但我想检查是否有人知道或记得该标准不适用的真实案例(常见的编译器优化或其他事情......).有人告诉我,函数指针可能会发生这种情况(函数指针会将值放在堆栈上,而不是 CALL ......我搜索了它,但我没有在任何地方看到解释). 让我试着更好地解释我的问题.我知道我们可以使用其他 ..
发布时间:2022-01-19 15:20:50 其他开发

在 ASM 中,c 编译器如何处理函数的结构返回值

说到C函数的返回值,返回值存放在EAX寄存器中.假设我们谈论的是 32 位寄存器,欢迎使用整数,但是当我们返回这些类型时会发生什么:long long,long double,大于 32 位的 struct/union. 解决方案 在常见的 x86 调用约定中,适合两个寄存器的对象在 RDX:RAX 中返回.这是相同的寄存器对,它是 div 和 mul 指令以及 cdq/cqo 的隐式输入 ..
发布时间:2022-01-19 15:10:35 其他开发

什么是 x86 “ret"?指令相当于?

假设我正在 x86 汇编中编写一个例程,例如“add",它将作为参数传递的两个数字相加. 在大多数情况下,这是一个非常简单的方法: 推送ebpmov ebp, espmov eax, [ebp+8]添加 eax, [ebp+12]mov esp, ebp流行音乐ret 但是,我有什么办法可以重写这个方法来避免使用“ret"指令并且仍然让它产生完全相同的结果? 解决方案 这不需要任 ..
发布时间:2022-01-19 14:46:03 其他开发

了解切换条件下的寄存器用法

我有一个 C 和汇编代码中的开关条件代码.但在我看来,设置什么是非常随意的,edx 或 eax 或 ecx? 如何区分 edx、epx、ecx、ebp?连教科书都没有给我充分的解释. #include //枚举类型创建一组常量//编号为 0 及以上typedef enum {MODE_A, MODE_B, MODE_C, MODE_D, MODE_E} mode_t;in ..
发布时间:2022-01-19 11:13:06 其他开发

是否可以在线程之间共享一个寄存器?

我知道当操作系统/硬件在不同线程的执行之间切换时,它管理存储/恢复每个线程的上下文,但是我不知道很多细节.我的问题是:是否有任何寄存器可用于在线程之间共享信息?在 x86 中?米普斯?手臂?等等,.linux?窗户? 非常感谢任何关于如何做到这一点的建议. 解决方案 乍一看,您的问题似乎很合理.其他人试图直接回答这个问题.首先,我们有两个相当模糊的概念, 话题 注册 如 ..
发布时间:2022-01-17 14:26:37 服务器开发