คำสั่งแอสเซมบลีพื้นฐาน LISTMAC – เปิดใช้งานการขยายมาโครในรายการ รวม – แนบไฟล์อื่น

ภาษาการเขียนโปรแกรมภาษาแอสเซมบลีจะรวมรหัสเครื่องของไมโครคอนโทรลเลอร์ไว้ด้วยเสมอ แต่ไม่ได้จำกัดอยู่เพียงชุดคำสั่งของภาษานี้ ประเด็นก็คือคุณจะต้องสามารถจัดการกระบวนการออกอากาศรายการได้ด้วยตัวเอง รายการคำสั่งทั้งหมดมีอยู่ในคำอธิบายภาษา และบางส่วนจะมีการพูดคุยโดยละเอียดที่นี่

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

คำสั่งเทียบเท่าช่วยให้คุณสามารถกำหนดชื่อให้กับตัวแปรและค่าคงที่ได้ ตอนนี้คุณสามารถกำหนดที่อยู่ให้กับตัวแปรได้ในที่เดียว และใช้ตัวระบุตัวแปรทั่วทั้งโปรแกรม จริงอยู่ที่โปรแกรมเมอร์มีหน้าที่ในการใช้ตัวระบุเป็นตัวแปรอย่างไรก็ตามหากในกระบวนการเขียนโปรแกรมจำเป็นต้องเปลี่ยนที่อยู่ของตัวแปรก็สามารถทำได้ในที่เดียวในโปรแกรมแทนที่จะผ่าน โปรแกรมทั้งหมด หาว่าตัวเลข 10 เป็นค่าคงที่ในคำสั่งนี้ ที่อยู่ของเซลล์ หรือจำนวนการซ้ำในรอบ การเปลี่ยนแปลงที่จำเป็นทั้งหมดจะดำเนินการโดยนักแปลเอง ตัวอย่างการกำหนดตัวแปรมีให้ไว้ในตัวอย่างที่แสดงในรายการ 1


รายการ 1. การกำหนดตัวแปรโดยใช้คำสั่ง Equi

ดังที่เห็นในตัวอย่างด้านบน การใช้ตัวระบุช่วยเพิ่มความเข้าใจของโปรแกรมได้อย่างมาก เนื่องจากชื่อของตัวแปรจะแสดงฟังก์ชันที่ตัวแปรนี้รับผิดชอบ

เมื่อใช้คำสั่ง Equi คุณสามารถกำหนดไม่เพียงแต่ตัวแปร แต่ยังรวมถึงค่าคงที่ด้วย ตามที่กล่าวไว้ข้างต้น ไม่ว่าตัวระบุจะถูกใช้เป็นตัวแปรหรือเป็นค่าคงที่ ขึ้นอยู่กับคำสั่งและประเภทของการกำหนดแอดเดรสที่โปรแกรมเมอร์ใช้

เมื่อกำหนดตัวระบุแล้ว จะไม่สามารถเปลี่ยนแปลงได้ในอนาคต และหากคุณพยายามกำหนดชื่อตัวระบุที่เหมือนกันทุกประการอีกครั้ง ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น

กำหนดคำสั่ง- หากคุณต้องการกำหนดหมายเลขที่แตกต่างกันให้กับตัวระบุเดียวกันในตำแหน่งที่แตกต่างกันในโปรแกรม คุณจะต้องใช้คำสั่งที่ตั้งไว้ การใช้คำสั่งนี้เหมือนกับการใช้คำสั่ง Equi โดยสิ้นเชิง ดังนั้นจึงจะไม่แสดงตัวอย่างไว้ด้วย

ค่าคงที่ที่กำหนดโดยคำสั่ง Equi สามารถใช้ได้ในคำสั่งเดียวเท่านั้น บ่อยครั้งที่จำเป็นต้องทำงานกับตารางค่าคงที่ เช่น ตารางการแปลง ตารางฟังก์ชันพื้นฐาน หรือกลุ่มอาการของรหัสแก้ไขข้อผิดพลาด ค่าคงที่ดังกล่าวไม่ได้ใช้ในขั้นตอนการแปล แต่จะถูกเก็บไว้ในหน่วยความจำโปรแกรมไมโครคอนโทรลเลอร์ ในการป้อนค่าคงที่ลงในหน่วยความจำโปรแกรมไมโครคอนโทรลเลอร์ จะใช้คำสั่ง db และ dw

คำสั่ง dbใช้เพื่อจัดเก็บค่าคงที่ไบต์เดียวในหน่วยความจำโปรแกรม ตัวอย่างของการใช้คำสั่ง db แสดงอยู่ในรายการ 2


รายการ 2 การกำหนดค่าคงที่โดยใช้คำสั่ง db

ตัวอย่างนี้ใช้รูทีนย่อยของฟังก์ชันที่แปลงเลขทศนิยมไบนารีเป็นโค้ดเจ็ดส่วน รหัส BCD จะถูกส่งผ่านไปยังฟังก์ชันนี้ผ่านทางตัวสะสม และรหัสเจ็ดส่วนจะถูกส่งกลับไปยังโปรแกรมที่เรียกผ่านรีจิสเตอร์เดียวกัน

ในคำสั่ง db คุณสามารถระบุค่าคงที่หลายรายการพร้อมกัน โดยคั่นด้วยเครื่องหมายจุลภาค คุณสามารถใช้ทั้งหมดพร้อมกันได้ แต่โดยทั่วไปแล้ว ควรระบุค่าคงที่แต่ละรายการพร้อมข้อคิดเห็น ดังที่ทำในตัวอย่างก่อนหน้านี้ วิธีนี้ทำให้โปรแกรมเข้าใจได้ง่ายขึ้นและค้นหาข้อผิดพลาดได้ง่ายขึ้น

คำสั่งเดียวกันทำให้ง่ายต่อการจดคำจารึกซึ่งจะต้องแสดงในภายหลังบนจอแสดงผลในตัวหรือหน้าจอแสดงผล คอมพิวเตอร์สากลเชื่อมต่อกับอุปกรณ์ที่กำลังพัฒนาผ่านอินเทอร์เฟซบางส่วน ตัวอย่างของการใช้คำสั่ง db เพื่อป้อนคำจารึกลงในหน่วยความจำโปรแกรมไมโครคอนโทรลเลอร์แสดงในรูปที่ 3

รูปที่ 3 การใช้คำสั่ง db เพื่อเขียนคำจารึกลงในหน่วยความจำโปรแกรมไมโครคอนโทรลเลอร์

