通常函式返回使用 pop 或bx lr等方式(bx,b類似jmp為跳轉指令,但bx可以指定跳轉區域究竟為thumb還是arm指令。
thumb指令指令的時候,直接填寫該位址卻總是產生sigsys訊號(非法指令執行)。
原因就是該函式為thumb指令,因此跳轉時必須要把指令位址的最低位設定為1(bx 通過這一位來區分指令集),所以函式位址就加了一。
thumb指令集與arm指令集切換
movr0,#5;
argument to function is in r0
addr1,pc,#1;
load address of sub_branch, set for thumb by adding 1
bx r1 ;
r1 contains address of sub_branch+1
;assembler-specific instruction to switch to thumb
sub_branch:
blthumb_sub
;must be in a space of +/- 4 mb
addr1,#7;
point to sub_return with bit 0 clear
bxr1
;assembler-specific instruction to switch to arm
sub_return:
arm狀態下指令的位址末兩位都是0
而thumb狀態下指令位址的末尾是0
thum1+1表明你即將跳入thumb狀態,系統會自動調整位址的
參考:
arm 彙編學習
一 暫存器和定址 arm有16個暫存器,r0 r15 pc r15 lr r14 sp r13 ip r12 push sp減少,pop sp增加 1.定址方式 從操作位址尋找運算元的方式 2.arm的定址方式 a 暫存器定址,運算元在暫存器中 b 立即定址,運算元就在指令中 subs r0,r0,...
ARM彙編學習
前言 任何彙編行都是如下結構 comment 注釋 gnu arm 彙編中,任何以冒號結尾的都被認為是乙個標籤,而不一定非要在一行的開始。下面是乙個簡單的例子,這段匯程式設計序定義了乙個 add 的函式,該函式返回兩個引數的和 section text,x global add give the s...
ARM彙編學習
前言 任何彙編行都是如下結構 comment 注釋 gnu arm 彙編中,任何以冒號結尾的都被認為是乙個標籤,而不一定非要在一行的開始。下面是乙個簡單的例子,這段匯程式設計序定義了乙個 add 的函式,該函式返回兩個引數的和 section text,x global add give the s...