Các bạn học 8051 có nghe đề cập đến thanh ghi PC - Program Counter, được biết nó là thanh ghi 16 bit, tuy nhiên nó nằm ở đâu, cách bắt được nó thế nào! Đó là một câu hỏi thật bất ngờ mà chú em tôi mới học 8051 làm tôi ngớ cả người! hihi!
Thông báo
Collapse
No announcement yet.
Một câu hỏi vui về thanh ghi PC!
Collapse
X
-
Bắt thanh ghi PC ư,Thật ra rất đơn giản có phải chỉ cần các lệnh jump là ta đã thay đổi giá trị của PC ư,hihi.
Còn mà muốn manual thì không có lợi,PC hoạt động tuần tự để chạy chương trình.Người ta tạo PC là để đếm vị trí hiện tại của lệnh trong bộ nhớ thôi.
Sông dài, Thuyền lớn, Biển rộng bao la.
Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.
-
Làm sao có được giá trị của nó cơ, lấy được giá trị của nó, lưu vào vị trí khác chằng hạn!
Điều này có lợi khi chúng ta làm các ứng dụng mang tính thực hành, chạy chương trình 2 chế độ, có một hệ điều hành điều khiển hoạt động của chương trình người sử dụng! Lưu được nó xong biết đường mà trở về chứ!Last edited by natra2k2; 09-06-2006, 17:30.
Comment
-
đọc datasheet phần SFR sẽ thấy nó lưu ở đâu.
Còn lấy giá trị của PC ngày tôi mới học ASM x86 cũng đã biết cách thay đổi CS:IP rồi. Hệ x86 không cho phép bất cứ lệnh nào thay đổi trực tiếp vào CS:IP còn 8051 thì có lệnh movc, cách người ta hay dùng và bất chính tắc là sử dụng lệnh call để lưu PC vào stack, lệnh POP để lấy ra sử dụng lệnh RET để thực thi, lệnh PUSH để gán giá trị mới.
Comment
-
Có thể làm như sau:
Label có thể nằm trong bất cứ address nào trong khoảng địa chỉ cho phép của MCU. Sau lệnh jmp @A+dptr giá trị của DPTR là giá trị của PC. Trong trường hợp muốn biết giá trị của PC trước jmp instruction thì thay bằng dòng này:Code:mov dptr,#Label ; jmp @A+dptr ;
Nhưng đây sẽ là infinite Loop.Code:mov dptr,#$ ; jmp @A+dptr ;
Nếu muốn lưu giá trị của PC vào register thì làm như sau:
Sau jmp instruction giá trị của PC sế ở trong R0 và R1.Code:mov dptr,#Label ; mov R0,DPL ; mov R1,DPH ; jmp @A+dptr ;
Hy vọng là giải đáp được thắc mắc của bạn natra2k2.
Comment
-
Em muốn dùng lệnh call thì sao, để tận dụng khi nó gặp lênh ret sẽ trở về lệnh ngay sau lệnh call! Với lại không ảnh hưởng đến chương trình đang chạy, chỉ cần lấy giá trị của PC thôi!
Em vừa nghĩ một cách như sau:
Theo lý thuyết thì khi gặp lệnh call thì CPU tự động push PCL, PCH theo thứ tự, do đó em chỉ cần làm thế này
Sau lệnh call thì trong R0, R1 sẽ có được PC theo thứ tự PCH, PCL. Và nó cũng không ảnh hưởng gì đến chương trình cả, sau lệnh call đó nó vẫn trở về lệnh mov R7, #152 bình thường! Bác thelam nghĩ sao!!!Code:call Capture_PC mov R7, #152 ;<<<<<<<<<<<<< Capture_PC: pop 00 pop 01 push 01 push 00 ret
Last edited by natra2k2; 10-06-2006, 01:17.
Comment
Bài viết mới nhất
Collapse
-
bởi mylinhattChào anh em cơ khí,
Trong quá trình tư vấn đầu tư thiết bị cho xưởng, mình gặp rất nhiều câu hỏi kiểu: “Nên mua máy phay CNC cũ để tiết kiệm, chọn máy mới phổ thông cho yên tâm, hay cố gắng lên máy chất lượng cao để làm hàng khó?”. Thực tế, đây không phải câu hỏi chỉ về...-
Channel: Máy công cụ
hôm nay, 13:38 -
-
bởi torasungChào anh em,
Mình đang tìm hiểu và cấu hình một con biến tần Delta model VFD037E43A dùng cho động cơ công suất nhỏ, ứng dụng băng tải và quạt. Trước đây mình chủ yếu làm với vài dòng khác của Delta nhưng chưa dùng nhiều model này, nên muốn...-
Channel: Điện tử công nghiệp
Hôm qua, 09:13 -
-
Trả lời cho Vấn đề về tốc độ quaybởi nguyendinhvanSử dụng động cơ servor, hoặc lắp thêm một cái encoder vào động cơ bước. Encoder sẽ kiểm soát động cơ có quay hoặc đứng im.
-
Channel: Điện tử truyền hình
14-12-2025, 19:50 -
-
bởi Andrea14Chào mọi người,
Tôi muốn mô phỏng sự thay đổi các mùa bằng cách từ từ nghiêng một quả địa cầu 16 inch bằng một động cơ bước nhỏ. Một động cơ bước khác sẽ quay quả địa cầu theo thời gian thực. Hệ thống truyền động...-
Channel: Điện tử truyền hình
12-12-2025, 12:42 -

Comment