2016-04-12 23 views
5

Điều toàn bộ lá cờ làm tôi bối rối. Các định nghĩa trên web dường như thực sự đơn giản. Tôi dường như không thể có được một lời giải thích áp dụng thực sự tốt cho tất cả điều này.Làm cách nào để xác định khi nào cờ 0, cờ hiệu, cờ tràn và cờ tiến hành được đặt?

Theo định nghĩa của chúng, - thực hiện: chỉ ra một unsigned integer overflow - overflow: chỉ ra một số nguyên tràn ký - zero: một hoạt động sản xuất không - dấu hiệu: hoạt động sản xuất một số âm

Vậy làm thế nào trên thế giới có những câu sau đây đúng không? - Các hướng dẫn sau sẽ đặt cờ Đăng: (. Câu trả lời ở đây là 252 không phải là một số âm Vậy tại sao là tập hợp dấu hiệu cờ?)

mov al,0FEh 
sub al,2 
  • Thêm 7Fh và 05h trong một 8-bit đăng ký thiết lập cờ tràn. (Câu trả lời ở đây là 132. Nó không phải là trên 255 vậy tại sao có một tràn?)

  • Thêm 0FFh và 05h trong thanh ghi 8 bit không đặt cờ tràn. là 300 vì vậy làm thế nào là không có một lá cờ tràn trên? Nó là trên 256)

  • Thêm 5 đến 0FBh trong thanh ghi 8 bit đặt cờ Zero (Câu trả lời ở đây là 256, không phải 0. Tôi hiểu 8 bit chỉ có thể giữ 255 nhưng "0" xuất phát từ đâu? Tôi chỉ không hiểu.)

Ai đó có thể vui lòng cho tôi biết tôi đang làm gì sai ở đây và cách tiếp cận đúng là gì? Cảm ơn.

+1

Bạn có thể muốn đọc về cách số âm được thể hiện trong phần bổ sung của hai. – EOF

+1

_ "Câu trả lời ở đây là 252 không phải là số âm" _ Câu trả lời là 0xFC, có thể xem là 252 hoặc -4. Việc giải mã cờ hiệu trong hướng dẫn sử dụng của Intel là _ "Đặt bằng bit quan trọng nhất của kết quả, là bit dấu của một số nguyên đã ký. (0 cho biết giá trị dương và 1 cho biết giá trị âm.)" _ . 0xFC rõ ràng có bộ bit quan trọng nhất. – Michael

+1

_ "Tôi hiểu 8 bit chỉ có thể giữ 255 nhưng đâu" 0 "đến từ đâu?" _ Giá trị của 8 bit quan trọng nhất là 256 là bao nhiêu? – Michael

Trả lời

6

Câu trả lời ở đây là 252 không phải là số âm. Vậy tại sao cờ hiệu được đặt?

Như unsigned nó là 252, nhưng không dấu không thể có một dấu hiệu, vì vậy cờ dấu chỉ liên quan đến số lượng xử lý như . Nó không quan trọng như thế nào bạn xử lý nó, bộ vi xử lý luôn luôn xử lý nó như đã ký với cờ hiệu. Vì vậy 252 là trên 127, do đó nó âm trong phần bù 2 và bit dấu được thiết lập.

Thêm 7Fh và 05h trong một đăng ký 8-bit đặt cờ tràn. (Câu trả lời ở đây là 132. Nó không phải trên 255 vậy tại sao lại có một tràn?)

Như bạn nói, tràn được đặt khi một số đã ký sẽ tràn. Biến 8bit đã ký có thể đi từ -128 đến 127. Do đó, từ 127 đến 132 là tràn.

Thêm 0FFh và 05h trong một đăng ký 8-bit không đặt cờ tràn. (Câu trả lời là 300 vậy làm thế nào là có không phải là một lá cờ tràn trên? Đó là trên 256)

Một lần nữa, tràn là đã ký tràn. Điều này gây ra lỗi không được ký, do đó, mang theo bit sẽ được đặt.

Thêm 5 đến 0FBh trong thanh ghi 8 bit đặt cờ 0 (Câu trả lời ở đây là 256, không phải 0. Tôi hiểu 8 bit chỉ có thể giữ 255 nhưng chữ “0” xuất phát từ đâu? chỉ không nhận được nó.)

Như bạn nói, 8 bit có thể đi lên đến 255. Sau đó nó tràn và 8 bit thấp nhất là 0. Vì vậy, kết quả là zero và các bit zero là bộ.

+0

Cảm ơn bạn rất nhiều! Não của tôi đang ngừng hoạt động khi cố gắng tìm ra điều này nhưng câu trả lời của bạn có ý nghĩa hơn rất nhiều. Tôi sẽ cần phải nghỉ ngơi và xử lý/thực hành hơn thế nữa. Cảm ơn một lần nữa! – rose

1

Một hướng dẫn tuyệt vời khác: Understanding Carry vs. Overflow conditions/flags. Nó có một số ví dụ từng bước tốt đẹp với các số 4 bit giúp bạn dễ dàng giữ toàn bộ điều trong đầu. Nó cũng giải thích rằng unsigned carry là những gì bạn đang kiểm tra khi giải thích các bit như unsigned, trong khi overflow sign là những gì bạn đang kiểm tra khi giải thích các bit như đã ký.


Dựa trên nhận xét OP của:

Liệu đó có nghĩa là cờ zero đang thực sự bật khi giá trị của các bit 8 đáng kể nhất là 0, và không chỉ là "khi một hoạt động sản xuất 0 "

Điều quan trọng bạn cần nhớ là đây là chiều rộng cố định số học nguyên. Trong thanh ghi 8bit, 0xFF + 1 thực sự tạo ra 0.

Trong thuật ngữ toán học, đây là modular arithmetic, với mô đun 2 cho phép toán 8 bit.

Vì vậy, có, ZF được đặt theo dst = (dst+src) % 0x100.

Nó được thiết kế theo cách này bởi vì thông thường bạn chỉ muốn biết đăng ký bằng không, cho dù bạn đang đếm ngược về không với inc trên sổ đăng ký bắt đầu âm, hoặc bạn đếm ngược về 0 đăng ký bắt đầu tích cực.

Bạn vẫn có thể kiểm tra CF==0ZF==1 để phát hiện trường hợp khi bạn có số không bằng không. Nếu ZF chỉ được đặt khi dstCF đều bằng không, bạn thường cần một hướng dẫn khác để chỉ kiểm tra thanh ghi kết quả.


Có CF và ZF bình độc lập mà các mã trạng unsigned sau một cmp hoặc sub công việc như thế này:

JA  Jump if above (CF=0 and ZF=0). 
JAE  Jump if above or equal (CF=0). 
JB  Jump if below (CF=1). 
JBE  Jump if below or equal (CF=1 or ZF=1). 

JC  Jump if carry (CF=1). 

JE  Jump if equal (ZF=1). 

Tôi nghĩ nếu ZF chỉ có thể được thiết lập khi không có ở đó một mang theo, bạn không thể nói sự khác biệt giữa Trên và Trên hoặc Bình đẳng. Vì vậy, đó có lẽ là lý do cụ thể nhất cho quyết định thiết kế để không phải được thực hiện theo cách đoán đầu tiên của bạn.

Dưới đây là một trong những điều kiện ký kết so sánh:

JLE  Jump if less or equal (ZF=1 or SF ≠ OF). 

Các bộ đầy đủ các điều kiện là trong hướng dẫn tham khảo insn bộ của Intel (liên kết trong thẻ wiki), dưới sự jcc (nhảy nếu mã condition) hướng dẫn danh sách.