2009-04-27 52 views
23

Nó được biết rằng CF chỉ ra thực hiện unsigned và OF cho biết tràn đã ký. Vì vậy, làm thế nào để một chương trình lắp ráp phân biệt giữa dữ liệu unsigned và ký vì nó chỉ là một chuỗi các bit? (Thông qua bộ nhớ bổ sung lưu trữ cho thông tin loại, hoặc thông qua thông tin vị trí hoặc khác?) Và có thể hai lá cờ được sử dụng thay thế cho nhau?về lắp ráp cờ CF (Carry) và OF (tràn)

Trả lời

32

Sự khác biệt nằm trong hướng dẫn được sử dụng để thao tác dữ liệu, không phải dữ liệu. Các máy tính hiện đại (kể từ khoảng năm 1970) sử dụng một đại diện của dữ liệu số nguyên được gọi là hai bổ sung trong đó phép cộng và phép trừ hoạt động giống nhau trên cả hai số đã ký và chưa ký.

  • Sự khác biệt về đại diện là việc giải thích cho các bit quan trọng nhất (còn gọi là dấu chút). Đối với các số không dấu, bit đó có nghĩa là một số dương rất lớn; đối với các số đã ký có nghĩa là một số âm rất lớn (số âm với giá trị tuyệt đối lớn).

  • Hướng dẫn khác nhau có thể sử dụng các cách diễn giải khác nhau của cùng một bit. Ví dụ, hầu hết các máy lớn đều có các lệnh nhân và ký. Các máy có lệnh 'đặt ít hơn' có thể có cả hương vị đã ký và không dấu.

  • OF OF (cờ tràn) cho biết liệu thẻ chuyển có lật dấu hiệu của bit quan trọng nhất trong kết quả sao cho nó khác với bit quan trọng nhất của đối số. Nếu các số được hiểu là không được ký, cờ tràn không liên quan, nhưng nếu chúng được hiểu là đã ký, thì có nghĩa là, ví dụ: hai số dương lớn được thêm vào và kết quả là số âm.

  • CF (cờ mang) cho biết liệu một bit được thực hiện hoàn toàn từ (ví dụ: bit 33 hoặc bit 65). Nếu các số được hiểu là không dấu, cờ mang theo nghĩa là tràn bổ sung và kết quả quá lớn để vừa với từ máy. Cờ tràn không liên quan.

Câu trả lời cho câu hỏi của bạn là mã lắp ráp có nhiều cách phân biệt ký từ dữ liệu unsigned:

  • Nó có thể chọn một trong hai CF hoặc HÀNH để làm ký kết hoặc so sánh unsigned.
  • Có thể chọn ký hoặc không được ký nhân và chia hướng dẫn.
  • Nó có thể chọn một sự thay đổi có chữ ký hoặc chưa ký (bản sao có chữ ký bit cao; thay đổi không dấu trong số không).
+0

sao cho 'cả hai cách là có thể', nhưng mã lắp ráp chọn cái có ý nghĩa nhất (cái có ý nghĩa)? – Pwn

+7

Đối với các số đã ký, bit quan trọng nhất KHÔNG có nghĩa là "âm lớn", chỉ "âm". – MarcH

+0

Chúng ta nên lưu ý rằng CF cũng có thể được sử dụng như [Mượn bit] (http://en.wikipedia.org/wiki/Carry_flag) – Tony

-3

Tôi tin rằng nó dựa trên hoạt động bạn đang sử dụng để xác định cờ sẽ sử dụng. Ví dụ. đã ký và không thêm dấu. Vì vậy, tôi cho rằng bạn có thể chơi với bộ nhớ với bất kỳ lệnh nào bạn muốn.

1

Thông thường các chương trình lắp ráp không có thông tin đặc biệt xung quanh với các biến để cho biết liệu chúng có được ký hoặc không ký. Đó là công việc của người lập trình để biết khi nào nên kiểm tra cờ nào và khi nào nên sử dụng điều kiện nào (tức là sử dụng JA thay vì JG).

Vì vậy, bạn cần biết loại biến mà bạn sắp làm việc để bạn biết nên sử dụng các lệnh nào. Đây là lý do tại sao hầu hết các ngôn ngữ lập trình đưa ra cảnh báo khi các lập trình viên sử dụng các loại đã ký/unsigned thay thế (nghĩa là không có diễn viên rõ ràng), vì điều này có thể được thực hiện trong phần cứng nhưng có thể mang lại kết quả không mong muốn.

4

Không. Các cờ chỉ trở thành thiết lập bất cứ khi nào điều kiện xảy ra. Các lập trình viên được cho là biết những loại ints anh ta làm việc với và từ đó biết lá cờ để kiểm tra xem anh ta quan tâm.

5

Có các mã opcodes khác nhau để xử lý dữ liệu đã ký và chưa ký. Nếu một chương trình muốn so sánh hai số nguyên ký, nó sử dụng các opcodes jl, jle, jg, và jge, nơi l và g đứng cho l ess và g reater tương ứng. Nếu một chương trình muốn so sánh hai số nguyên unsigned, nó sử dụng các opcodes jb, jbe, ja, và jae, nơi a và b đứng cho một Boveb elow tương ứng. E là viết tắt của 'hoặc bằng' trong mọi trường hợp. Các opcodes này được sử dụng cho phân nhánh dựa trên so sánh.

Tương tự, cũng có các hướng dẫn setCC, đặt byte thành 0 hoặc 1 tùy thuộc vào so sánh. Các chức năng này giống hệt nhau - có setl, setle, setg, setge, setb, setbe, seta, setae và các loại khác.

Các mã opcodes đã ký kiểm tra cờ ZF, OF và SF. Các opcodes không dấu kiểm tra cờ ZF, CF và SF. Xem phần Hướng dẫn tham khảo của Trình lập trình 80386 trên các hướng dẫn JCC và các hướng dẫn setCC để kiểm tra các điều kiện chính xác.

3

Không có cách nào để yêu cầu CPU kiểm tra và trả về loại byte/từ/dài.

0xFF có thể chứa "255" hoặc "-1" tất cả phụ thuộc vào loại byte mà chương trình của bạn cho biết.

Các cấu trúc như "loại", "ký hiệu" vv chỉ tồn tại ở các ngôn ngữ cấp cao hơn như Java chứ không phải ở cấp CPU. Cuối cùng, mọi thứ đều là một byte cho CPU tùy thuộc vào chương trình của chúng tôi để tổ chức và biết cách trình bày và thao tác các giá trị này ...

Cờ CPU được tìm thấy trong trạng thái không thực thi bất kỳ mô hình nào tùy thuộc vào mã của bạn để kiểm tra và phản ứng tương ứng.

Trên CPU Intel, thanh ghi MMX và FPU thực sự chiếm cùng một thanh ghi. Do đó, không thể trộn lẫn các lệnh loại FPU và MMX cùng một lúc, bởi vì các giá trị từ một thao tác này sẽ làm đổ rác cho một hoạt động khác. Các chương trình cần hoặc thường hoàn thành các hành động của chúng trong một chế độ ví dụ như phát hành các lệnh FPU và sau đó có thể khởi động MMX nhưng không bao giờ cả hai cùng một lúc.

16

Không được cố gắng để đục mã vạch. Đó là điều không thể. Thay vào đó, chỉ cố gắng nhận ra sự thật: không có dấu hiệu. Sau đó, bạn sẽ thấy nó không phải là loại ký hiệu phân biệt, nó chỉ là chính bạn.