ก่อนที่จะเริ่มขอ บอกว่า () วงเล็บใน code นั้น สำคัญนะครับ
มีหรือไม่มี แตกต่างอย่างมากๆๆๆๆ
// Code ที่ผิดนะครับบ
ADR Memonic OP-Code
2000 LD HL,2040 21 40 20
2003 LD A,(2041) 31 41 20
2006 SUB A,HL 96
2007 INC HL 23
2008 INC HL 23
2009 LD HL,A 77
2010 RST 10H DF
ผิดที่ 2000 Load HL,2040
แปลว่าเก็บค่า 2040 เก็บในรีจีสเตอร์ HL
เพราะฉะนั้นรีจีสเตอร์ HL = 2040
ผิดที่ 2006 SUB A,HL
แปลว่า ? มันไม่มีความหมายยย
งั้นลองดูที่ Opt-code 96 มันคือ คำสั่ง SUB (HL) และจะอธิบายคือ
ถ้า address ที่ 2041 = 80 และรีจีสเตอร์ HL = 2041 (อย่าสับสนกับข้อที่แล้ว เพราะมันใช้คนละจุดประสงค์กัน)
SUB (HL) พิมเป๊ะๆ เลยนะ หมายถึง ลบค่าในรีจีสเตอร์ A ลงตามค่าใน address ที่รีจีสเตอร์ HL เก็บไว้
ผลที่ได้คือ A = A - 80
ผิดที่ 2007-2008
INC HL หมายถึง
LD A,HL แล้วก้อ SUB 1 แล้วก้อ LD HL,A
หมายถึง (ภาษา C)
A = HL;
A--;
HL = A;
อันนี้เข้าใจป่ะ เพราะงั้น A เลยถูกทับค่าไปด้วย
คำถาม แล้วทำไมผมถึงใช้ H แทนที่ HL
นั่นเพราะว่า SUB เป็น Operator 8 bit HL เป็น 16
ผมได้ใช้รีจีสเตอร์ 8bit หรือ รีจีสเตอร์ H
เพราะค่าที่ใส่ไม่เกิน 8 bit อยู่แล้วจะได้ง่ายต่อการ ลบ(SUB)นะครับ
// Code ที่ผิดนะครับบ
ADR Memonic OP-Code
2000 LD HL,2040 21 40 20
2003 LD A,HL 7E
2004 INC HL 23
2005 SUB A,HL 96
2006 INC HL 23
2007 LD HL,A 77
2008 RST 10H DF
ผิดที่ 2000 เหมือน Code ที่แล้วเลย
ผิดที่ 2004, 2006 INC HL เหมือน Code ที่แล้ว
ผิดที่ 2005 SUB A,HL เหมือน Code ด้านบน
บรรทัดที่ 2007 ไม่ผิดมาก
ปล. ถ้าผิดที่ใดขออภัยด้วย (ท้วงด้วยนะ) มึนกะ senior project จริงๆ เหอๆ
ปล. ถ้าสงสัยก้อถามนะ และก้อถ้าผมอธิบายไม่รู้เรื่องก้อ ถาม อาจารย์ที่สอนด้วยอีกทีนึงนะครับ