我用有道阅读看到这篇好文,希望和大家分享。我的看法是:以下
原文转载自
水木社区 今日十大热门话题
发信人: bookses (读万卷书,行万里路), 信区: Assembler
标 题: [合集] 问个可能很小白的问题。
发信站: 水木社区 (Thu Sep 13 07:16:25 2012), 站内
☆─────────────────────────────────────☆
liujan611 (anti-creditcard) 于 (Sun Jul 29 12:35:24 2012) 提到:
下面main.c在多进程环境执行。
main() {
int i = 10, j;
int arr[100] = {1};
j = i + arr[10]; // 这个语句如何生成汇编? 如何指定arr在内存的基地址
}
i的话可以直接放在reg里。
数组arr[100]没法放在reg里,对数组元素的访问则是通过load指令从内存导入数值。 由于是多进程环境的随机执行,如何通过事先编译生成arr[]数组所在内存页面的基地址?
☆─────────────────────────────────────☆
CKevin ( ) 于 (Sun Jul 29 12:43:04 2012) 提到:
i,j,arr都是在栈上的。现在假定在进入main函数时,栈基已经知道,再假定编译器/ABI没有在栈上留什么空间。
那么只需要
mov eax, [栈基地址 + 0] 把i放在eax
mov ebx, [栈基地址 + 8] 把arr基地址放在ebx
add eax, [ebx + 基址变址寻址长度4 * 10] 使用ebx进行偏移寻址,偏移10个元素
(后来补充:我想了一下,上面这句有问题……还是再使用寄存器标明偏移,或者干脆再拆一条语句出来吧。)
那么“栈基地址”又是什么呢,在这种最简化的场景下就是esp。
在实际场景中,进入一个函数,栈帧都会进行一些调整,比如
push ebp
mov ebp, esp
后续使用ebp寻址
此外,实际场景中如果用到了段,那么要调整段描述符。
总之,你把程序编译一下,然后反汇编不就知道了。
gcc main.c
objdump -S a.out
【 在 liujan611 (anti-creditcard) 的大作中提到: 】
: 下面main.c在多进程环境执行。
: main() {
: int i = 10, j;
: ...................
评论