- 論壇徽章:
- 17
|
本帖最后由 asuka2001 于 2013-11-07 13:16 編輯
回復 1# xiaojsj
對內(nèi)嵌匯編不算特別熟,大概解釋下:
%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:代表的是標號所處的指令的地址。
|
|