首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更改程序集的指针值(x86)

如何更改程序集的指针值(x86)
EN

Stack Overflow用户
提问于 2014-03-09 12:45:26
回答 2查看 3.2K关注 0票数 0

这是我的C代码,用于更改指针值

代码语言:javascript
运行
复制
     #include<stdio.h>
     #include<stdlib.h>
     typedef struct tcb tcb_t;

     struct tcb { 
     void* sp; 
     int id;        
     };


    void* changePointer(struct tcb*);
    int main(){
         struct tcb* s;
         s=malloc(sizeof(struct tcb*));
        printf("%p\n",changePointer(s));
        printf("%p\n",s);
   return 0;
  }

这是我的汇编函数(x86)

代码语言:javascript
运行
复制
    .text
    .globl changePointer

   changePointer:
   push %ebp
   movl %esp, %ebp      
   movl 0x8(%ebp),%eax//original pointer value
   movl %ebp,%esp
   movl %ebp,0x8(%ebp) //it is to be the value  after changing
   popl %ebp
   ret

但是它没有改变汇编函数.Please内部的指针值,解释哪里出错了?

EN

回答 2

Stack Overflow用户

发布于 2014-03-09 15:40:17

代码语言:javascript
运行
复制
movl %ebp,%esp

不管你想对这一行做什么:它不是这样工作的!此时EBP和ESP具有相同的值,因此该行什么也不做(否则它将更改堆栈指针,这将导致程序崩溃)!

代码语言:javascript
运行
复制
movl %ebp,0x8(%ebp)

0x8(%ebp)在这里是错误的:在指令之后,EAX上方的两行包含指向指针(而不是指针本身)的指针。因此,您必须使用0x0(%eax)。

但是,您希望eax包含指针的旧值。对吗?

因此,您的代码应该如下所示:

代码语言:javascript
运行
复制
push %ebp
movl %esp, %ebp
movl 0x8(%ebp),%ecx // <-- ecx holds a pointer to the pointer!
movl (%ecx),%eax    // <-- eax holds the old value
movl %ebp,(%ecx)    // <-- change the pointer
popl %ebp
ret

我仍然不明白为什么要把EBP的值写到指针上,因为EBP不包含任何有用的值!

票数 0
EN

Stack Overflow用户

发布于 2014-03-12 01:12:54

试试这个,它只使用一条汇编指令,并将样板留给编译器:

代码语言:javascript
运行
复制
void changePointer(struct tcb *s)
{
    asm("movl %%esp, %0"
            : /* No output */
            : "m" (s->sp);
            : /* Nothing clobbered */
       );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22278494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档