คำสั่ง DWช่วยให้คุณจัดเก็บตัวเลขสองไบต์ลงในหน่วยความจำโปรแกรม ในคำสั่งนี้ เช่นเดียวกับในคำสั่ง db คุณสามารถป้อนตัวเลขโดยคั่นด้วยเครื่องหมายจุลภาค ตัวอย่างรายการส่วนของโปรแกรมแสดงในรูปที่ 4

รูปที่ 4 การใช้คำสั่ง dw

รูปที่ 4 แสดงส่วนของรายการโปรแกรมเพื่อให้คุณสามารถติดตามได้ว่าไบต์ใดถูกป้อนลงในหน่วยความจำโปรแกรมไมโครคอนโทรลเลอร์ ในส่วนใหญ่ คอลัมน์ด้านขวารายการแสดงที่อยู่ที่จะป้อนตัวเลขที่เป็นตัวถูกดำเนินการของคำสั่ง dw คอลัมน์ถัดไปแสดงตัวเลขสองไบต์ที่จะจัดเก็บไว้ในหน่วยความจำโปรแกรมไมโครคอนโทรลเลอร์ โปรดทราบว่าแม้ว่าตัวถูกดำเนินการสองตัวแรกจะมีเพียงตัวเลขเดียว แต่เลขฐานสิบหกสี่หลัก (ตัวเลขสองไบต์) จะถูกเก็บไว้ในหน่วยความจำของไมโครคอนโทรลเลอร์

เมื่อแปลข้อความต้นฉบับของโปรแกรม จะถือว่าคำสั่งแรกอยู่ที่ที่อยู่ศูนย์ ที่อยู่ของคำสั่งที่ตามมาจะขึ้นอยู่กับความยาวและจำนวนคำสั่งก่อนหน้า รายการตัวอย่างของส่วนเริ่มต้นของโปรแกรมแสดงในรูปที่ 5

รูปที่ 5. ตัวอย่างรายการโปรแกรม

บางครั้งคุณต้องจัดเรียงคำสั่งตาม ที่อยู่เฉพาะ- สิ่งนี้จำเป็นบ่อยที่สุดเมื่อใช้อินเทอร์รัปต์ เมื่อคำสั่งแรกของโปรแกรมตัวจัดการอินเทอร์รัปต์ต้องอยู่บนเวกเตอร์อินเทอร์รัปต์ทุกประการ ซึ่งสามารถทำได้โดยใช้คำสั่ง nop เพื่อเติมช่องว่างระหว่างเวกเตอร์ขัดจังหวะ แต่จะเป็นการดีกว่าถ้าใช้คำสั่ง ORG

คำสั่งขององค์กร มีไว้สำหรับการเขียนค่าของตัวถูกดำเนินการไปยังตัวนับที่อยู่ส่วน นั่นคือเมื่อใช้คำสั่งนี้ คุณสามารถวางคำสั่ง (หรือข้อมูล) ในหน่วยความจำไมโครคอนโทรลเลอร์ตามที่อยู่ใดก็ได้ ตัวอย่างของการใช้คำสั่ง ORG เพื่อวางรูทีนขัดจังหวะบนเวกเตอร์ขัดจังหวะแสดงในรูปที่ 6

รูปที่ 6 ตัวอย่างการใช้คำสั่ง ORG

ควรสังเกตว่าเมื่อใช้คำสั่งนี้สถานการณ์อาจเกิดขึ้นได้เมื่อโปรแกรมเมอร์สั่งให้นักแปลวาง รหัสใหม่โปรแกรมในตำแหน่งที่เขียนไว้แล้ว ดังนั้นการใช้คำสั่งนี้จึงได้รับอนุญาตเฉพาะในเท่านั้น กรณีที่รุนแรง- โดยทั่วไปนี่คือการใช้เวกเตอร์ขัดจังหวะ

โดยใช้คำสั่ง เมื่อใช้การขัดจังหวะ เวลาที่โปรแกรมจัดการขัดจังหวะถือเป็นสิ่งสำคัญ เวลานี้สามารถลดลงได้อย่างมากโดยการจัดสรรธนาคารที่ลงทะเบียนแยกต่างหากสำหรับการประมวลผลขัดจังหวะ คุณสามารถเลือกธนาคารลงทะเบียนแยกต่างหากได้โดยใช้คำสั่ง USING หมายเลขธนาคารของการลงทะเบียนที่ใช้จะถูกระบุในคำสั่งว่าเป็นตัวถูกดำเนินการ ตัวอย่างของการใช้คำสั่ง USING สำหรับรูทีนบริการขัดจังหวะจากตัวจับเวลา 0 แสดงในรูปที่ 7

รูปที่ 7 ตัวอย่างการใช้คำสั่ง USING

คำสั่ง CALLระบบคำสั่งไมโครคอนโทรลเลอร์ MCS-51 ใช้คำสั่งข้ามแบบไม่มีเงื่อนไขสามคำสั่ง การเลือกคำสั่งเฉพาะนั้นขึ้นอยู่กับตำแหน่งในหน่วยความจำโปรแกรม แต่โดยปกติโปรแกรมเมอร์จะไม่ทราบเรื่องนี้ ด้วยเหตุนี้ เพื่อหลีกเลี่ยงข้อผิดพลาด คุณต้องใช้คำสั่ง LJMP ที่ยาวที่สุด สิ่งนี้นำไปสู่มากขึ้น โปรแกรมที่ยาวนานและเพื่อโหลดเพิ่มเติมในตัวแก้ไขลิงค์ นักแปลสามารถเลือกได้ ตัวเลือกที่ดีที่สุดคำสั่งกระโดดแบบไม่มีเงื่อนไข ในการดำเนินการนี้ แทนที่จะใช้คำสั่งไมโครคอนโทรลเลอร์ คุณควรใช้คำสั่งการโทร

คำสั่งที่เหลือมีวัตถุประสงค์เพื่อควบคุมส่วนต่างๆ และจะมีการหารือในภายหลังเมื่อหารือเกี่ยวกับการทำงานกับโปรแกรมหลายโมดูล

วรรณกรรม:

พร้อมกับอ่านบทความ "คำสั่งภาษาการเขียนโปรแกรม ASM-51":


http://site/Progr/progr.php

ตัวประกอบ MASM, TASM และ WASM แตกต่างกัน อย่างไรก็ตาม การสร้างโปรแกรมอย่างง่ายสำหรับพวกเขาแทบไม่มีความแตกต่างเลย ยกเว้นชุดประกอบและการเชื่อมโยงเอง

ดังนั้นโปรแกรมแรกของเราสำหรับ MASM, TASM และ WASM ซึ่งเอาท์พุต ตัวอักษรภาษาอังกฤษ"A" ที่ตำแหน่งเคอร์เซอร์ปัจจุบัน ซึ่งก็คือทางด้านซ้าย มุมบนหน้าจอ:

