2010-02-22 72 views

Trả lời

11

Đây là một cách khá đơn giản để thực hiện.

#assume you want the absolute value of r1 
     ori $2, $zero, $1  #copy r1 into r2 
     slt $3, $1, $zero  #is value < 0 ? 
     beq $3, $zero, foobar #if r1 is positive, skip next inst 
     sub $2, $zero, $1  #r2 = 0 - r1 
foobar: 
#r2 now contains the absolute value of r1 
1

Cách dễ nhất chỉ cần thực hiện một chút phép toán nhị phân trên các giá trị.

http://en.wikipedia.org/wiki/Signed_number_representations mô tả cách các hệ thống khác nhau lưu trữ số âm của chúng. Tôi tin rằng MIPS sử dụng chương trình bổ sung hai của để lưu trữ số đã ký. Điều này làm cho nó khó hơn một chút so với cờ bit, có thể được tắt bằng cách ANDing số bằng 0b01111111, nhưng nó vẫn có thể thực hiện được.

17

Dưới đây là một biến thể chi nhánh-less:

# input and output in $t0 
sra $t1,$t0,31 
xor $t0,$t0,$t1 
sub $t0,$t0,$t1  

làm việc như thế này?
Đầu tiên, $t1 được lấp đầy với bit dấu của $t0. Vì vậy, nếu $t0 là số dương $t1 sẽ được đặt thành 0 và nếu $t0 là âm $t1 sẽ được đặt thành 0xFFFFFFFF.

Tiếp theo, mỗi chút $t0 bị đảo ngược nếu $t1 là 0xFFFFFFFF, hoặc trái không thay đổi nếu $t1 là 0. Nó chỉ như vậy xảy ra mà đảo ngược tất cả các bit của một số giống như thiết lập nó để (-number)-1 (trong bổ sung hai nhân).

Cuối cùng, 0xFFFFFFFF (bằng -1) hoặc 0 bị trừ khỏi kết quả trung gian.

Vì vậy, nếu $t0 ban đầu là tiêu cực bạn sẽ nhận được:
$t0 = ($t0^0xFFFFFFFF) - 0xFFFFFFFF == (-$t0 - 1) - -1 == (-$t0 - 1) + 1 == -$t0.
Và nếu ban đầu nó dương tính bạn sẽ nhận được:
$t0 = ($t0^0) - 0 == $t0.

+1

Cảnh báo: Phương pháp này được bao trả bởi bằng sáng chế của Hoa Kỳ # 6073150. Có lẽ không hợp lệ như địa ngục, mặc dù, kể từ khi nó được biết đến dài hơn năm 1997. – Myria

8

Cách đơn giản nhất. Có một hướng dẫn giả mà thực hiện điều này:

abs $t1, $t1 

sẽ lấy giá trị tuyệt đối của giá trị trong thanh ghi $ t1 và đặt nó trong $ t1

+1

Lệnh giả này là trình tự 'sra/xor/sub' được hiển thị trong câu trả lời khác. – Myria

1

Dưới đây là một phiên bản tối ưu kích thước của nó. Đó là chậm hơn so với câu trả lời SRA/xor/Máy đóng, do các vấn đề dự đoán rẽ nhánh, nhưng nó là một hướng dẫn nhỏ:

bgtz $t0, label 
label: 
    subu $t0, $zero, $t0 

này hoạt động vì khe MIPS chậm trễ: nếu $t0 là tích cực, hướng dẫn subu phủ nhận $t0 thực hiện hai lần. Bạn có thể cần phải kích hoạt .set noreorder trong bộ lắp ráp của bạn.

Các vấn đề liên quan