trời ơi , đoạn sau này chạy đúng rùi nhưng cái a hiển thị bị sai , biểu thức hiển thị theo a nên sai nhưng cái c lại chạy đúng , ko bít cái CCS bị gì nữa
Anh sẽ giải thích cho em hiểu tại sao a hiển thị sai, c ra đúng nhé:
Khi mà em khai báo
tham số tham trị (arguments referenced by values) và biến cục bộ (
local variables) cho một hàm trong chương trình C, giá trị của tham số và các biến sẽ được ghi vào các thanh ghi của vi xử lý khi chương trình vừa nhảy vào hàm (8051 có 8 thanh ghi nhớ k? MSP430 cũng vậy). Khi em debug và watch một biến, nhiệm vụ của debugger sẽ là lấy giá trị tại
địa chỉ trên vi xử lý của biến mà compiler biên dịch từ đầu (xem address của biến
a kìa, register mấy đó thấy k?) lên hiển thị trên ô watch. Cho nên giá trị của
a ở đây sai là vì sau khi step over câu lệnh tính
c, chương trình hợp ngữ đã mượn
thanh ghi chứa a để tính toán các giá trị | & << nên giá trị trong đó bị đổi. Khi debug thì mình chỉ thấy giá trị này còn giá trị gốc thì mất tiêu rồi.
Biểu thức nó không ghi address ở đâu nghĩa là nó tính dựa vào giá trị truyền lên từ debugger thui cho nên nó đúng theo giá trị watch được của
a.
Khai báo các biến a,b,c là toàn cục thì sẽ thấy được giá trị của tụi nó khi debug. Nhưng viết chương trình hiệu quả thì càng hạn chế biến toàn cục càng tốt, vì khó quản lý, tốn bộ nhớ, chậm.
Còn gì chưa hiểu thì hỏi lại nhé.
Túm lại trả lời cho câu hỏi của thread này: chả ai sai cả, chỉ là
hienqsb chưa biết cách làm việc của tụi nó thui.