2011-08-12 30 views
16

gì dòng sau làm trong lắp ráp cánh tay:itte trong lắp ráp cánh tay

000031e6  2916 cmp r1, #22 
000031e8  bf1a itte ne 

tôi nhận được dòng đầu tiên (so sánh r1 đến 22) nhưng những gì về dòng thứ hai (Tôi chưa bao giờ thấy lệnh itte trước và googling trả lại không có gì)

Trả lời

46

Đó là NẾU của ARM Hướng dẫn -THEN-ELSE, được giới thiệu trong bộ chỉ dẫn Thumb-2. (Dựa trên ví dụ cụ thể của bạn ở trên, sẽ hữu ích nếu bạn đã hiển thị 3 hướng dẫn tiếp theo theo hướng dẫn ITTE, bạn sẽ hiểu tại sao khi bạn đọc xong câu trả lời này.)

Hướng dẫn này được sử dụng để xử lý các chuỗi nhỏ của mã có điều kiện, tối đa 4 hướng dẫn. Hãy suy nghĩ về nó như là một cách khác nhau để thực hiện thực thi có điều kiện của ARM (ví dụ: BNE - lệnh nhánh chỉ được thực hiện nếu cờ zero không được thiết lập).

Lợi ích của nó là nó tránh được hình phạt tham gia một chi nhánh (có lẽ bạn đã biết về đường ống, vv)

Các hướng dẫn là một chút tham gia nhưng một khi bạn quấn đầu của bạn xung quanh nó, nó khá thanh lịch.

Nó có dạng:

IT<x><y><z><cond>

nơi x, y, và z là không bắt buộc, và phải là T (ví "sau đó") hoặc E (cho "khác"). <cond> là bất kỳ điều kiện nào như NE hoặc EQ hoặc GT, v.v. được phản ánh trong cờ APSR.

Vì vậy, bạn luôn luôn có một T sau I (hướng dẫn là IT sau khi tất cả!), Và sau đó 0-3 E 's hoặc T' s. Đối với mỗi T và mỗi E, bạn phải có hướng dẫn tiếp theo theo thứ tự trùng khớp. Mỗi lệnh phù hợp tiếp theo phải có các điều kiện phù hợp với hướng dẫn IT.

Hãy theo tôi, tôi biết điều này thật khó hiểu. Tôi sẽ đưa ra một vài ví dụ ở đây để minh họa.

Hình thức tối thiểu của các hướng dẫn sẽ là một cái gì đó như:

IT LT 
SUBLT.W R2, R1 

Trong trường hợp này, nếu LT là đúng (theo cờ APSR), các phép trừ sẽ diễn ra.Hãy chú ý đến số LT trong số SUB khớp với số LT trong hướng dẫn IT.

Một ví dụ toàn diện sẽ là một cái gì đó như:

ITETT NE 
ADDNE R0, R0, R1 
ADDEQ R0, R0, R3 
ADDNE R2, R4, #1 
MOVNE R5, R3 

