2013-06-30 31 views
6

Dưới đây là một số C, được tìm thấy trong một cuốn sách giáo khoa tôi đang học:Sử dụng hướng dẫn thử nghiệm với cùng đăng ký

... 
do { 
    ... 
    n--; 
} while (n > 0) 
... 

tôi giả n%edx.

Mã lắp ráp sản xuất là:

testl %edx, %edx 
jle .L5 

Tôi hiểu rằng jle kiểm tra ít hơn hoặc bằng (SF^OF) | ZF. Tuy nhiên, tôi không chắc chắn hướng dẫn này tương ứng với n > 0 như thế nào. Bất cứ ai có thể giải thích điều này?

+2

có thể trùng lặp của [x86 Assembly - 'testl' eax chống lại eax?] (Http://stackoverflow.com/questions/147173/x86-assembly-testl-eax-against-eax) – interjay

+0

Tôi không tin như vậy, anh ta đang sử dụng một hướng dẫn nhảy khác. – dgamma3

+0

Nó vẫn là một so sánh với 0, bạn có thể sử dụng bất kỳ hướng dẫn nhảy sau khi nó. – interjay

Trả lời

12

Một số điều này đã được đề cập, nhưng tôi sẽ điền chi tiết hơn một chút.

Mục đích chung của lệnh test reg,mask kiểm tra giá trị sổ đăng ký với mặt nạ (giá trị đăng ký được gắn bên trong bằng mặt nạ) và sau đó đặt cờ trạng thái SF, ZF và PF theo kết quả. [EDIT mỗi bình luận từ @ChrisDodd] Nó cũng vô điều kiện xóa O (overflow) và C (carry) tình trạng bit. [/ EDIT]

SF = sign flag (1 if sign bit is set (a 2's complement negative value)) 
ZF = zero flag (1 if result is 0) 
PF = parity flag (1 if result has an even number of 1 bits) 

Trong ví dụ cụ thể này (test eax,eax), hướng dẫn đang diễn eax AND eax. Khi điều này được thực hiện, các bit sẽ là:

SF = 1 if EAX has a negative value (since sign bit will not change when ANDed with itself) 
ZF = 1 if EAX is zero (the only value that yields a zero when ANDed with itself is zero) 
PF = 1 if EAX has an even number of 1 bits 

Nói cách khác, đó là một thử nghiệm đơn giản về 0 hoặc âm. Đó là một mô hình rất phổ biến trong việc tạo mã trình biên dịch.

+2

Một thực tế bổ sung quan trọng là lệnh 'test' vô điều kiện xóa cờ O và C. Nếu không có nó sẽ không hữu ích cho việc so sánh với số không. –

+0

@ChrisDodd thông tin tốt (+1). Cảm ơn. Nếu bạn không nhớ, tôi sẽ thêm điều đó vào câu trả lời của tôi cho sự hoàn chỉnh. – lurker

1

TEST "đặt cờ trạng thái SF, ZF và PF theo kết quả." (Hướng dẫn sử dụng Intel, khoảng TEST).

Vì vậy, SF sẽ phản ánh liệu n có âm hay không, và ZF sẽ phản ánh liệu n có bằng không hay không.

Nó đặt thành 0.

Vì vậy, (SF^OF)|ZF đơn giản hóa thành SF | ZF, do đó, kết luận, bước nhảy sẽ được thực hiện nếu n <= 0. Điều đó có vẻ sai đường, hy vọng .L5 là nhãn sau vòng lặp, không phải nhãn ở phía trước vòng lặp.

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