โมเดลจิ๋ว .code ORG 100h เริ่มต้น: MOV AH,2 MOV DL,41h INT 21h INT 20h END start ข้อความนี้สามารถพิมพ์เป็นภาษาง่ายๆ ใดก็ได้ โปรแกรมแก้ไขข้อความ- ตัวอย่างเช่นใน NotePad จาก WINDOWS (แต่ไม่ใช่ใน Word หรืออันที่ "ซับซ้อน" อื่น ๆ ) อย่างไรก็ตาม ฉันขอแนะนำโปรแกรมแก้ไขข้อความ "ขั้นสูง" ที่มีการเน้นไวยากรณ์ เช่น PSPad (ดูหัวข้อ) จากนั้นเราจะบันทึกไฟล์นี้ด้วยนามสกุล .asm เช่น ในโฟลเดอร์ MYPROG ลองเรียกไฟล์ atest ดังนั้นเราจึงได้: C:\MYPROG\atest.asm

บันทึก
โปรดทราบว่าในคำสั่งแรกเราเขียน 2 แทนที่จะเป็น 02h MASM, TASM และ WASM เช่นเดียวกับ Emu8086 อนุญาตให้มี "เสรีภาพ" ดังกล่าว แม้ว่าคุณจะสามารถเขียน 02h ได้ แต่จะไม่มีข้อผิดพลาด

คำอธิบายสำหรับโปรแกรม:

.โมเดลจิ๋ว– บรรทัดที่ 1. คำสั่ง .model กำหนดโมเดลหน่วยความจำสำหรับประเภทไฟล์เฉพาะ ในกรณีของเรา นี่คือไฟล์ที่มี ส่วนขยาย .COMดังนั้นเราจึงเลือกโมเดลขนาดเล็กที่รวมโค้ด ข้อมูล และสแต็กเซ็กเมนต์เข้าด้วยกัน โมเดลจิ๋วได้รับการออกแบบเพื่อสร้างไฟล์ประเภท COM

.รหัส– บรรทัดที่ 2. คำสั่งนี้เริ่มต้นส่วนของโค้ด

องค์กร 100 ชม– บรรทัดที่ 3. คำสั่งนี้ตั้งค่าตัวนับโปรแกรมเป็น 100h เนื่องจากเมื่อโหลดไฟล์ COM ลงในหน่วยความจำ DOS จะจัดสรร 256 ไบต์แรกให้กับบล็อกข้อมูล PSP ( เลขทศนิยม 256 เท่ากับ 100h ฐานสิบหก) รหัสโปรแกรมจะอยู่หลังบล็อกนี้เท่านั้น โปรแกรมทั้งหมดที่คอมไพล์เป็นไฟล์ประเภท COM จะต้องเริ่มต้นด้วยคำสั่งนี้

เริ่มต้น: MOV AH, 02 ชม– บรรทัดที่ 4. ป้ายกำกับเริ่มต้นจะอยู่หน้าคำสั่งแรกในโปรแกรม และจะถูกใช้ในคำสั่ง END เพื่อระบุว่าโปรแกรมเริ่มต้นด้วยคำสั่งใด คำสั่ง MOV จะใส่ค่าของตัวถูกดำเนินการตัวที่สองลงในตัวถูกดำเนินการตัวแรก นั่นคือค่า 02h จะถูกวางไว้ในรีจิสเตอร์ AN เหตุใดจึงทำเช่นนี้? 02h เป็นฟังก์ชัน DOS ที่แสดงอักขระบนหน้าจอ เรากำลังเขียนโปรแกรมสำหรับ DOS ดังนั้นเราจึงใช้คำสั่งนี้ ระบบปฏิบัติการ(ระบบปฏิบัติการ) และเราเขียนฟังก์ชันนี้ (หรือแทนที่จะเป็นตัวเลข) ในรีจิสเตอร์ AH เนื่องจากอินเทอร์รัปต์ 21h ใช้รีจิสเตอร์นี้

MOV DL, 41ชม– บรรทัดที่ 5. รหัสอักขระ "A" ถูกป้อนลงในรีจิสเตอร์ DL รหัส ASCII สำหรับอักขระ "A" คือ 41h

อินท์ 21ชม– บรรทัดที่ 6. นี่คือการขัดจังหวะ 21 ชั่วโมงเดียวกัน - คำสั่งที่ทำให้เกิด ฟังก์ชั่นระบบ DOS ที่ระบุใน AN register (ในตัวอย่างของเราคือฟังก์ชัน 02h) คำสั่ง INT 21h เป็นวิธีหลักในการโต้ตอบระหว่างโปรแกรมและระบบปฏิบัติการ

อินท์ 20ชม– บรรทัดที่ 7. นี่คือการขัดจังหวะที่บอกให้ระบบปฏิบัติการออกจากโปรแกรมและถ่ายโอนการควบคุมไปยังแอปพลิเคชันคอนโซล หากโปรแกรมได้รับการคอมไพล์และเปิดใช้งานจากระบบปฏิบัติการแล้ว คำสั่ง INT 20h จะส่งคืนเราไปยังระบบปฏิบัติการ (เช่น ไปยัง DOS)

สิ้นสุด เริ่มต้น– บรรทัดที่ 8. คำสั่ง END สิ้นสุดโปรแกรมโดยระบุว่าควรเริ่มดำเนินการที่จุดใด

หนึ่งใน องค์ประกอบสำคัญหนังสือส่วนนี้ประกอบด้วยตัวอย่างโปรแกรมในรหัสเครื่องและภาษา ASSEMBLY ในการพิมพ์โปรแกรมเหล่านี้เราจะต้องใช้สิ่งนี้

เรียกว่า ASSEMBLY DIREECTIVES และตอนนี้น่าจะมากที่สุด เวลาที่สะดวกเพื่อให้เข้าใจว่ามันคืออะไร

เราจะดูคำสั่งต่อไปนี้: ORG, EQU, DEFB, DEFW, DEFM และ END แต่ก่อนที่เราจะเริ่มพิจารณาคำสั่งเหล่านี้ เราต้องเข้าใจให้แน่ชัดก่อน:

1. คำสั่ง ASSEMBLY ไม่ใช่คำสั่งของโปรเซสเซอร์ Z8 0 และในแง่นี้ไม่เกี่ยวข้องกับรหัสเครื่อง Z8 0

