簡體   English   中英

如何使用x86程序集訪問c中main函數中的變量

[英]How to access variable in main function in c using x86 assembly

這是我的主要功能

    #include<stdio.h>
    #include<stdlib.h>
    int name1(int g);
    char* getStringFromC(void);
    int main(){

int a=2;
char* g="this is called from assembly";
printf("%d\n",name1(a));
return 0;
    }

    .text
    .globl name1
  name1:
    push %ebp
    movl %esp, %ebp      
    movl 8(%ebp),%eax      
    movl %ebp,%esp
    popl %ebp
    ret//This function name1(int a) in assembly

問題是如何從匯編中訪問char * g? 我雖然是12(%ebp)或16(%ebp)應該包含像char * g等的值。

你不應該這樣做。 如果它不作為參數包含且不是全局的,則不應嘗試訪問它。

但為了完整起見,我還是會回答:使用幀指針。 %ebp指向其先前的值。 將其復制到臨時寄存器,您可以通過它索引調用者的本地變量。

下面的示例執行您似乎想要的內容,還顯示了如何訪問全局變量。 這適用於我的Ubuntu 13.10 x64系統。 正如Medinoc和hvd所指出的那樣,以你想要的方式查看堆棧並不健壯。

Makefile文件:

CFLAGS=-Wall -Wextra

all: main

main: main.o lib.o

main.c中:

#include <stdio.h>

void* stack_peek(int g);
void* get_global_str(void);

char const *global_str="Global";

int main(){
  int a=2;
  char const * g="this is called from assembly";
  printf("stack_peek(a): %p\n",stack_peek(a));
  printf("g: %p\n",(void*)g);
  printf("global_str: %p\n",(void*)global_str);
  printf("get_global_str(): %p\n",(void*)get_global_str());
  return 0;
}

lib.s:

.text

.globl global_str
.type global_str, @common

.globl stack_peek
.type stack_peek, @function
stack_peek:
  pushq %rbp
  movq %rsp, %rbp      
  movq 24(%rbp),%rax
  movq %rbp,%rsp
  popq %rbp
  ret

.globl get_global_str
.type get_global_str, @function
get_global_str:
  movq global_str,%rax
  ret

輸出:

$ make -B
cc -Wall -Wextra   -c -o main.o main.c
as   -o lib.o lib.s
cc   main.o lib.o   -o main
$ ./main 
stack_peek(a): 0x40067b
g: 0x40067b
global_str: 0x400674
get_global_str(): 0x400674

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM