2010-10-25 39 views
8

Tôi mới sử dụng ngôn ngữ lắp ráp x86, tôi có một số nguyên đã được lưu trong sổ đăng ký eax và tôi muốn kiểm tra xem số đó là số âm hay dương. Để làm điều đó, tôi đã sử dụng lệnh bt để kiểm tra bit đầu tiên.Làm thế nào để kiểm tra nếu một số nguyên đã ký là neg hoặc pos?

Dưới đây là những gì tôi đã làm:

bt eax,0 
jnc isNegative 

bt mang bit đầu tiên để thực hiện lá cờ, và tôi sử dụng jnc để kiểm tra xem carry cờ là 0 hoặc 1. Nếu đó là 1, nó phải là một tiêu cực số, và làm hướng dẫn tiêu cực ... tuy nhiên, đầu ra là không thể đoán trước, đôi khi tôi có một tích cực và nó nhận ra nó như là một số âm. Tôi có làm điều gì sai?

EDIT: Tôi vừa nhận ra rằng nó có thể có liên quan đến endianess. Nó thực sự kiểm tra bit cuối thay vì bit đầu tiên. Hãy để tôi thử sử dụng bt, 7

Trả lời

15

Giá trị là âm nếu MSB được đặt. Nó có thể được kiểm tra với

test eax, 0x80000000 
jne is_signed 

hoặc, đơn giản hơn:

test eax, eax 
js signed 

hoặc đối với trường hợp byte:

test al, al 
js is_signed 
; or 
test eax, 80h 
jne is_signed 
1

kiểm tra giải pháp hiện tại của bạn nếu số là chẵn hoặc lẻ, thay vì kiểm tra các bit 31:

bt eax, 31 
jc number_is_negative 

Hoặc bạn có thể so sánh số lượng bằng không, và kiểm tra xem nó lớn lớn hơn hoặc bằng.

main: 
    ... 
    cmp eax, 0 ; Compare the number to zero 
    jge .number_is_positive ; If it's positive jump to .number_is_positive 
    ; And only arrive here if a number is negative 
    ... 
.number_is_positive: 
    ; Yay! number is positive 
    ... 
4

Bạn có thể sử dụng jgecmp hướng dẫn:

cmp eax, 0 
jl isNegative 
+0

Tuyệt vời, khắc phục sự cố nd đơn giản! Mặc dù, nó phải là cmp eax, 0 – Yonk

+0

Phụ thuộc vào bộ lắp ráp bạn đang sử dụng, nhưng đối với Intel, có. Tôi đoán đó là nơi downvote đến từ. – nmichaels

+0

cmp dài hơn kiểm tra để kiểm tra thường được ưu tiên http://stackoverflow.com/a/147183/995714 –

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