Trích:
Nguyên văn bởi namqn
Không đồng ý với bạn, vì bạn nêu lên một chi tiết không hợp lý ở post trước đó, bây giờ lại bắt sang một chi tiết (được cho là) không hợp lý khác, mà không thể hiện được cái bất hợp lý mà bạn đã nêu ở post trước.
Trong cấu trúc của chương trình mẫu, vòng lặp chính là vòng lặp giữa nhãn loop và lệnh goto loop. Nếu muốn biến nó thành while (true) {} thì không cần viết lệnh gì vào vòng lặp đó là xong. Do vậy, lệnh goto $ phía trước dẫn hướng end vẫn là thừa. Hơn nữa, viết theo kiểu loop goto loop hay goto $ đều dịch ra cùng kết quả.
Cấu trúc của chương trình mẫu là ổn, đảm bảo không có chuyện "copy nguyên về, thay cái phần nội dung trong main và chương trình con cho phù hợp với bài toán của mình rồi biên dịch rồi chạy rồi thấy nó chạy loạn lên". Đề nghị bạn post những chương trình kiểu đó lên để minh họa cho lý luận của bạn.
Về việc lệnh goto $ nằm trước dẫn hướng end: nó thừa nhưng chẳng ảnh hưởng gì đến chương trình ứng dụng (được viết đúng quy tắc) nên việc loại bỏ nó hay không vốn không phải là vấn đề.
Thân,
|
Theo mẫu:
Code:
;======================================
processor p16f84a
include <p16f84a.inc>
__config _cp_off & _wdt_off & _xt_osc
;======================================
org 0x0c
count0 res 1
count1 res 1
count2 res 1
;======================================
org 0x00
goto main
org 0x05
;-------------------------------------------------
main
banksel trisa
clrf trisa
movlw 0xff
movwf trisb
banksel porta
clrf porta
movlw 0x09
movwf count0
clrw
btfsc portb, 0
iorlw b'00001'
btfsc portb, 1
iorlw b'00010'
btfsc portb, 2
iorlw b'00100'
btfsc portb, 3
iorlw b'01000'
btfsc portb, 4
iorlw b'10000'
addwf count0, 1
delay0 call delay100m
decfsz count0, f
goto delay0
bsf porta, 0
;-------------------------------------------------
delay100m
movlw 0x4e
movwf count2
delay2
nop
nop
call delay1278
decfsz count2, f
goto delay2
movlw 0xf0
movwf count2
delay3
nop
decfsz count2, f
goto delay3
return
;-------------------------------------------------
delay1278
movlw 0xff
movwf count1
delay1
nop
nop
decfsz count1, f
goto delay1
return
;-------------------------------------------------
goto $
end
;======================================
thì chạy sai
nhưng chuyển các chương trình con xuống giữa 2 dòng goto $ và end thì chạy đúng
bây giờ quay trở lại chương trình mẫu: để như vậy đương nhiên vẫn chạy đúng chuyển các chương trình con xuống giữa 2 dòng goto $ và end vẫn chạy đúng
lẽ đương nhiên quẳng các chương trình con ở đâu mà chẳng được, thế nhưng với tiêu chí "học pic trong một ngày" tức là dành cho người mới học thì mẫu càng tổng quát càng tốt đúng không, vậy thì tại sao lại không chỉnh sửa một chút (chẳng sai gì và chẳng thiệt hại gì) để chương trình mẫu có thể tránh thêm một lỗi có thể gặp trong thực tế.
To Namqn: Từ đầu tôi vẫn nhất quán là chuyển chương trình con xuống thôi. còn những cái khác có thể là do cách diễn đạt làm bạn hiểu sai. Thế còn goto $ hay loop goto loop ai chả biết bản chất nó là một, ý tôi muốn nói ở đây là tôi thì thích dùng goto $ để làm vòng lặp while(TRUE); còn có thể ng khác lại thích dùng loop goto loop để làm vòng lặp while(TRUE);