- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在写一个迷你操作系统。当我编写这段代码来显示时钟时,它出错了
7 void timer_callback(pt_regs *regs)
8 {
9 static uint32_t tick = 0;
10 printf("Tick: %dtimes\n", tick);
11 tick++;
12 }
tick 不是用 0 初始化的,而是 1818389861。但是如果用 0x01 或其他任何零来初始化 tick init,就没问题!!!
所以我写了一个简单的 c 文件然后 objdump:
staic.o: file format elf32-i386
Disassembly of section .text:
00000000 <main>:
extern void printf(char *, int);
int main(){
0: 8d 4c 24 04 lea 0x4(%esp),%ecx
4: 83 e4 f0 and $0xfffffff0,%esp
7: ff 71 fc pushl -0x4(%ecx)
a: 55 push %ebp
b: 89 e5 mov %esp,%ebp
d: 51 push %ecx
e: 83 ec 04 sub $0x4,%esp
static int a = 1;
printf("%d\n", a);
11: a1 00 00 00 00 mov 0x0,%eax
16: 83 ec 08 sub $0x8,%esp
19: 50 push %eax
1a: 68 00 00 00 00 push $0x0
1f: e8 fc ff ff ff call 20 <main+0x20>
24: 83 c4 10 add $0x10,%esp
return 0;
27: b8 00 00 00 00 mov $0x0,%eax
}
2c: 8b 4d fc mov -0x4(%ebp),%ecx
2f: c9 leave
30: 8d 61 fc lea -0x4(%ecx),%esp
33: c3 ret
好奇怪,没有使用内存!!!
更新:我说清楚
第二个 static.c 是一个实验,它被认为没有内存使用,但我错了,mov 0x0 %eab
是。我混淆了 0x0 和 $0x0/..\
我的原始问题是为什么 tick 不能用 0 初始化成功。(但可以用 1 或任何其他数字初始化)。
我再次使用 gdb 查找它,好的,它确实像 mov<br/>
这样使用内存,但真正强大的是内存
eax,ds:0x106010x 0x106010
不是 0,但它应该是,就像我说的,如果我让 tick = 1 or anythingelse
, 内存按照我的意愿进行初始化,这很奇怪!
工具:gdb,objdump返回不同的asm(不同的意思,不是formate),因为,刚学os,不擅长c,所以我放弃了,忽略它....
最佳答案
内存被占用,请确定;但是,您不会在 .text
部分中找到该内存。静态变量的内存分配在 .bss
(当零初始化时;或者,在 C++ 的情况下,动态初始化)或 .data
(当非零初始化时)部分。
当使用 -d
(反汇编)选项使用 objdump
转储目标文件时,还使用 -r
(重定位)很重要) 选项。否则,您得到的反汇编是骗人的,没有任何意义。
在您的情况下,地址 11
和 1f
处的指令必须在地址 11
处重定位到变量 a
和地址 1f
,到函数 printf
。地址 11
的指令从变量 a
加载值,如果没有适当的重定位,它看起来就像从地址 0 加载值一样。
关于您最初的问题,您得到的值 1818389861 或 0x6C626D65 非常了不起。我敢打赌,在您的程序中的某处,您有一个缓冲区溢出,涉及一个包含子序列 embl
的字符串。
作为旁注,我想提请您注意在 printf
调用中使用正确的类型规范。类型规范%d
对应类型int
;在所有现代主流架构上,int
和 int32_t
的大小相同。然而,这并不能保证永远如此。有用于显式大小类型的特殊类型规范,例如,对于 int32_t
,您使用 "PRId32"
:
uint32_t x;
printf("%"PRId32, x);
关于c - i386-elf-gcc 输出关于 "static a = 0"的奇怪汇编命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39975235/
我是一名优秀的程序员,十分优秀!