- 论坛徽章:
- 17
|
本帖最后由 asuka2001 于 2013-11-07 13:16 编辑
回复 1# xiaojsj
对内嵌汇编不算特别熟,大概解释下:
%0对应err, %1对应x,%2对应addr, %3对应 -EFAULT "1: " TUSER(ldr) " %1,[%2],#0\n" \
"2:\n" \ 这一段是实际的读取指令,相当于 ldr x, [addr], #0,从地址addr处读取,并保存到x " .pushsection .fixup,\"ax\"\n" \
" .align 2\n" \
"3: mov %0, %3\n" \
" mov %1, #0\n" \
" b 2b\n" \
" .popsection\n" \ .pushsection到 .popsection之间的代码不放到上面那条实际读取指令之后,而是要求gcc放到 fixup段去,它的功能实际上就是
err = -EFAULT
goto 2: " .pushsection __ex_table,\"a\"\n" \
" .align 3\n" \
" .long 1b, 3b\n" \
" .popsection" \ 同样,.pushsection到 .popsection之间的代码不放到上面那条实际读取指令之后,要求gcc放到 __ext_table段去,它是保存了两个地址,其含义相当于
struct exception_table_entry
{
unsigned long insn, fixup;
} entry;
entry.insn = 1:
entry.fixup = 3:
然后把 entry添加到 exception_table中去,如果对其感兴趣,可以查看 search_exception_table()
1:, 2:, 3:代表的是标号所处的指令的地址。
|
|