2. ASSEMBLER คือโปรแกรมที่แปล (แปล) ข้อความที่คุณเขียนในรูปแบบตัวช่วยจำให้เป็นรหัสวัตถุซึ่งก็คือรหัสเครื่อง และคำสั่ง ASSEMBLY เหล่านี้เป็นคำสั่งบางส่วนสำหรับโปรแกรมแอสเซมบลี ไม่มีการแปลและจะไม่รวมอยู่ในออบเจ็กต์โค้ด แต่จะช่วยให้คุณเขียนได้ง่ายขึ้นและที่สำคัญที่สุดคืออ่านโปรแกรมที่เขียนด้วยตัวช่วยจำ

3. มีโปรแกรม ASSEMBLY มากมาย และแต่ละโปรแกรมสามารถมีแนวทางของตัวเองได้ อาจมีคำสั่งเดียวกัน แต่มีข้อกำหนดในการใช้งานที่แตกต่างกัน กล่าวอีกนัยหนึ่ง คุณต้องสร้างวิธีการเฉพาะสำหรับการใช้คำสั่ง ASSEMBLY ตามคำแนะนำสำหรับโปรแกรมแอสเซมบลีที่คุณใช้ (เช่น EDITAS, GENS 3, GENS 4, ZEUS เป็นต้น) และถึงแม้จะไม่มีมาตรฐาน แต่ก็ยังสามารถระบุแนวคิดพื้นฐานบางประการได้ และเราจะมุ่งเน้นไปที่แนวคิดเหล่านั้น

3.1. ความคิดเห็น

เราจะเริ่มต้นด้วยสิ่งที่ง่ายที่สุด - ความคิดเห็น เขียนไว้หลังสัญลักษณ์ ";" (อัฒภาค) .

แน่นอนว่าคุณเข้าใจว่าทุกสิ่งที่เป็นความคิดเห็นนั้นมี ASSEMBLY เข้ามา รหัสเครื่องไม่คอมไพล์ - สิ่งนี้ไม่มีประโยชน์ พวกเขาให้บริการเพียงเพื่อให้คุณสะดวกยิ่งขึ้นในการจัดการกับรายการที่คนอื่นหรือคุณรวบรวมไว้เมื่อนานมาแล้ว

ตัวอย่างเช่น:

10 60001 แอลดี อี,เอ 2 0

อย่างที่คุณเห็นเส้นสามารถ

- โหลดลงในทะเบียน E ที่มี -; กดแบตเตอรี่ - เราลดลงไปหนึ่ง

เพียงจากความคิดเห็น

แท็ก

ป้ายกำกับทำให้การเขียนโปรแกรมง่ายขึ้นอย่างมากในการช่วยจำ ASSEMBLY ในการดำเนินการข้าม JP, JR, DJNZ และการเรียกรูทีนย่อย CALL คุณไม่สามารถระบุที่อยู่ที่คุณต้องการข้ามได้ แต่เปลี่ยนเลเบลแทน ในทางกลับกัน เมื่อคุณเขียนคำสั่งสำหรับที่อยู่นี้ ให้ใส่เครื่องหมายไว้ตรงนั้นด้วย ตัวอย่างเช่น

10 60001 เริ่มต้น LD B,0 4

20 60003 อีกครั้ง INC HL

40 60005 DJNZ อีกครั้ง

3.2.

250 260 270

60110 60111 60113

LD A,(HL) CP 80H JR NZ,เริ่มต้น

อย่างที่คุณเห็นมันสะดวกมาก คุณจะเห็นได้ทันทีว่าจากบรรทัดที่ 40 การส่งคืนจะอยู่ที่ป้ายกำกับ AGAIN หากรีจิสเตอร์ B ไม่ถึงศูนย์ บรรทัด 270 กลับสู่ป้ายกำกับ BEGIN

การเลือกชื่อป้ายกำกับที่ตรงกับความหมายของการดำเนินการที่กำลังดำเนินการอยู่นั้นสมเหตุสมผลอย่างยิ่ง ซึ่งจะทำให้รายการโปรแกรมอ่านและเข้าใจได้ง่ายขึ้น

ในระหว่างการคอมไพล์โปรแกรมแอสเซมบลีจะคำนวณค่าออฟเซ็ตที่จำเป็นในคำสั่งของโปรเซสเซอร์และแทนที่ค่าเหล่านั้นแทนป้ายกำกับ ตัวอย่างเช่น ในบรรทัดที่ 40 แทนที่จะเป็น DJNZ AGAIN ออบเจ็กต์โค้ดจะมี DJNZ FCH ซึ่งเป็นสิ่งเดียวกัน

ในตัวอย่างก่อนหน้านี้ เราใช้ป้ายกำกับเท่าที่จำเป็น ความจริงก็คือทั้งการอ้างอิงถึงฉลากและตัวฉลากเองอยู่ในขั้นตอนเดียวกัน แต่ถ้าคุณต้องการเข้าถึงป้ายกำกับที่อยู่ในขั้นตอนอื่นที่คุณเขียนและคอมไพล์เมื่อวานนี้ และจะเกิดอะไรขึ้นถ้าคุณต้องการเปลี่ยนไปใช้ขั้นตอน ROM และต้องการใช้ป้ายกำกับนั้น ในกรณีนี้ คำสั่ง EQU จะช่วยคุณได้ เธอกำหนดป้ายกำกับ ค่าตัวเลข- แน่นอนว่าในระหว่างการคอมไพล์คำสั่งนี้จะไม่ถูกแปลงเป็นรหัสเครื่องแต่อย่างใด แต่หากมีการอ้างอิงถึงป้ายกำกับนี้ในข้อความของโปรแกรม ค่าที่นำมาจากคำสั่ง EQU จะถูกแทนที่

ตัวอย่างเช่น ในโปรแกรมของคุณ คุณต้องเรียกโพรซีเดอร์ ROM ซ้ำๆ เช่น CLEAR (1EACH=7 8 52) และ OUT-LINE (1856H=6230) จากนั้นเมื่อเริ่มต้นโปรแกรมคุณระบุ

เช่นเรียกพวกเขาว่า CLEAR

คำสั่ง

ค่าของเครื่องหมาย n

และ OUT L.

ชัดเจน

อีคิว 7 8 52

ออก แอล

อีคิว 62 3 0

ฉลาก

อีคิว 60016

เรียก

คุณรู้สิ่งเหล่านี้

ขั้นตอนหรือ

โดยมาร์ก

60001

แอลดี เอชแอล, (ฉลาก)

60004

แอลดี ก่อนคริสต์ศักราช, 0008

60007

แอลดี ดีอี (04 52)

60010

โทรเคลียร์

60013

โทรหาแอล

60016

ทันที

เป็นหนี้คุณ

