Quote from: ROM on October 01, 2013, 04:49:57 PMจะว่านับก็ได้ครับ แต่เวลาใน asm จริงๆ มันไม่เหมือนกันน่ะครับ ผมอธิบายตามที่ผมเข้าใจก่อนน่ะQuote from: s4m3l0 on October 01, 2013, 04:32:52 PMผมหมายถึง Computer มากกว่านะครับ อาจรวมไปถึง embedded linux ด้วยครับ
GNU/Linux ไม่ได้มีแต่ใน PC น่ะครับ(แอบเศร้า)
ขออภัยอาจจะใช้คำไม่ถูก อย่าเศร้าน่า
แต่ขอแยกกันกับ MCU เพราะเล็กกว่า ที่กล่าวอาจจะอิงกับ 8 bit ด้วยซ้ำนะครับQuote from: s4m3l0 on October 01, 2013, 04:34:50 PMQuote from: ROM on October 01, 2013, 04:30:36 PMคำตอบอยู่ใน link แรกแล้วครับ = =" หรือว่าไม่ใช่หว่าQuoteผมว่ามันไม่จำเป็นน่ะครับ มันเปลืองทรพยากร
USING NOP IN C...
http://www.keil.com/support/docs/2315.htm
แล้ว ต้องใช้ _nop_ (); เท่าไหร่ครับ ถึงจะ delay ได้นานๆ
อย่างสัก 10 millisecond ครับ ที่เขาเขียนนับตัวแปรก็ด้วยเรื่องนี้ครับ
เพราะ _nop_(); มัน delay ได้สั้นมาก
ลองดู
http://www.keil.com/support/man/docs/is51/is51_nop.htm
มันใช้ delay แค่ 1 cycle ของ MCU เองนะCode Select
#include <intrins.h>
void DelayMS(unsigned char ms)
{
unsigned long us = 1000*ms;
while (us--)
{
_nop_();
}
}
มันก็มี ตัวนับ us อยู่นะครับ MCU ก็นับตัวแปรเล่นเหมือนกัน ก็ใช้ resource เหมือนกัน
ผมไม่เข้าใจ ว่าท่านงงอะไร ?
จากโค้ดของ NOP
ใน loop while
เซ็ตค่า us แล้วจะมีการเช็ค us ว่าเป็น 0 รึเปล่า แล้วทำการลดค่า us โดย 1 ประมาณ us-1 แล้วทำการ NOP แล้วมาเช็คใหม่
ใน asm ก็ประมาณ 4 instuction(เซ็ต us ผมไม่นับเพราะอยู่นอกลูป)
ถ้าเป้น for loop ดังเดิม
- ตัวแปรเพิ่ม
ให้ x=0,y=0 ประมาณ 2 instuction(นับแต่ y ก็ 1 instuction เพราะมีการกำหนดใหม่ทุกครั้ง (mov))
เช็ค x<n และ y<150 ประมาณ 2 instuction + jump อีก 2 instuction
x++,y++ ประมาณ 2 instuction
รวม 1+2+2+2 = 7
ค่าต่างๆ เป็นค่าประมาณน่ะครับ
ส่วนที่มันเหมือนกันนี่ไปไม่ถูกเลย lolz
http://stackoverflow.com/questions/17896714/why-would-introducing-useless-mov-instructions-speed-up-a-tight-loop-in-x86-64-a
เจอลิงค์ที่อธิบายที่ดีกว่า http://www.win.tue.nl/~aeb/comp/8051/set8051.html#51nop เผื่อมีคนมาอ่าน
เข้าว่าโดยพื้นฐาน การทำงานน่าจะเหมือนกันน่ะครับ