为了好奇,我试图读取标志寄存器并以一种很好的方式将其打印出来.
我已经尝试使用gcc的asm关键字阅读它,但我无法让它工作.任何提示如何做到这一点?我正在运行Intel Core 2 Duo和Mac OS X.以下代码就是我所拥有的.我希望能告诉我是否发生溢出:
#include <stdio.h>
int main (void){
int a=10, b=0, bold=0;
printf("%d\n",b);
while(1){
a++;
__asm__ ("pushf\n\t"
"movl 4(%%esp), %%eax\n\t"
"movl %%eax , %0\n\t"
:"=r"(b)
:
:"%eax"
);
if(b!=bold){
printf("register changed \n %d\t to\t %d",bold , b);
}
bold = b;
}
}
Run Code Online (Sandbox Code Playgroud)
这给出了分段错误.当我运行gdb时,我得到了这个:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x000000005fbfee5c
0x0000000100000eaf in main () at asm.c:9
9 asm ("pushf \n\t"
Run Code Online (Sandbox Code Playgroud) 我正在编写一些代码,其中非常需要从嵌入式asm块中获取条件标志,并将其用作在调用C代码中分支的条件。我不想存储标志(那将是无用的且效率低下的;已经有更有效的方法来实现结果),而是直接使用标志。有什么方法可以使用GNU C内联asm约束来实现这一目标?我对适用于多种指令集体系结构的方法感兴趣,目的是将其与体系结构的LL / SC样式原子产生的条件标志一起使用。当然,另一个明显的使用情况(与我正在做的事情不同)是允许外部C代码在内联asm中的操作的进位标志结果上分支。
问候,SO.
我有一些代码,我尝试使用gcc编译,但我的尝试被挫败了.任何更精通的人都可以帮助我解决这个问题,或许有一些我不知道的事情.
我正在Linux Kitchen 2.6.28-15上编译此代码 - 通用#49-Ubuntu SMP Tue Aug 18 19:25:34 UTC 2009 x86_64 GNU/Linux.
int
main(void)
{
__asm__(
"xorq %rdx,%rdx"
"movq $0x68732f6e69622fff, %rdx"
"shr $0x8, %rbx"
"push %rbx"
"movq %rsp,%rdi"
"xorq %rax,%rax"
"pushq %rax"
"pushq %rdi"
"movq %rsp,%rsi"
"mov $0x3b, %al"
"syscall"
"pushq $0x1"
"pop %rdi"
"pushq $0x3c"
"pop %rax"
"syscall"
);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
返回的错误是:
$ gcc -o shellcode shellcode.c
shellcode.c: Assembler messages:
shellcode.c:4: Error: bad register name `%rdxmovq $0x68732f6e69622fff'
Run Code Online (Sandbox Code Playgroud)
感谢大家.