PDA

View Full Version : Làm sao để viết chương trình MPASM đúng


phamthanhkhuyen
07-07-2007, 11:04 AM
to namqn
tôi có một vài điều không hiểu xin nhờ bạn chỉ giúp
giả sử tôi có một doạn chương trình:



;1. CAU HINH THIET BI :
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _HS_OSC &_WDT_OFF&_LVP_OFF

start
;khai báo ban đầu
call INI_1
call INI_2
main
call chtr_call1
call chtr_call2
call chtr_call3
goto main
;các chươn trình con
INI_1
...
return
INI_2
...
return


chtr_call1
...
;nếu thỏa điều kiện 1
goto chtr_goto1

;nếu thỏa điều kiện 2
goto chtr_goto2

;nếu thỏa điều kiện 3
goto chtr_goto3

;nếu thỏa điều kiện 4
goto chtr_goto4
...
exit_chtr_call1
return



chtr_goto1
call of_goto
...
call table1
...
goto exit_chtr_call1


chtr_goto2
call of_goto
...
call table2
...
goto exit_chtr_call1


chtr_goto3
...
goto exit_chtr_call1

chtr_goto4
...
goto exit_chtr_call1



chtr_call2
...
return


chtr_call3
...
return

of_goto
...
return


table1
retlw ...
retlw ...

table2
retlw ...
retlw ...

end

phamthanhkhuyen
07-07-2007, 11:26 AM
khi tôi viết xong đến chương trình con chtr_goto2
lúc đó các chương trình of_goto , table1 , table2 đã viết xong
Khi kiểm tra thực hành thì nó chạy

chtr_goto2
call of_goto
...
call table2
...
goto exit_chtr_call1






chtr_goto3
goto exit_chtr_call1

chtr_goto4
goto exit_chtr_call1




nhưng khi viết xong đến chtr_goto3
khi kiểm tra thì nó chỉ chạy tới chtr_goto2

nhưng khi tôi xóa nội dung của chtr_goto2 thì
khi kiểm tra thì nó chỉ chạy tới chtr_goto3



xem trong File *.list thì thấy toàn bộ chương trình chưa hết PAGE0

Jerry
07-07-2007, 04:42 PM
Thử phân tích hàm main của bạn thì sẽ rõ:

Main->chtr_call1

Giả sử điều kiện 1 thoả mãn thì sẽ chạy tiếp:

Main->chtr_call1->chtr_goto1->[gọi hàm of_goto,table1 rồi trở lại
] -> exit_chtr_call1

Cái exit_chtr_call1 sẽ làm cho chương trình chạy tiếp lệnh call chtr_call2
(dòng thứ 2 của hàm main)

Do vậy đương nhiên nó sẽ không chạy đến chtr_goto2 hay chtr_goto3.

Cũng theo logic phân tích như vậy nếu như chương trình chạy xong chtr_goto2 thì sẽ không nhảy tới chtr_goto3, trừ khi bạn xoá nội dung của chtr_goto2 đi thì nó mới chạy chtr_goto3.

Cuối cùng thì mình không hiểu ý bạn muốn chương trình phải chạy như thế nào mới đúng vì bạn hỏi không rõ ràng.

namqn
07-07-2007, 09:51 PM
Gửi bạn phamthanhkhuyen:

Câu hỏi 1 của bạn chưa rõ ràng lắm. Với chương trình loại này, trước hết bạn cho biết bạn muốn làm gì, và vẽ lưu đồ giải thuật ra. Dựa vào lưu đồ giải thuật đó, bạn hiện thực các cấu trúc điều khiển đó. Như vậy bạn sẽ ít gặp sai sót hơn.

Với một chương trình tương đối phức tạp như bạn đang viết, rất khó cho người đọc chỉ nhìn vào code mà hiểu được thuật toán. Điểm quan trọng là thuật toán của bạn rõ ràng. Nếu bạn gặp khó khăn trong việc chuyển thuật toán thành các lệnh thì chúng tôi có thể giúp, còn nếu bạn không cho biết thuật toán thì quả thực rất khó giúp bạn.

Thân,

phamthanhkhuyen
08-07-2007, 01:57 AM
to namqn
đúng là thiếu sót, thuật toán sẽ đưa lên sau
to Jerry
đúng ra tôi hơi sơ ý vì muốn cô động vấn đề nên thành ra khó hiểu đúng ra còn 1 chương trình con Chtr_call0 đây là chương trình đưa ra điều kiện để
Chtr_call1 so sánh và nó chỉ chạy cho 1 điều kiện được thỏa

Cái tôi muốn các bạn giải thích là vị trí của các đoạn chương trình khi ở vị trí khác nhau thì chương trình lạl không chạy đúng ví dụ
Bây giờ giả sử chương trình đang chạy tốt khi tôi hoán đổi vị trí 2 chương trình con thì nó lạl chạy sai đây là doạn chương trình đã bị hoán đổi


chtr_goto3
goto exit_chtr_call1

chtr_goto2
call of_goto
...
call table2
...
goto exit_chtr_call1


chtr_goto4
goto exit_chtr_call1