声明输出输入变量:"+r"(xxx)
7.描述 C 语言内嵌汇编中,__asm__ __volatile__这一句的__volatile__的作用
答:
__volatile__的作用:禁止编译器对内嵌汇编代码优化
8.请说明以下两端代码的异同
.data:
.word 0x10, 0x20
ldr r1, data
.data:
.word 0x10, 0x20
ldr r0, =data
ldr r1, [r0]
答:
上面代码:r1 = *(int *)data; 即 r1 里面存放了 0x10,r1 = 0x10
下面代码:r0 = data, r1 = *(int *)r0; 即 r0 里存放了 0x10 的地址,r1 = 0x10
9.说明以下两条指令的异同
ldr pc, =dst_addr
b dst_addr
答:
ldr pc, =dst_addr:将命令的地址直接给 pc,pc 默认指向下下条指令的执行地址,所以
程序会跳转到目的地址执行,跳转范围:任意;
b dst_addr:跳转到目的地址执行。但是 b 指令的跳转范围有限,+-32M bytes
原因:指令的存储格式:[condition(4 bytes)|b/bl(4 bytes)|offset(24 bytes)]
在 offet 内有一位标志位,标志往前跳还是往后跳,单位是 word(指令数),
2^23 = 8M,又因为每条指令 4 bytes,所以可跳转前后 32M
10.如何使用 swi/svc 取调用系统调用,已 read 位例说明
答:
共有 378 个系统调用,每个系统调用对应一个系统调用号
(1).用户态调用函数 read
(2).下一层会调用 syscall 函数
(3).使用 swi/svc num(系统调用号)
系统调用号可在内核头文件中查找,/<linux>/arch/arm/include/asm/unistd.h
(4).最后直接使用 sysread 函数完成功能
11.写出与 cps #0x12 等价的 arm 汇编代码
答:
cps #0x12:直接切换到模式编号为 12 的模式,即中断模式
等价的汇编代码:
mrs r4, cpsr