牛客网练习,某公司2017秋招。叫车 2017年
第一题:
现有某函数,其方法声明为:int func(int x)
该函数对应的ARM汇编代码如下:
0000016A PUSH {LR}
0000016C MOVS R3, #1
0000016E ADDS R1, R3, #0
00000170 loc_170
00000170 CMP R0, #0
00000172 BLE loc_184
00000174 MOVS R2, R0
00000176 MULS R2, R3
00000178 ADDS R3, R2, #1
0000017A TST R0, R1
0000017C BEQ loc_180
0000017E ADDS R3, R2, #0
00000180 loc_180
00000180 SUBS R0, #1
00000182 B loc_170
00000184 loc_184
00000184 MOVS R0, R3
00000186 POP {PC}
从上面的汇编代码可以得出func(3)的值等于? 答案 : 7
解释:执行到倒数第一步时r0=0,r1=1,r2=1,r3
依次变为1、1+1=2、1+2=3、3+3+1=7,即r3=7,
arm使用r0做函数返回值,故最终执行movs r0,r3后r0=7。
第三题:
安卓系统中所有App进程是下面的哪个进程fork产生的? 答: zygote
A.init
B.system_server
C.zygote
D.kthreadd
解释:
Android进程从大类来划分,可分为内核进程和用户进程
安卓有3个非常重要的进程system_server(zygote孵化出)、mediaserver(init孵化出)、
servicemanager(init孵化出)
A.init进程 :是Linux系统的用户空间进程,或者说是Android的第一个用户空间进程。
B.SystemServer进程: 系统服务进程由Zygote进程Fork出来的。
C.zygote进程 : 是所有上层Java进程的父进程,APP主线程是由 Zygote母体生成.
D.kthreadd进程: 2号进程Linux系统的内核进程,是所有内核进程的鼻祖。
加载顺序是 init-》kthreadd-》zygote-》APP主线程
第四题:以下关于内存文件mmap映射的说法不正确的是? C
A.当文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问
B.子进程会继承父进程通过mmap映射的地址空间
C.使用mmap必须指定映射到内存的具体文件
D.同一个文件的不同段内容可以分别被映射到不同的内存空间
解释:文件将会被映射到这一区域的某块虚拟内存上,没有指定起始地址,则由内核来分配。
第八题: 现有Android应用内某函数,其方法声明为:private int func()
该函数对应的smali反汇编代码如下:
.method private func()I
00000000 const-string v2, “Didichuxing”
00000004 const/4 v0, 0
00000006 const/4 v1, 0