![](/img/trans.png)
[英]Error C2403 using inline x86 C++ assembly moving register contents to variable
[英]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.