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.
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
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
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