2011-08-31 66 views
11

Tôi đã chơi với lắp ráp một lúc và nhìn vào một số mã. trong đó AL được đặt đầu tiên là 0x84 thì cmp AL, 0x30 được sử dụng. Hướng dẫn này sau đó kích hoạt cờ tràn.Tại sao cmp 0x84,0x30 kích hoạt cờ tràn?

Từ những gì tôi đọc CMP là nghĩa vụ trừ số thứ hai từ đầu tiên sau đó đặt cờ, trong trường hợp đó nó phải là 0x84-0x30 kết quả là 0x54 và không có tràn.

Trả lời

18

Chỉ có không tràn nếu bạn giải thích những giá trị như số unsigned - nếu bạn giải thích của bạn 0x84 như đã ký kết, có chắc chắn tràn:

  1. 0x84 hiểu như là một giá trị 8-bit ký là -124
  2. 0x30 hiểu như là một giá trị 8-bit ký là 48
  3. -124 - 48 = -172

-172 nằm ngoài phạm vi của một giá trị 8-bit đã ký (-128 đến 127) và t hat là lý do tại sao cờ OF được đặt. Bạn nên kiểm tra CF cho biết tràn chưa được ký.

Từ Intel 64 and IA-32 Architectures Software Developer’s Manual, Tập 2 cho CMP:

Việc so sánh được thực hiện bằng cách trừ các toán hạng thứ hai từ toán hạng đầu tiên và sau đó thiết lập các cờ trạng thái theo cách tương tự như hướng dẫn SUB.

và cho SUB:

Lệnh SUB thực hiện nguyên trừ. Nó đánh giá kết quả cho cả toán hạng số nguyên và chưa ký và đặt cờ OF và CF để chỉ ra một tràn trong kết quả đã ký hoặc chưa ký, tương ứng. Cờ SF biểu thị dấu hiệu của kết quả đã ký.

+0

Carl là chính xác. Cờ tràn x86 thực sự có nghĩa là * tràn đăng nhập *. – wallyk

+0

câu trả lời rất hay. – phoxis

+0

cảm ơn rất nhiều câu trả lời của bạn! – Maciek

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