เตือน,

ตัวอย่าง

จากมุมมอง

ซอฟต์แวร์

ตัวอย่างวิธีการใช้คำสั่ง ASSEMBLY และหากคุณต้องการตัวอย่าง ความหมายที่แท้จริงแล้วคุณจะได้รับมันในภายหลังในบทต่อ ๆ ไปซึ่งเราจะมาตรวจสอบกัน เทคนิคการปฏิบัติการเขียนโปรแกรม

ลองมาดูตัวอย่างก่อนหน้านี้อีกครั้ง ในบรรทัดที่ 30 เราส่งสิ่งที่มีอยู่ในที่อยู่ซึ่งชี้ไปที่ฉลาก LABEL ไปยังคู่รีจิสเตอร์ HL ซึ่งตามคำสั่ง EQU ชี้ไปยังที่อยู่ 60016

ดังนั้นเซลล์ 60016 และ 60017 จึงมีข้อมูลบางอย่างที่โปรแกรมสามารถใช้ได้ในภายหลัง คุณสามารถส่งข้อมูลนี้ไปยังเซลล์ด้วยตัวเองก่อนที่จะคอมไพล์ และคุณไม่จำเป็นต้องใช้รหัสเครื่องสำหรับสิ่งนี้ ค่าเริ่มต้นในเซลล์หน่วยความจำคุณสามารถตั้งค่าได้โดยใช้คำสั่ง DEFB, DEFW และ DEFM

DEFB - กำหนดไบต์ - ตั้งค่าไบต์

DEFW - DEFINE WORD - ตั้งค่า "word" ("word" คือไบต์สองไบต์ติดต่อกัน โดยปกติจะเป็นที่อยู่) DEFM - DEFINE MESSAGE - ตั้งค่าข้อความ (ซึ่งเป็นไบต์หลายไบต์ติดต่อกัน) โดยทั่วไป โปรแกรมแอสเซมบลีจะกำหนดขีดจำกัดจำนวนไบต์ที่สามารถระบุได้โดยคำสั่ง DEFM หนึ่งคำสั่ง กล่าวคือไม่เกินห้าไบต์ แต่สิ่งนี้ไม่ควรกังวลคุณ หากคุณต้องการระบุข้อความที่ยาว คุณสามารถใส่บรรทัด DEFM ในแถวได้มากเท่าที่คุณต้องการ

ดังนั้น DEFB ระบุหนึ่งไบต์เดียว (0...255) DEFW ระบุสองไบต์ติดต่อกัน (0...65535) และ DEFM ระบุกลุ่มของไบต์ต่อเนื่องกัน - ข้อความ, ตารางหมายเลขและอื่น ๆ

ในตัวอย่างก่อนหน้านี้ หากเราต้องการเก็บตัวเลขสองไบต์ไว้ที่ที่อยู่ 60016 และ 60017 บรรทัด 80 จะต้องเขียนดังนี้:

80 60016 DEFW 5C92H

90 60018

สมมติว่าคุณต้องการเก็บคำว่า "Spectrum" โดยเริ่มจากที่อยู่ 60135

รหัสตัวอักษร "S" รหัสตัวอักษร "p" "e" "c" "t" "r"

"คุณ" "ม"

60135

60136

60137

60138

60139

60140

60141

60142

53H 7 0H 65H 63H 7 4H 72H 75H 6DH

DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB

คุณสามารถระบุเป็นคู่ไบต์:

แต่จะง่ายกว่าและถูกต้องมากกว่าหากตั้งเป็นข้อความ:

60135 เดฟเอ็ม 5370656374 ; "สเปค"

60140 DEFM 72756D ; "รัม"

กิน เป็นกรณีพิเศษเมื่อเขียนโปรแกรมใน ASSEMBLY เมื่อต้องป้อนข้อความโปรแกรมผ่าน DEFB หรือ DEFM ด้วย กรณีนี้เกิดขึ้นเมื่อคุณเขียนโปรแกรมเครื่องคิดเลขในตัว ท้ายที่สุดแล้ว โปรแกรมแอสเซมบลีสามารถแปลตัวช่วยจำ ASSEMBLY ไปเป็นรหัสเครื่องได้ แต่โปรแกรมไม่รู้อะไรเลยเกี่ยวกับรหัสเครื่องคิดเลขและก็ไม่รู้ตัวช่วยจำด้วย รหัสเครื่องคิดเลขเป็นเรื่องของ "ซินแคลร์" ภายในซึ่งเป็นการตีความ

โปรแกรมที่อยู่ใน ROM ได้รับการประมวลผล และรหัสเครื่องคิดเลขไม่เกี่ยวข้องกับโปรเซสเซอร์และคำสั่งของมัน ดังนั้น คุณจะสามารถป้อนคำสั่งเครื่องคิดเลขลงในโปรแกรมแอสเซมบลีได้เฉพาะตามลำดับไบต์อิสระเท่านั้น เช่น ผ่าน DEFB หรือ DEFM

ในส่วนแรกของหนังสือ เราใช้สัญลักษณ์ช่วยจำสำหรับคำสั่งเครื่องคิดเลข เช่น add, stk_data s_lt ฯลฯ และเขียนด้วยตัวอักษรตัวเล็ก ตรงกันข้ามกับคำสั่งตัวประมวลผล แต่เราเคยทำเช่นนี้มาก่อนและจะทำต่อไปเพียงเพื่อความเข้าใจและความง่ายในการบันทึกเท่านั้น โปรแกรม ASSEMBLY ไม่รู้จักตัวช่วยจำดังกล่าว ไม่มีอยู่ในพจนานุกรม

ดังนั้นด้วยความช่วยเหลือของ DEFB, DEFW และ DEFM พวกเขาตั้งค่าเริ่มต้นของตัวแปรโปรแกรมป้อนตารางข้อความและลำดับข้อมูลอื่น ๆ ลงในโปรแกรมแม้กระทั่ง

กราฟิกตลอดจนลำดับโค้ดที่โปรแกรมแอสเซมบลีไม่เข้าใจเป็นคำสั่ง ASSEMBLY

3.5. คำสั่ง ORG, END

เราแค่ต้องพิจารณาคำสั่งที่ไม่สำคัญที่สุดสองข้อ คำสั่ง ORG ประกาศที่อยู่ที่จะใช้ประกอบโปรแกรม ควรเป็นคำสั่งแรกใน ข้อความต้นฉบับแม้ว่าโดยหลักการแล้วอาจมีความเห็นก่อนหน้านั้นก็ตาม

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

10 องค์กร 63000

