2010-08-16 57 views
1

免責聲明:我是一個ASM新手。我可能需要檢查我的二進制補什麼的充分理解:(左移,然後立即右移在ASM?

我很困惑,以下目的:??

.... 
BL some_func 
MOV R3, R0,LSL#16 
MOVS R3, R3,LSR#16 
.... 

爲什麼向後移位和MOVS

+0

http://net.pku.edu.cn/~course/cs201/2003/mirrorWebster.cs.ucr.edu/Page_asm/ArtofAssembly/ch15/CH15-2.html#HEADING2-1 – Borealid 2010-08-16 03:14:01

+0

什麼處理器,ARM ? – starblue 2010-08-16 12:26:33

+0

@borealid - 謝謝,我一直在尋找關於asm的實際課件 @starblue這是手臂 – 2010-08-16 12:44:26

回答

2

在左移,溢出的位將遺失。上述因此,所有位32-16 = 16位將右移之後清零。

 r0 =     aaaabbbbccccdddd eeeeffffgggghhhh 
lsl, 16 -> aaaabbbbccccdddd eeeeffffgggghhhh 0000000000000000 
      (overflowed) 
     ->     eeeeffffgggghhhh 0000000000000000 
lsr, 16 ->         eeeeffffgggghhhh 

指令相當於

r3 = r0 & 0xffff; 
+0

,主要是回答我的問題...至少我問的一個;) 我遺漏的一個數據是,r0是一個小值在那一點,所以我沒有看到獲得什麼...我更新了問題 – 2010-08-16 12:51:22

+0

沒關係......咖啡沒有工作...我得到它:) – 2010-08-16 12:53:22

3

它有三個指令做一個R0 & = 0xFFFF的

 
mov r3,#0x00FF 
orr r3,r3,#0xFF00 
and r0,r0,r3 

所以移位來回更有效率。

你可能一直在做的事情是關於一個16位變量,所以爲了準確,編譯器必須截斷高位以使程序正常運行。你是否使用了int或者它可能沒有做到這一點,不知道你是如何煽動這些指令的。

有時候你會看到這樣做來做一個符號擴展,但這不是一個算術轉換,它是一個邏輯轉換(零進位而不是進位位)。

也許你的代碼做了類似if(你好& 0xFFFF)那麼。

ARM不能正常更新標誌,除非你告訴它,出於性能的考慮,如果像這樣

 
if(a&0xFF) b=0x12; else b=0x34; 
would be something like: 
ands r0,r0,#0xFF 
movne r1,#0x12 
moveq r1,#0x34 

與其他處理器沒有別的代碼,並總是設置標誌和下一個指令將是一個導致管道沖洗的分支。

 
ands r0,r0,#0xFF 
bne notequal 
mov r1,#0x12 
b wasequal 
notequal: 
mov r1,#0x34 
wasequal: 

執行時更殘酷。許多處理器會用立即移動的方式覆蓋標誌,而手臂不能這樣做。 (拇指模式是另一回事)。

而不是隻有有條件字段的分支,手臂上的每條指令都有一個條件字段,如果相等則分支,如果相等,則相加時相加,相等時相加,如果進位置分支,並且如果進位等。同樣,可以修改標誌的指令具有一個操作碼位,用於啓用或禁用標誌的更新。您將這些s添加到指令中。並且r0,r1,r2不是,而是r0,r1,r2更新標誌。

所以你的兩條指令做了兩件事情,它將寄存器的高16位清零,然後設置標誌以表示接下來的任何條件。對於可能是分支的mov,如果相等,則分支。你最初的源代碼看起來是什麼產生的?

+0

感謝您的詳細回覆...即時通訊仍然試圖把它全部......我沒有寫出原來的代碼,這是一個反彙編的結果 – 2010-08-17 13:36:33