2012-05-15 14 views
7

Câu hỏi nhanh cho các bạn, trong vòng lặp của tôi, tôi cần sử dụng CMP, BLT và BGT để so sánh một số giá trị. Làm thế nào sẽ sử dụng hướng dẫn nói trong vòng lặp sau đây?ARM Assembler - Làm cách nào để sử dụng CMP, BLT và BGT?

Tôi đang cố gắng sử dụng BGT, BLT và CMP khi tôi cần chúng để làm cho ứng dụng của tôi hoạt động. Vấn đề là tôi không biết cách sử dụng chúng. Nếu tôi muốn sử dụng CMP để so sánh r6, với r4 và đặt sự khác biệt vào r7, làm thế nào tôi sẽ làm điều này? Câu hỏi tương tự nếu tôi muốn sử dụng BLT nếu r7 nhỏ hơn 0, tôi sẽ làm như thế nào?

BGT ??????? ; branch if greater than 5 
    CMP ???????? ; compare r6 with r4 , put difference into r7 
    BLT ???????? ;branch if r7 is less than 0 
    BGT ???????? ;branch if r7 is greater than 0 

Dưới đây là toàn bộ vòng lặp của tôi:

LoopStart 

    BL WaitBUT1 
    BL readTemp 
    BL checkTemp 
    BGT ??????? ; branch if greater than 5 
    BL errorVal 
    CMP ???????? ; compare r6 with r4 , put difference into r7 
    BLT ???????? ;branch if r7 is less than 0 
    BL FanOn 
    BL errorLedOn 
    BL systemLedOn 
    BL heaterOn 
    BGT ???????? ;branch if r7 is greater than 0 
    BL FanOff 
    BL errorLedOff 
    BL systemLedOff 
    BL heaterOff 
    BL WaitBUT2 
    BL FanOff 
    BL errorLedOff 
    BL systemLedOff 
    BL heaterOff 

    B LoopStart 
+0

Câu hỏi của bạn chưa rõ ràng. Vui lòng làm rõ. –

+1

Tôi đã thêm mô tả khác cho câu hỏi của mình. – user1080390

Trả lời

9

Bạn không thể thực hiện nhánh có điều kiện mà không cần đặt trước thanh ghi điều kiện bằng cách nào đó. Điều này có thể được thực hiện với cmp hoặc bằng cách thêm s vào hầu hết các hướng dẫn. Kiểm tra tài liệu lắp ráp ARM để biết chi tiết. ví dụ nhanh:

Chi nhánh nếu r0 lớn hơn 5:

cmp r0, #5 ;Performs r0-5 and sets condition register 
bgt label_foo ;Branches to label_foo if condition register is set to GT 

Hãy so sánh r6 với r4, chênh lệch đưa vào r7, chi nhánh nếu r7 < 0:

subs r7, r6, r4 ;Performs r7 = r6 - r4 and sets condition register 
blt label_bar ;Branches to label_bar if r7 < 0 (in which case r6 < r4) 
0

Bạn nên kiểm tra các tài liệu ARM tại (ví dụ cho tài liệu CMP): http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/CIHIDDID.html

Từ những gì có thể được đọc có những gì bạn đang cố gắng có thể yêu cầu hai hướng dẫn thay vì chỉ một (trừ khi bộ xử lý ARM của bạn thực hiện một số xử lý đặc biệt)

Loại regar ds,
Bo

1

Nếu tôi muốn sử dụng CMP để so sánh r6, với r4 và đặt sự khác biệt vào r7, làm thế nào tôi sẽ làm điều này?

subs r7, r6, r4 /* r7 ← r6 - r4 */ 

Cùng một câu hỏi nếu tôi muốn sử dụng BLT nếu r7 là nhỏ hơn 0, thế nào tôi sẽ làm điều này?

bmi _exit   /* branch if r7 < 0 */ 

BMI (trừ/âm) Khi N được kích hoạt (N là 1) trong đó N là một lá cờ đó sẽ được kích hoạt nếu kết quả của các hướng dẫn mang lại một số âm. Bị vô hiệu hóa.

Tại sao phụ thay vì phụ? Vì S là hậu tố tùy chọn khi được chỉ định, các cờ điều kiện (như N) được cập nhật trên kết quả của phép toán.

Trân trọng.