จากนั้นโปรแกรมแอสเซมบลีจะคำนวณว่าคำสั่งนี้หรือคำสั่งนั้นจะอยู่เซลล์หน่วยความจำใด สิ่งนี้ช่วยลดความยุ่งยากในขั้นตอนการเขียนโปรแกรมอย่างมาก และหากคุณทำการเปลี่ยนแปลงข้อความที่เสร็จแล้ว ASSEMBLER จะแก้ไขที่อยู่ทั้งหมดเอง

คำสั่ง END เป็นจุดสิ้นสุดของโปรแกรม หากมีอย่างอื่นหลังจากนั้น ASSEMBLY จะเพิกเฉยต่อมันในระหว่างการคอมไพล์

นั่นอาจเป็นทั้งหมดที่ควรรู้เกี่ยวกับคำสั่ง ASSEMBLY เพื่อเริ่มต้น คำสั่งเหล่านี้ไม่ใช่คำสั่งทั้งหมดที่คุณอาจพบในชีวิต และกฎสำหรับการใช้งานนั้นแตกต่างกันสำหรับ ASSEMBLERS ที่แตกต่างกัน แต่โดยส่วนใหญ่แล้ว ขั้นต่ำนี้จะตอบสนองความต้องการข้อมูลของคุณได้ 90 เปอร์เซ็นต์ และส่วนที่เหลือคุณควรได้รับจากคำแนะนำสำหรับ ASSEMBLEER ที่คุณทำงานด้วย

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

คำสั่งคำจำกัดความของตัวระบุ

กำหนดตัวระบุด้วยชื่อที่กำหนดให้กับข้อความหรือค่าตัวเลข (นิพจน์) รูปแบบคำสั่ง:

ชื่อ อีคิวข้อความ

ชื่อ = ค่าตัวเลข (นิพจน์)

ความแตกต่างระหว่างตัวดำเนินการหลอก EQU และ =:

l EQU - กำหนดค่าอย่างถาวร (ไม่สามารถเปลี่ยนแปลงได้) ข้อความอาจเป็นนิพจน์สัญลักษณ์ ตัวเลข หรือผสม ซึ่งกำหนดค่าคงที่ ที่อยู่ ชื่อสัญลักษณ์อื่น ป้ายกำกับ ฯลฯ

l = - ดำเนินการมอบหมายปัจจุบัน (สามารถกำหนดค่าใหม่ได้ แต่เฉพาะในระหว่างการแปลเท่านั้น) กำหนดเฉพาะนิพจน์ตัวเลขที่มีการแปลงทางคณิตศาสตร์อย่างง่าย ซึ่งจะดำเนินการระหว่างการแปล (เช่น const + 1, 15H*4, 3*12/4 ฯลฯ)

คำสั่งคำจำกัดความของข้อมูล

ใช้เพื่อระบุตัวแปรและฟิลด์หน่วยความจำ รูปแบบคำสั่ง

[ชื่อ] นิพจน์ D* [,นิพจน์] [,...]

คำหลัก D* อาจเป็น:

l DB - กำหนดไบต์ (1 ไบต์);

l DW - กำหนดคำ (2 ไบต์)

l DD - กำหนดคำคู่ (4 ไบต์)

l DQ - กำหนด 8 ไบต์;

l DT - กำหนด 10 ไบต์

คำสั่งที่เป็นปัญหาประกาศตัวแปร (ชื่อ) หรือกำหนดค่าเริ่มต้นให้กับฟิลด์ (เซลล์) ของหน่วยความจำ สำรองในหน่วยความจำ (พร้อมการกำหนดค่าในภายหลัง) หนึ่งไบต์ขึ้นไป - DB, คำ - DW, คำคู่ - DD ฯลฯ

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

ค่าคงที่:
const DB 56; ต่อ DW 1936; เชื่อมต่อ DD 3FFH
อย่าลืมพิจารณาช่วงและความจุของไบต์ คำ ฯลฯ ดังนั้นสำหรับ DB ค่าคงที่ต้องไม่เกิน 255 สำหรับ DW - 65,535 สำหรับ DD -



ลิตร 65 535 2 – 1 = 4 294 967 295;

l เวกเตอร์หรือตาราง:
ตารางที่ 1 ฐานข้อมูล 30, 4, –15, 0, 0, 0, 56; ตารางที่ 2 DW 1936, 3004, 56, 15.
ใน pseudo-operator ตัวเดียว คุณสามารถวางสตริงได้มากถึง 132 ตำแหน่ง และแทนที่จะทำซ้ำค่าเดียวกันหลายๆ ครั้ง (0 ใน table1) คุณสามารถใช้ pseudo-operator ของ DUP (ซ้ำกัน):
ตารางที่ 1 DB 30, 4, –15, 3 ซ้ำ (0), 56);

l ชุดอักขระ:
str1 DB "คุณป้อนมากเกินไป จำนวนมาก";
str2 DB "คำสั่งไม่ถูกต้อง";
ในตัวดำเนินการหลอก DB บรรทัดสามารถมีอักขระได้ 255 ตัวในส่วนอื่น ๆ ทั้งหมด (DW, DD, DQ, DT) - เพียง 2 ตัวอักษร

ล. ช่องว่าง:
เสา1 DB ?; เสา2 DW 12 ซ้ำ(?),
ในเวลาเดียวกัน ไม่มีสิ่งใดถูกเขียนลงในองค์ประกอบหน่วยความจำที่สงวนไว้เมื่อโหลดโปรแกรม (ไม่ใช่ 0 ที่ถูกเขียน เช่น ในคำสั่ง pole3 DW 5 dup(0) แต่เซลล์หน่วยความจำถูกสงวนไว้เพียงอย่างเดียว)

l ชื่อตัวแปรเชิงสัญลักษณ์:
การแสดง DW var1; เวกเตอร์ var2 DD
(ตัวแปรตัวหนึ่งถูกกำหนดโดยที่อยู่ของตัวแปรอื่น ไม่จำเป็นต้องระบุออฟเซ็ตในคำสั่ง เนื่องจากชื่อตัวแปรจะถูกมองว่าเป็นที่อยู่) ตัวเลือกนี้เหมาะสำหรับการจัดเก็บที่อยู่ของเซลล์หน่วยความจำ ป้ายกำกับที่สามารถอ้างอิงในโปรแกรมได้ (var1 DW disp) และหากตัวแปรอยู่ในเซ็กเมนต์เดียวกันกับคำสั่งอ้างอิง ก็เพียงพอที่จะระบุเท่านั้น ออฟเซ็ตเป็นที่อยู่ ( 2 ไบต์) นั่นคือคุณสามารถใช้ DW ได้ หากตัวแปรอยู่ในเซ็กเมนต์อื่น คุณต้องระบุทั้งเซ็กเมนต์และออฟเซ็ต (รวม 4 ไบต์) นั่นคือคุณควรใช้ DD (เวกเตอร์ var2 DD)