Vì vậy, chúng tôi có THEN ELSE THEN THEN (TETT), với điều kiện NE. Lưu ý trong 4 hướng dẫn có điều kiện theo sau (4 hướng dẫn, 1 cho TETT), hướng dẫn "THEN" có điều kiện NE và hướng dẫn "ELSE" (hướng dẫn thứ 2 sau lệnh IT - nhớ E là số 2 của 4 E và T's) có điều kiện ngược lại. Nó không thể là bất cứ điều gì khác, tức là nó sẽ là một lỗi nếu nó là một cái gì đó như LT thay vì EQ. EQ là đối diện của NE.

Vì vậy, nếu NE là đúng, thì hướng dẫn 1, 3 và 4 sẽ được thực thi. Nếu không (EQ), chỉ lệnh 2 (ADDEQ) mới được thực hiện.

Tôi đã đưa ra các ví dụ về hướng dẫn 1 và 4, nhưng bạn cũng có thể có các biểu mẫu 2 (IT{T,E}) và 3 hướng dẫn (IT{T,E}{T,E}).

Cuối cùng, để mang về nhà điểm, tôi sẽ đưa ra một ví dụ về cách mã C sau đây có thể được thực hiện sử dụng hướng dẫn này:

if (R4 == R5) 
{ 
    R7 = R8 + R9; 
    R7 /= 2; 
} 
else 
{ 
    R7 = R10 + R11; 
    R7 *= 2; 
} 

chuyển đổi để

CMP R4, R5 
ITTEE EQ 
ADDEQ R7, R8, R9 ; if R4 = R5, R7 = R8 + R9 
ASREQ R7, R7, #1 ; if R4 = R5, R7 /= 2 
ADDNE R7, R10, R11 ; if R4 != R5, R7 = R10 + R11 
LSLNE R7, R7, #1 ; if R4 != R5, R7 *=2 

Điều đó sẽ cung cấp cho bạn đủ để nhai một lúc.

+4

Tổng quan đẹp. Một số nền tảng cho lợi ích của người đọc có thể không phải tất cả những người quen thuộc với ARM: Opcodes ARM 32 bit đều có bit điều kiện để kiểm soát xem opcode có nên thực thi hay không. Khi biến thể Thumb ban đầu được phát triển, không có chỗ trong các opcodes 16 bit dành cho các bit thực thi có điều kiện, do đó chỉ các opcodes nhánh mới có thực thi có điều kiện (giống như nhiều CPU khác). Thumb2 đã thêm các 'opcodes có điều kiện' này để cho phép các chuỗi ngắn của việc thực thi có điều kiện (ví dụ, để ngăn chặn các chuỗi mã điều kiện ngắn khỏi giết chết đường dẫn). –

+0

@Michael - điểm tuyệt vời, cảm ơn bạn đã đề cập đến điều đó. – Dan

+0

Giải thích tuyệt vời! Nhưng nếu tôi muốn có thêm hướng dẫn trong khối điều kiện (không giới hạn ở 4)? Cách duy nhất là sử dụng chi nhánh? –

3

Nói cách đơn giản ITTE thực hiện sau 3 lần thực thi như NẾU {} THEN {} ELSE {} dựa trên hướng dẫn trên cmp.

Trong kiến ​​trúc ARMv6T2 trở lên, bạn có thể sử dụng lệnh IT để thực thi có điều kiện. Trong các kiến ​​trúc trước ARMv6T2, không có lệnh IT và do đó không thể thực thi các lệnh Thumb có điều kiện ngoại trừ lệnh chi nhánh B. Bộ kết hợp kiểm tra các hướng dẫn CNTT, nhưng bỏ qua chúng khi lắp ráp vào mã ARM.

Để giải pháp của bạn cho phép hiểu cú pháp đầu tiên của lệnh IT đơn giản (được giới thiệu trong Thumb 2) của hội đồng ARM, là cơ sở của ITTE.

IT{pattern} {cond}

Nếu-thì, đặt điều kiện thực hiện cho đến 4 hướng dẫn sau đây thể được bất kỳ sự kết hợp của lên đến ba T (sau đó) và E (khác) chữ, câu lệnh đầu tiên sau CNTT là luôn cond (T) dẫn mà có thể sửa đổi chương trình truy cập phải là cuối cùng trong một khối CNTT

các then điều kiện phải phù hợp với mã trạng thái, và bất kỳ else điều kiện phải có điều kiện ngược lại.Bảng dưới đây cho thấy các mã điều kiện và đối lập của họ:

enter image description here

Hãy hiểu khác cmp hướng dẫn.

CMP Rn, #imm

Rn phải là đăng ký Lo. phạm vi rộng 0-255. Các hướng dẫn này cập nhật các cờ N, Z, C và V theo kết quả.

Hãy nhớ rằng: IT cho phép 1-4 hướng dẫn Thumb sau (khối CNTT) để có điều kiện hoặc bạn có thể nói đây ITTE được sử dụng để xử lý các chuỗi mã nhỏ có điều kiện, tối đa 4 hướng dẫn.

ví dụ đơn giản

Ex 1:

cmp r1, #22  Compare r1 value with 22 
IT EQ   Read this as If EQual Then ADD R1,R1,#1 
ADD R1,R1,#1  <- This will only be executed if above r1 value equal to 22(means when z condition flag is equal to 1) 

Ex 2:

cmp r1, #22  Compare r1 value with 22 
ITE EQ   Read this as If EQual Then ADD R1,R1,#1 Else ADD R0,R0,#1 
ADD R1,R1,#1  <- This will only be executed if the Z condition flag is 1 
ADD R0,R0,#1  <- This will only be executed if the Z condition flag is 0 

gì ITTE làm gì? là câu hỏi của bạn ở đây

CMP R1, #22  Compare r1 value with 22 
    ITTE NE   Read this as IF NotEqual Then ADD R1,R1,#1 Then ADD R0,R0,#1 Else ADD R2,R2,#1 
    ADD R1,R1,#1  <- This will only be executed if the Z condition flag is 0 
    ADD R0,R0,#1  <- This will only be executed if the Z condition flag is 0 
    ADD R2,R2,#1  <- This will only be executed if the Z condition flag is 1 

Đây ITTE áp đặt các điều kiện NE trên hai đầu tiên sau hướng dẫn và điều kiện EQ trên tiếp theo.

LƯU Ý: Bất kỳ chi nhánh mà tồn tại trong một khối CNTT phải là hướng dẫn cuối cùng trong tài liệu tham khảo block.Taken từ here dụ sau sẽ có hành vi undefined vì lệnh rẽ nhánh được sử dụng ở giữa của lệnh rẽ nhánh.

ite  eq 
blxeq some_label @ UNPREDICTABLE during an IT block. 
movne r0, #0 

cách chính xác để thực hiện ở trên sẽ được đưa mov trước BLX, như sau:

ite  ne 
movne r0, #0 
blxeq some_label @ Ok at the end of an IT block. 

Để biết thêm thông THUMB-2 Instruction set reference manual Trang 4-92

IT{x{y{z}}}<q> <Firstcondition> 

<x> điều kiện để được hướng dẫn thứ hai trong khối CNTT

<y> điều kiện để giảng dạy thứ ba trong lĩnh vực CNTT chặn

<z> điều kiện để hướng dẫn thứ tư trong lĩnh vực CNTT chặn

<q> xác định vòng loại lắp ráp tùy chọn trên hướng dẫn

Hai vòng loại định nghĩa ở đây:

 .N Meaning Narrow. Assembler has to choose 16-bit encoding for the instruction if it is not possible then error. 

     .W Meaning Wide. Assembler has to select 32-bit encoding for the instruction if is not possible then error. 

<Firstcondition> Điều kiện cho lệnh đầu tiên trong khối CNTT tức là EQ, NE, CC, CS.