2012-01-23 19 views
8

Tôi đang cố gắng quấn đầu xung quanh tràn & mang cờ trong x86.mang/tràn và trừ trong x86

Theo tôi được biết, đối với việc bổ sung các ký 2 của số bổ sung, những lá cờ chỉ có thể được tạo ra trong một trong bốn cách (ví dụ của tôi là những con số 4-bit):

  1. pos + pos = neg (tràn)
    • 0111 + 0001 = 1000 (7 + 1 = -8)
  2. pos + neg = pos (carry)
    • 0011 + 1110 = 0001 (3 + -2 = 1)
  3. neg + neg = neg (carry)
    • 1111 + 1111 = 1110 (-1 + -1 = -2)
  4. neg + neg = pos (tràn & carry)
    • 1000 + 1001 = 0001 (-8 + -7 = 1)

Vì vậy, trong x86, lắp ráp, d oes giảm B từ A tạo ra các cờ giống như thêm A và -B?

+0

Xem thêm [Hiểu về điều kiện và điều kiện tràn/cờ ký và chưa ký.] (Http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt) và các liên kết khác trong [x86 tag wiki] (https://stackoverflow.com/tags/x86/info). –

Trả lời

16

Đây là bảng tham chiếu có thể hữu ích. Điều này hiển thị ví dụ về mỗi kết hợp có thể có của 4 cờ số học có thể là kết quả của lệnh ADD và SUB trên x86. 'h' 'ud' và 'd' đứng cho hex, dấu thập phân và ký hiệu đại diện thập phân của mỗi giá trị. Ví dụ, hàng đầu tiên cho SUB nói 0xFF - 0xFE = 0x1 không có cờ nào được đặt.

Nhưng, tôi nghĩ câu chuyện ngắn là câu trả lời của Alex là chính xác.

ADD 
     A     B     A + B    Flags 
---------------  ---------------- ---------------  ----------------- 
h | ud | d | h | ud | d | h | ud | d | OF | SF | ZF | CF 
---+------+-------+----+------+-------+----+------+-------+----+----+----+--- 
7F | 127 | 127 | 0 | 0 | 0 | 7F | 127 | 127 | 0 | 0 | 0 | 0 
FF | 255 | -1 | 7F | 127 | 127 | 7E | 126 | 126 | 0 | 0 | 0 | 1 
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 
FF | 255 | -1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 
FF | 255 | -1 | 0 | 0 | 0 | FF | 255 | -1 | 0 | 1 | 0 | 0 
FF | 255 | -1 | FF | 255 | -1 | FE | 254 | -2 | 0 | 1 | 0 | 1 
FF | 255 | -1 | 80 | 128 | -128 | 7F | 127 | 127 | 1 | 0 | 0 | 1 
80 | 128 | -128 | 80 | 128 | -128 | 0 | 0 | 0 | 1 | 0 | 1 | 1 
7F | 127 | 127 | 7F | 127 | 127 | FE | 254 | -2 | 1 | 1 | 0 | 0 


SUB 
     A     B     A - B    Flags 
---------------  ---------------- ---------------  ----------------- 
h | ud | d | h | ud | d | h | ud | d || OF | SF | ZF | CF 
----+------+-------+----+------+-------+----+------+-------++----+----+----+---- 
FF | 255 | -1 | FE | 254 | -2 | 1 | 1 | 1 || 0 | 0 | 0 | 0 
7E | 126 | 126 | FF | 255 | -1 | 7F | 127 | 127 || 0 | 0 | 0 | 1 
FF | 255 | -1 | FF | 255 | -1 | 0 | 0 | 0 || 0 | 0 | 1 | 0 
FF | 255 | -1 | 7F | 127 | 127 | 80 | 128 | -128 || 0 | 1 | 0 | 0 
FE | 254 | -2 | FF | 255 | -1 | FF | 255 | -1 || 0 | 1 | 0 | 1 
FE | 254 | -2 | 7F | 127 | 127 | 7F | 127 | 127 || 1 | 0 | 0 | 0 
7F | 127 | 127 | FF | 255 | -1 | 80 | 128 | -128 || 1 | 1 | 0 | 1 
+0

Bảng của bạn hữu ích, nhưng 127 - -1 là 128 không -128. –

+2

@ James - Không, trích dẫn tham chiếu của lập trình viên x86 "Các giá trị số nguyên từ –128 đến +127 cho số nguyên byte" – srking

+0

OK, bạn đã đúng, nhưng bảng là tuyệt vời. :) –

6

Tất cả 4 kết hợp giá trị mang và tràn có thể thực hiện khi cộng hoặc trừ. Bạn có thể xem thêm ví dụ trong this answer.

This answer chứa bằng chứng thực tế là việc bạn mang theo số A-B là số nghịch đảo của số tiền bạn nhận được từ A+(-B). Mã bằng liên kết đầu tiên khai thác thuộc tính này để biến ADC thành SBB. Tuy nhiên,

Giá trị cờ tràn đã ký kết phải giống nhau cho cả A-BA+(-B) vì nó phụ thuộc vào kết quả có bit dấu chính xác hay không và cả hai trường hợp bit dấu sẽ giống nhau.