l ด้วยสำนวนง่ายๆ:
fn1 ดีบี 80*3; แน่นอนว่า fn2 DW (disp) + 256 คำนวณเฉพาะเมื่อมีการแปลโปรแกรมเท่านั้น

คำสั่งสำหรับการกำหนดส่วนและขั้นตอน

เซ็กเมนต์ถูกกำหนดโดยตัวดำเนินการหลอก:

ส่วนเซ็กเมนต์_ชื่อ

segname สิ้นสุดลง

ในโปรแกรมคุณสามารถใช้ 4 ส่วน (ตามจำนวนการลงทะเบียนเซ็กเมนต์) และสำหรับแต่ละส่วนให้ระบุการลงทะเบียนเซ็กเมนต์ที่เกี่ยวข้องโดยใช้ตัวดำเนินการหลอก ASSUME (สมมติ - กำหนด) ตัวอย่างเช่น:

ถือว่า CS:codeseg, DS:dataseg, SS:stackseg

คำสั่ง ASSUME register_seg:seg_name [,..] โดยเฉพาะอย่างยิ่ง ASSUME cs:codeseg ระบุว่ารีจิสเตอร์ที่เลือกสำหรับเซ็กเมนต์ seg_name (codeseg) คือ CS

หลังจากคำสั่ง ASSUME คุณต้องโหลดที่อยู่ของจุดเริ่มต้นของส่วนข้อมูลลงใน DS register อย่างชัดเจน:

ขั้นตอนถูกกำหนดโดยตัวดำเนินการหลอก:

ขั้นตอน_ชื่อโปร ...

ขั้นตอน_ชื่อสิ้นสุด

เมื่อกำหนดขั้นตอนภายหลัง คำสำคัญ proc ต้องระบุแอตทริบิวต์ระยะทางใกล้หรือไกล หากไม่มีแอตทริบิวต์นี้ แสดงว่าค่าดีฟอลต์อยู่ใกล้ โดยทั่วไปขั้นตอนควรลงท้ายด้วยคำสั่ง ret (return) ถ้าขั้นตอนถูกประกาศว่าใกล้ จะต้องทำการเรียกจากส่วนเดียวกัน หาก procfar จากเซ็กเมนต์ใดๆ (ในกรณีนี้ คำสั่ง ret จะแสดงคำสองคำจากสแต็กเมื่อส่งคืน: สำหรับ IP และสำหรับ CS)

คำสั่งควบคุมการออกอากาศ

มีหลายอย่าง แต่ที่นิยมใช้กันมากที่สุดคือ END คำสั่ง END ทำเครื่องหมายจุดสิ้นสุดของโปรแกรมและบอกแอสเซมเบลอร์ว่าจะสิ้นสุดการแปลที่ใด รูปแบบ: END [program_name]

ขั้นตอนการเขียนโปรแกรมสำหรับการทำงานกับอุปกรณ์อินพุต/เอาท์พุต

โดยทั่วไปขั้นตอน I/O ในพีซีจะดำเนินการโดยใช้การขัดจังหวะ องค์ประกอบและการใช้ประเภทหลักของการขัดจังหวะและฟังก์ชันการบริการของ DOS ขัดจังหวะ 21H จะมีการหารือกันในงาน ด้านล่างนี้เราจะอภิปรายโดยย่อเกี่ยวกับปัญหาของการเขียนโปรแกรม I/O เพียงขัดจังหวะการแสดงข้อมูลบนจอแสดงผลและอินพุตคีย์บอร์ด ประเด็นของการส่งข้อมูลไปยังเครื่องพิมพ์และการทำงานกับไฟล์จะมีการพูดคุยกันในงาน

การเขียนโปรแกรมการแสดงผล

การตั้งค่าโหมดการทำงานและการแลกเปลี่ยนข้อมูลกับจอแสดงผลสามารถทำได้ในระหว่างการหยุดชะงัก ประเภทไบออส 10H และเอาต์พุตข้อมูลไปยังจอแสดงผลและระหว่างการขัดจังหวะ DOS ประเภท 21H

การทำงานของวิดีโอที่มีการหยุดชะงักของ DOS 21 ชั่วโมง

เอาต์พุตสัญลักษณ์เพื่อแสดงหน้าจอ: AH = 2 หรือ AH = 6 และ DL<>0FFชั่วโมง รีจิสเตอร์ DL ต้องมีรหัส ASCII ของอักขระ ตัวอย่างส่วนของโปรแกรม (เอาต์พุตของสัญลักษณ์ “C”):

มอฟ ดีแอล, 43H ; 43H เป็นรหัส ASCII สำหรับอักขระ C

การส่งออกสตริงของอักขระ: AH = 9 (ฟังก์ชันที่ใช้บ่อยที่สุด) รีจิสเตอร์ DS:DX ต้องมีที่อยู่เริ่มต้นของสตริงอักขระ ซึ่งจะต้องลงท้ายด้วยอักขระ $ ตัวอย่างของส่วนของโปรแกรม (แสดงข้อความ "เอาต์พุตสตริงอักขระ $"):

ข้อความ db "สตริงอักขระเอาต์พุต $"

mov DX, ข้อความออฟเซ็ต ; นี่คือที่อยู่ของบรรทัดเอาต์พุต

I/O จากไฟล์ผ่านจำนวนลอจิคัล หมายเลขโลจิคัลไฟล์มาตรฐานระบุประเภทและอุปกรณ์ของ I/O:

ล. 0 - อินพุตคีย์บอร์ด;

l 1 - ส่งออกไปยังหน้าจอแสดงผล;

ล. 2- แสดงข้อความแสดงข้อผิดพลาด;

l 3- เปิด I/O อุปกรณ์ภายนอก;

ล. 4- งานพิมพ์

ฟังก์ชัน AH = 3Fh ของการขัดจังหวะ 21H ใช้สำหรับอินพุต ฟังก์ชัน AH = 40h ของการขัดจังหวะ 21H ใช้สำหรับเอาต์พุต รีจิสเตอร์ CX ได้รับการตั้งค่าล่วงหน้าด้วยจำนวนไบต์อินพุต/เอาท์พุต และรีจิสเตอร์ DX ได้รับการตั้งค่าล่วงหน้าด้วยที่อยู่เริ่มต้นของฟิลด์หน่วยความจำสำหรับ I/O ถ้าขั้นตอน I/O เสร็จสมบูรณ์ CF แฟล็กดำเนินการจะถูกล้าง และจำนวนไบต์ที่ถ่ายโอนจริงจะถูกส่งกลับในการลงทะเบียน AX ที่ การดำเนินการไม่สำเร็จการตั้งค่าสถานะ CF ถูกตั้งค่าเป็น 1 และรหัสข้อผิดพลาดถูกเขียนไปยังการลงทะเบียน AX

