52得票2回答
ARM PC寄存器为什么指向下一条要执行的指令后面的那一条指令?

根据ARM IC,当处于ARM状态时,PC 的值是当前指令的地址加8字节。而在Thumb状态下: - 对于 B、BL、CBNZ 和 CBZ 指令,PC 的值是当前指令的地址加4字节。 - 对于所有其他使用标签的指令,PC 的值是当前指令的地址加4字节,结果的第1位被清零以使其字对齐。 简单...

34得票3回答
为什么GCC不使用部分寄存器?

在使用 gcc -s -nostdlib -nostartfiles -O3 编译的 Linux 系统上反汇编 write(1,"hi",3) 的结果为:ba03000000 mov edx, 3 ; thanks for the correction jester! bf010000...

8得票1回答
避免IDT hooking中的页面故障。

注意:我正在运行FreeBSD,但我也将Linux作为标签包含在内,因为问题有些普遍性,并且Linux特定的解决方案对我很有帮助。 编辑:只是为了确认问题不是FreeBSD特定的,我将该模块移植到Linux上,并确实得到完全相同的行为。下面给出了该模块的Linux版本代码;基本上完全相同,唯...

11得票2回答
Linux汇编错误“asm中的不可能约束条件”

我刚开始学习在Linux下的汇编。我已将以下代码保存为testasm.c,并通过gcc testasm.c -otestasm进行编译。编译器回复:"impossible constraint in ‘asm’"。#include <stdio.h> int main(void) ...

7得票2回答
ARM汇编 - 基本中断处理

我目前在lpc2378上使用ARM汇编语言做一些实验,编写了一个循环来控制炉子的温度,但是我认为我需要实现某种中断处理来完成我的项目。 当应用程序运行时,它进入一个循环,等待Button_1输入,然后继续进行各种阶段,但它无法等待Button_2输入以使应用程序正常工作。 所以这里有几个问...

13得票3回答
gcc输出的.seh_*汇编指令是什么?

我使用gcc -S编译hello world程序。这5个.seh_命令是什么?当我搜索时,似乎找不到太多关于它们的信息。 .file "hi.c" .def __main; .scl 2; .type 32; .endef .section .rda...

20得票4回答
在C语言中,如何使用一个变量参数的列表来构建函数调用?

假设有一些参数以某种方式存储,例如在数组中。 给定一个函数指针,我如何调用它并传递存储的参数列表? 我不是试图将数组作为参数传递。你理解了没,好吧?我想逐个将其元素作为参数传递。数组只是为了说明,我可以将参数存储在某些元组结构中。此外,请注意,我手头有一个函数指针,并且可能具有字符串格式的签名...

13得票11回答
在C/C++程序中使用汇编语言来优化某些函数真的值得吗?

在某些开发领域,如游戏开发、实时系统等,拥有一个快速且优化的程序非常重要。然而,现代编译器已经做了很多优化工作,而在考虑到截止日期的情况下,在汇编中进行优化可能会耗费时间。 问题: 通过汇编来优化C/C++程序中的某些功能真的值得吗? 在今天的现代编译器下,通过汇编来优化C/C++程序真...

9得票2回答
在32位Linux上,是使用Syscall还是sysenter?

自从 MS-DOS 时代开始,我就知道可以使用中断来调用系统。在早期的文献中,我看到过在 Linux 上调用系统函数需要使用“int 80h”的参考资料。现在已经有相当长一段时间了,我知道“int 80h”已被“syscall”指令取代了。但是我在我的32位机器上无法让它工作。 问题是,是否...

8得票1回答
如何在x86中仅使用2个连续的leal指令将寄存器乘以37?

假设%edi包含x,我想使用仅有的2个连续leal指令得到37*x,我该怎么做? 例如,要得到45x,你可以执行: leal (%edi, %edi, 8), %edi leal (%edi, %edi, 4), %eax (to be returned) 我根本不知道应该用什么...