پاسخ : مشکل در با ضرب در mplab ide
درسته حق با شماست
بهینه ساز کامپایلر خودش استفاده شدن یا عدم استفاده از متغییر رو مشخص مینه و اگر در طول برنامه جایی استفاده نشده بود شامل بهینه سازی میشه و اگر جایی در برنامه عملیاتی روی اون انجام شده بود واقعا عملیات ضرب رو برای میکرو ترجمه می کنه (خواه سخت افزاری خواه نرم افزاری)
مثال
برنامه سطح بالا (با بهینه سازی کد):
[code=asm]
program aaa
Dim a,b as byte
dim cc as word
main:
a=100
b=200
cc=a*b
end
[/code]
اگر به کد اسمبلی تولید شده نگاه کنیم:
[code=asm]
_main:
;aaa.mbas,6 :: main:
;aaa.mbas,7 :: a=100
MOVLW 100
MOVWF _a+0
;aaa.mbas,8 :: b=200
MOVLW 200
MOVWF _b+0
;aaa.mbas,9 :: cc=a*b
MOVLW 32
MOVWF _cc+0
MOVLW 78
MOVWF _cc+1
GOTO $+0
; end of _main
[/code]
همونطور که توی کد می بینیم اصلا اثری از ضرب نیست و کدی که ترجمه شده جایگذاری عدد 78 توی هشت بیت بالای جواب و جایگذاری عدد 32 توی 8 بیت پایین جوابه که حاصل 78*256+32=20000 و کلا ضرب رو کامپایلر انجام داده نه میکرو
حالا کد رو کمی تغییر می دیم تا مقادیر a و b از قبل مشخص نباشه:
کد سطح بالای برنامه(بدون بهینه سازی)
[code=asm]program aaa
Dim a,b as byte
dim cc as word
main:
cc=a*b
end[/code]
اگه به کد اسمبلی ولید شده نگاه کنیم:
[code=asm]_main:
;aaa.mbas,4 :: main:
;aaa.mbas,5 :: cc=a*b
MOVF _a+0, 0
MOVWF R0+0
CLRF R0+1
MOVF _b+0, 0
MOVWF R4+0
CLRF R4+1
CALL _Mul_16x16_U+0
MOVF R0+0, 0
MOVWF _cc+0
MOVF R0+1, 0
MOVWF _cc+1
GOTO $+0
; end of _main[/code]
همونطور که معلومه چون مقادیر اولیه a و b مشخص نیست برنامه کد رو بهینه سازی نکرده و واقعا عملیات ضرب رو به اسمبلی ترجمه کرده و تابع _Mul_16x16 فراخوانی شده (خود این تابع حدود 30 خط اسمبلی هست)
در هر صورت (به نظر من) ضرب واقعی بدون سخت افزار ضرب توی 4 سیکل امکان نداره(8*8 بیتی) {اگه شد من سیبیلمو میزنم :mrgreen
شاید اگر متغییر هامون مشخص باشن کامپایلر بتونه این کارو بکنه. ولی وقتی متغییرامون مشخص نیستش چطوری میخاد همچین کاری کنه؟؟ مثلا داریم یه مقداری از ADC میخونیم و در 200 مثلا ضرب میکنیم. اینجوری دیگه کامپایلر سی یا هر کامپایلر دیگه ای نمیتونن جواب یه ضرب از پیش تعیین شدر نشون بدن. پس ضرب انجام میشه با یه دستور خاصی.من فکر میکنم با همین گیتا میشه انجام دادش.ولی چطوری نمیدانم
بهینه ساز کامپایلر خودش استفاده شدن یا عدم استفاده از متغییر رو مشخص مینه و اگر در طول برنامه جایی استفاده نشده بود شامل بهینه سازی میشه و اگر جایی در برنامه عملیاتی روی اون انجام شده بود واقعا عملیات ضرب رو برای میکرو ترجمه می کنه (خواه سخت افزاری خواه نرم افزاری)
مثال
برنامه سطح بالا (با بهینه سازی کد):
[code=asm]
program aaa
Dim a,b as byte
dim cc as word
main:
a=100
b=200
cc=a*b
end
[/code]
اگر به کد اسمبلی تولید شده نگاه کنیم:
[code=asm]
_main:
;aaa.mbas,6 :: main:
;aaa.mbas,7 :: a=100
MOVLW 100
MOVWF _a+0
;aaa.mbas,8 :: b=200
MOVLW 200
MOVWF _b+0
;aaa.mbas,9 :: cc=a*b
MOVLW 32
MOVWF _cc+0
MOVLW 78
MOVWF _cc+1
GOTO $+0
; end of _main
[/code]
همونطور که توی کد می بینیم اصلا اثری از ضرب نیست و کدی که ترجمه شده جایگذاری عدد 78 توی هشت بیت بالای جواب و جایگذاری عدد 32 توی 8 بیت پایین جوابه که حاصل 78*256+32=20000 و کلا ضرب رو کامپایلر انجام داده نه میکرو
حالا کد رو کمی تغییر می دیم تا مقادیر a و b از قبل مشخص نباشه:
کد سطح بالای برنامه(بدون بهینه سازی)
[code=asm]program aaa
Dim a,b as byte
dim cc as word
main:
cc=a*b
end[/code]
اگه به کد اسمبلی ولید شده نگاه کنیم:
[code=asm]_main:
;aaa.mbas,4 :: main:
;aaa.mbas,5 :: cc=a*b
MOVF _a+0, 0
MOVWF R0+0
CLRF R0+1
MOVF _b+0, 0
MOVWF R4+0
CLRF R4+1
CALL _Mul_16x16_U+0
MOVF R0+0, 0
MOVWF _cc+0
MOVF R0+1, 0
MOVWF _cc+1
GOTO $+0
; end of _main[/code]
همونطور که معلومه چون مقادیر اولیه a و b مشخص نیست برنامه کد رو بهینه سازی نکرده و واقعا عملیات ضرب رو به اسمبلی ترجمه کرده و تابع _Mul_16x16 فراخوانی شده (خود این تابع حدود 30 خط اسمبلی هست)
در هر صورت (به نظر من) ضرب واقعی بدون سخت افزار ضرب توی 4 سیکل امکان نداره(8*8 بیتی) {اگه شد من سیبیلمو میزنم :mrgreen

دیدگاه