ตัวอย่างด้านล่างประกอบด้วยส่วนของโปรแกรมที่จะแสดงบนหน้าจอ ไฟล์ข้อความข้อความที่มีขนาด 50 ไบต์

ข้อความ db 50 ซ้ำ (" ")

mov BX, 1 ; การระบุอุปกรณ์เอาท์พุต

mov CX, 50 ;ระบุจำนวนไบต์ที่จะส่งออก

mov DX, ข้อความออฟเซ็ต ; ระบุที่อยู่เริ่มต้น

- ฟิลด์หน่วยความจำที่มีข้อความ

เมื่อเขียนโปรแกรมในภาษาแอสเซมบลีจะใช้คำสั่งที่ระบุตำแหน่งของโปรแกรมในหน่วยความจำให้คอมไพเลอร์กำหนดมาโครเริ่มต้นหน่วยความจำ ฯลฯ รายการคำสั่งและคำอธิบายมีอยู่ในตาราง 1.8. คำสั่งทั้งหมดเริ่มต้นด้วยจุด ให้เราสรุปรายการฟังก์ชันที่ดำเนินการโดยคำสั่งในแต่ละส่วนโดยย่อ

ส่วนของโปรแกรมจะเปิดขึ้นพร้อมกับคำสั่ง .CSEG หากโปรแกรมเริ่มต้นด้วยส่วนนี้ คำสั่งอาจหายไป ในส่วนของโปรแกรม คุณสามารถใช้คำสั่ง .ORG เพื่อระบุจุดเริ่มต้นของส่วนได้

คำสั่ง .DB ในส่วนกำหนดหนึ่งไบต์หรือกลุ่มของไบต์ของค่าคงที่ที่เขียนลงในหน่วยความจำแฟลช คำสั่ง .DW กำหนดคำหรือกลุ่มของคำที่เขียนลงในหน่วยความจำเป็นค่าคงที่ จุดเริ่มต้นของการบันทึกค่าคงที่ถูกกำหนดโดยป้ายกำกับที่อยู่ก่อนหน้าคำสั่งที่เกี่ยวข้อง ค่าคงที่ที่ระบุจะถูกคั่นด้วยเครื่องหมายจุลภาค

คำสั่ง .DEF กำหนดชื่อเชิงสัญลักษณ์ให้กับรีจิสเตอร์ คำสั่ง .EQU, .SET กำหนดค่าให้กับชื่อ ชื่อที่กำหนดค่าตามคำสั่ง .EQU ไม่สามารถกำหนดใหม่ได้ และค่าไม่สามารถเปลี่ยนแปลงได้ ชื่อที่กำหนดโดยคำสั่ง .SET สามารถเปลี่ยนแปลงได้ด้วยคำสั่ง .SET อื่น

คำสั่ง .DEVICE ระบุประเภทของไมโครคอนโทรลเลอร์เป้าหมายที่จะใช้ในการรันโปรแกรม การมีอยู่ของคำสั่งนี้ทำให้สามารถติดตามคำสั่งของโปรแกรมที่เกี่ยวข้องได้ อุปกรณ์ทางกายภาพ, คำเตือนเกี่ยวกับความเป็นไปไม่ได้ในการดำเนินการตามคำสั่งบางอย่าง, ขนาดของหน่วยความจำที่ใช้ ฯลฯ

คำสั่ง .INCLUDE พร้อมชื่อไฟล์ใช้เพื่อรวมไฟล์อื่นในข้อความของโปรแกรม

ตารางที่ 1.8. รายการคำสั่ง

คำสั่ง

คำอธิบาย

สำรองไบต์ใน RAM

ส่วนโปรแกรม

กำหนดไบต์ - ค่าคงที่ในหน่วยความจำแฟลชหรือ

กำหนดชื่อเชิงสัญลักษณ์ให้กับรีจิสเตอร์

ระบุอุปกรณ์ที่จะคอมไพล์

โปรแกรม

ส่วนข้อมูล

กำหนดคำในหน่วยความจำแฟลชหรือ EEPROM

จุดสิ้นสุดของมาโคร

ตั้งค่านิพจน์คงที่

ส่วน EEPROM

ออกจากไฟล์

แนบไฟล์อื่น

เปิดใช้งานการสร้างรายการ

เปิดใช้งานการขยายมาโครในรายการ

จุดเริ่มต้นของมาโคร

ปิดการสร้างรายการ

กำหนดตำแหน่งในส่วน

ตั้งค่าตัวแปรให้เป็นนิพจน์ที่เทียบเท่า

คำสั่ง .MACRO และ .ENDMACRO กำหนดกรอบคำจำกัดความของแมโคร คำจำกัดความของแมโครสามารถมีพารามิเตอร์ได้สูงสุด 10 ตัว ชื่อคงที่@0,…,@9. เมื่อเรียกคำนิยามแมโคร พารามิเตอร์จะถูกระบุเป็นรายการตามลำดับตัวเลข

ส่วนข้อมูลเริ่มต้นด้วยคำสั่ง .DSEG คำสั่ง .ORG และ .BYTE สามารถใช้ในกลุ่มได้ คำสั่ง .BYTE ระบุจำนวนไบต์ที่จะเข้าถึงระหว่างการทำงานของโปรแกรม พื้นที่สงวนเริ่มต้นจากที่อยู่ที่ระบุโดยป้ายกำกับก่อนคำสั่ง

ส่วนประเภท EEPROM เริ่มต้นด้วยคำสั่ง .ESEG สามารถใช้คำสั่ง .ORG, .DB, .DW ได้ในเซ็กเมนต์ คำสั่ง .DB ในส่วนระบุหนึ่งหรือกลุ่มของไบต์ที่จะเขียนลงใน EEPROM คำสั่ง DW กำหนดคำหรือกลุ่มคำที่เขียนลงในหน่วยความจำ EEPROM เป็นคู่ละ 2 ไบต์ จุดเริ่มต้นของการบันทึกไบต์และคำถูกกำหนดโดยป้ายกำกับที่อยู่หน้าคำสั่งที่เกี่ยวข้อง

คำสั่ง .LIST, .NOLIST, .LISTMAC ใช้เพื่อควบคุมเอาต์พุตของรายการ