2011-12-13 58 views
13

Tôi có đoạn code sau:hội - Thực cờ VS tràn cờ

mov al, -5 
add al, 132 
add al, 1 

Như tôi đã kiểm tra nó, cờ tràn và cờ carry sẽ thiết lập trong hoạt động đầu tiên, và trong lần thứ hai, chỉ có tràn sẽ được thiết lập.

Nhưng tôi không hiểu tại sao:

  1. Trong số unsigned, kết quả là 143 (8FH), và cho đó là phù hợp với 8-bit số unsigned (nhỏ hơn 255) => carry không nên đặt cờ. Trong số đã ký, kết quả là 127, Nó phù hợp với ký hiệu 8 bit và không nên thiết lập tràn.

Có vấn đề gì? Cảm ơn.

Trả lời

13

Trong số học chưa ký, bạn đã thêm 0xFB vào 0x84, nghĩa là 251 + 132, thực sự lớn hơn 8 bit và do đó cờ mang theo được đặt.

Trong trường hợp thứ hai, bạn đang thêm +127 đến 1, thực sự vượt quá phạm vi 8 bit đã ký và do đó cờ tràn được đặt.

+0

Vì vậy, tràn chỉ được đặt khi tôi 'thêm al, 1'? Nếu tôi xóa dòng này, tràn sẽ không được đặt? –

+1

@Tom: Lỗi tràn sẽ được đặt bởi cả lệnh 'add'. –

+0

Vì vậy, bạn có thể giải thích cho tôi xin vui lòng nơi bộ tràn? bởi vì như tôi đã hiểu, trong phạm vi -128 đến 127 không ảnh hưởng đến tràn. –

21

Xảy ra tràn khi kết quả của việc thêm hai số dương là âm hoặc kết quả của việc thêm hai số âm là dương. Ví dụ: +127+1=?

+127=0111 1111 
    +1=0000 0001 
    --------- 
    1000 0000 

Như chúng ta nhìn vào các bit dấu hiệu của hai toán hạng và các bit dấu hiệu của kết quả, chúng tôi phát hiện ra rằng Overflow xảy ra và câu trả lời là không chính xác.