我想写一个C程序,它将打印程序计数器的内容PC
。可以从用户空间,程序集或使用某些特定的内核例程来完成此操作吗?
您应该能够使用ARM编译器工具链中的__current_pc()
内在函数来确定PC
(ARM编译器支持许多与GCC相同的扩展)。*这是ARM特有的:
int main () {
printf("%#x\n", __current_pc());
printf("%#x\n", __current_pc());
printf("%#x\n", __current_pc());
return 0;
}
*感谢FrankH。指出存在
__current_pc()
通常,PC在函数调用中被保存为返回地址。在具有GCC的非ARM linux系统上,您可以调用__builtin_return_address(0)
以获取当前函数调用上下文的返回地址。以这种方式获得程序计数器会增加添加函数调用的代价,但是避免了内联汇编,因此该技术可移植到GCC支持的任何系统中。
void * get_pc () { return __builtin_return_address(0); }
int main () {
printf("%p\n", get_pc());
printf("%p\n", get_pc());
printf("%p\n", get_pc());
return 0;
}
当我在x86
系统上运行上述程序时,它将产生输出:
0x8048432
0x8048447
0x804845c
在拆卸时gdb
:
Dump of assembler code for function main:
0x08048424 <+0>: push %ebp
0x08048425 <+1>: mov %esp,%ebp
0x08048427 <+3>: and $0xfffffff0,%esp
0x0804842a <+6>: sub $0x10,%esp
0x0804842d <+9>: call 0x804841c <get_pc>
0x08048432 <+14>: mov %eax,0x4(%esp)
0x08048436 <+18>: movl $0x8048510,(%esp)
0x0804843d <+25>: call 0x80482f0 <printf@plt>
0x08048442 <+30>: call 0x804841c <get_pc>
0x08048447 <+35>: mov %eax,0x4(%esp)
0x0804844b <+39>: movl $0x8048510,(%esp)
0x08048452 <+46>: call 0x80482f0 <printf@plt>
0x08048457 <+51>: call 0x804841c <get_pc>
0x0804845c <+56>: mov %eax,0x4(%esp)
0x08048460 <+60>: movl $0x8048510,(%esp)
0x08048467 <+67>: call 0x80482f0 <printf@plt>
0x0804846c <+72>: mov $0x0,%eax
0x08048471 <+77>: leave
0x08048472 <+78>: ret
End of assembler dump.
问题内容: 我有以下代码是我从模型中获取的, 当我在zend中使用更新查询时, 在这里我想知道确切的mysql查询。有什么办法可以在zend中打印mysql查询吗?好心劝告 问题答案: 选择对象在Zend Framework中具有__toString()方法。 从Zend Framework手册中: 另一种解决方案是使用Zend_Db_Profiler。即 http://framework.zen
因此,我得到了如下列表,其中包含lambda表达式: 但是我不能实例化和修改lambda表达式中的变量,因为它必须是。我有办法做到这一点吗?
这是我在一个俄文网站上得到的代码,我曾尝试使用pair函数,但所有的尝试都失败了。请指导我如何做到这一点。
我通过以下说明创建了一个主题: 然后,我测试了这个主题是否有正确的数据。之后,我想在Flink程序中打印这个主题。我的计划是: 但是我得到了这个信息(因为信息太长了,我不得不写一些): [main]INFOorg.apache.flink.streaming.api.environment.LocalStream环境-在本地嵌入式Flink迷你集群上运行作业[main]INFOorg.apache
本文向大家介绍C程序打印所有ASCII值。,包括了C程序打印所有ASCII值。的使用技巧和注意事项,需要的朋友参考一下 问题 打印0到255个字符的美国信息交换标准代码(ASCII)值,而无需将该字符初始化为整数类型变量。只需使用格式说明符。 解决方案 在这里,我们正在编写一个程序,仅打印65到122。 如果要查看所有ASCII值,则在for循环中可以编写如下: 然后,它打印从0到255的所有AS
我想打印asterix,它等于行数-(它们应该从右侧开始)。它应该在第一行以9个空格和1个空格开始,然后在第二行以2个空格和8个空格开始,依此类推,直到第十行,第十行应该有10个空格和0个空格,如下图所示: 我可以在每行打印正确数量的空格,在正确的位置打印1*。例如,它在第一行打印9个空格和1个*。但在第二行,它会打印8个空格,在第九个位置打印1个*而不是2个?我看不到我在代码中遗漏了什么: