คำสั่งการชุมนุม คำสั่งคำจำกัดความของข้อมูล LISTMAC – เปิดใช้งานการขยายมาโครในรายการ

แท็ก
ป้ายในภาษาแอสเซมบลีสามารถมีสัญลักษณ์ต่อไปนี้:


ตัวอักษร: A ถึง Z และ a ถึง z
ตัวเลข: 0 ถึง 9
ตัวอักษรพิเศษ: เครื่องหมายคำถาม (?)
จุด (.) (อักขระตัวแรกเท่านั้น)
ป้าย "เชิงพาณิชย์" (@)
ขีดเส้นใต้ (_)
ดอลลาร์ ($)

อักขระตัวแรกในป้ายกำกับต้องเป็นตัวอักษรหรืออักขระพิเศษ ตัวเลขไม่สามารถเป็นอักขระตัวแรกของป้ายกำกับ และอักขระ $ และ ? บางครั้งมีความหมายพิเศษ และโดยทั่วไปไม่แนะนำให้ใช้ ตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กจะไม่แยกความแตกต่างตามค่าเริ่มต้น แต่สามารถเปิดใช้งานความแตกต่างได้โดยการตั้งค่าตัวเลือกหนึ่งหรือตัวเลือกอื่น บรรทัดคำสั่งผู้ประกอบ ความยาวสูงสุดแท็ก - 31 ตัวอักษร ตัวอย่างป้ายกำกับ: COUNT, PAGE25, $E10 ขอแนะนำให้ใช้ป้ายกำกับที่สื่อความหมายและความหมาย ชื่อรีจิสเตอร์ เช่น AX, DI หรือ AL จะถูกสงวนไว้ และใช้เพื่อระบุรีจิสเตอร์ที่เกี่ยวข้องเท่านั้น
หากป้ายกำกับอยู่ก่อนคำสั่งของตัวประมวลผล หลังจากนั้นจะมีสัญลักษณ์ “:” (โคลอน) เสมอ ซึ่งบอกให้แอสเซมเบลอร์สร้างตัวแปรด้วยชื่อนี้ซึ่งมีที่อยู่ของคำสั่งปัจจุบัน:
some_loop:

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

ส่วนรหัส
ลอดสว ; อ่านคำจากสตริง
ขวานซีเอ็มพี,7 ; ถ้าเป็น 7 - ออกจากลูป
รหัสสิ้นสุด
มาดูคำสั่งที่ทำงานโดยตรงกับป้ายกำกับและค่าต่างๆ: LABEL, EQU และ =

คำสั่งฉลาก

ประเภทฉลาก คำสั่ง LABEL จะกำหนดฉลากและระบุประเภทของฉลาก ประเภทสามารถเป็นหนึ่งใน: BYTE (ไบต์), WORD (คำ), DWORD (คำคู่), FWORD (6 ไบต์), QWORD (คำสี่เหลี่ยม), TBYTE (10 ไบต์), NEAR (ใกล้ป้ายกำกับ), FAR (ไกล) ฉลาก ). ป้ายกำกับจะได้รับค่าเท่ากับที่อยู่ของคำสั่งถัดไปหรือข้อมูลถัดไป และประเภทที่ระบุอย่างชัดเจน ขึ้นอยู่กับประเภทของคำสั่ง
mov label,0 จะเขียนไบต์ (คำ สองคำ ฯลฯ) ที่เต็มไปด้วยเลขศูนย์ลงในหน่วยความจำ และคำสั่ง
ป้ายกำกับการโทรจะทำการโทรสั้นหรือยาวไปยังรูทีนย่อย

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

คำสั่ง EQU

คำสั่ง EQU จะกำหนดค่าให้กับป้ายกำกับ ซึ่งถูกกำหนดตามผลลัพธ์ของนิพจน์จำนวนเต็มทางด้านขวา ผลลัพธ์ของนิพจน์นี้อาจเป็นจำนวนเต็ม ที่อยู่ หรือสตริงอักขระใดๆ:
ฉลากเท่ากับการแสดงออก

ความจริงเท่ากับ 1
message1 เท่ากับ "ลองอีกครั้ง $"
var2 เท่ากับ 4
ขวาน cmp ความจริง ; ขวานซีเอ็มพี1
ฐานข้อมูลข้อความ1 ; db "ลองอีกครั้ง $"
ขวาน mov,var2 ; mov ax, 4 คำสั่ง EQU มักใช้เพื่อแนะนำพารามิเตอร์ทั่วไปสำหรับทั้งโปรแกรม คล้ายกับคำสั่ง #define ของตัวประมวลผลล่วงหน้า C

คำสั่ง =

คำสั่ง = เทียบเท่ากับ EQU แต่ป้ายกำกับที่กำหนดสามารถรับได้เฉพาะค่าจำนวนเต็มเท่านั้น นอกจากนี้ ป้ายกำกับที่ระบุโดยคำสั่งนี้สามารถแทนที่ได้

แอสเซมเบลอร์แต่ละรายเสนอฉลากที่กำหนดไว้ล่วงหน้าพิเศษทั้งชุดซึ่งสามารถทำได้ วันที่ปัจจุบัน(@date หรือ ??date) ประเภทโปรเซสเซอร์ (@cpu) หรือชื่อของส่วนของโปรแกรมเฉพาะ แต่ป้ายกำกับที่กำหนดไว้ล่วงหน้าเพียงป้ายเดียวที่แอสเซมเบลอร์ทั้งหมดที่เราตรวจสอบคือ $ มันสอดคล้องกับที่อยู่ปัจจุบันเสมอ เช่น คำสั่ง

เจเอ็มพี$

ดำเนินการสาขาที่ไม่มีเงื่อนไขในตัวเอง ดังนั้นจึงสร้างลูปนิรันดร์จากคำสั่งเดียว

เพื่อให้เข้าใจเรื่องทั้งหมดนี้ได้ดีขึ้น ฉันจึงเขียนโปรแกรมขนาดเล็กขึ้นมา ยังคงเป็น “Hello World” เหมือนเดิม แต่ในรูปแบบใหม่ :) ข้อความด้านล่าง:

โปรแกรมถูกประกอบโดย TASM และ MASM แต่ไฟล์ EXE ที่ประกอบโดย MASM นั้นใหญ่กว่าหนึ่งไบต์ เราสังเกตเห็นว่าคำสั่ง mov dx,offset msg ถูกแทนที่ด้วยคำสั่ง lea dx,msgb LEA วางที่อยู่ออฟเซ็ตของข้อมูลที่ระบุใน DX เช่น ทำสิ่งเดียวกันกับคำสั่ง mov ที่มีออฟเซ็ต ฉันขอแนะนำให้ดูสิ่งนี้ภายใต้ดีบักเกอร์



ลองดูรายการประกอบอย่างละเอียดแล้วค้นหาความแตกต่าง



สิ่งที่น่าสนใจคือ TASM ได้รวบรวมคำสั่ง LEA ไว้ ในกรณีนี้เนื่องจากคำสั่ง MOV (opcode BA) และ MASM ได้รวบรวมคำสั่ง LEA ไว้ใน opcode อื่น - 8D16 ซึ่งเพิ่มขนาดโปรแกรมขึ้น 1 ไบต์ ฉันไม่รู้ว่าทำไมเขาถึงตัดสินใจทำเช่นนี้ แต่มันน่าสนใจที่จะค้นหา

ตัวประกอบ 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 สิ้นสุดโปรแกรมโดยระบุว่าควรเริ่มดำเนินการที่จุดใด

เมื่อเขียนโปรแกรมในภาษาแอสเซมบลีจะใช้คำสั่งที่ระบุตำแหน่งของโปรแกรมในหน่วยความจำให้คอมไพเลอร์กำหนดมาโครเริ่มต้นหน่วยความจำ ฯลฯ รายการคำสั่งและคำอธิบายมีอยู่ในตาราง 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 ใช้เพื่อควบคุมเอาต์พุตของรายการ

Directives คือคำสั่งควบคุมคอมไพเลอร์ คำประกาศของแต่ละคนต้องเริ่มต้นด้วยจุด การปฏิบัติแสดงให้เห็นว่าในแอสเซมเบลอร์ใดๆ มีเพียงประมาณ 10...20 คำสั่งเท่านั้นที่ถูกใช้งานอย่างเข้มข้นที่สุด คุณสมบัติอื่นๆ ทั้งหมดเป็นทางเลือกหรือรับผิดชอบในการควบคุมคุณสมบัติคอมไพเลอร์รองเท่านั้น คำสั่ง “พื้นฐาน” ซึ่งเป็นเรื่องปกติสำหรับแอสเซมบลีของโปรเซสเซอร์อื่นๆ รวมถึงคำสั่ง .equ, .org, .def, .сseg, .dseg ฯลฯ คำสั่งเช่น .dq, .exit, .listmac in โปรแกรมจริงหายากมากจริงๆ ด้านล่างนี้คือรายการ คำอธิบาย และตัวอย่างการใช้คำสั่งจากแอสเซมเบลอร์ที่เป็นกรรมสิทธิ์ของไมโครคอนโทรลเลอร์ AVR

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

Directive.include
ไวยากรณ์การเขียน:
.include "(เส้นทางไฟล์)"
ตัวอย่างการใช้งาน:

รวม "m8def.inc" ; ใส่ไฟล์ส่วนหัวมาตรฐาน

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

คำสั่งทางออก
ไวยากรณ์การเขียน:
.ออก
ตัวอย่างการใช้งาน:

ออก ;สิ้นสุดไฟล์

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

คำสั่ง nolist, .list
ไวยากรณ์การเขียน:
.nolist, .รายการ
ตัวอย่างการใช้งาน:

Nolist ;ห้ามส่งออกข้อความของไฟล์ “m8def.inc” .รวม "m8def.inc" ;ลงในรายการโปรแกรม file.list ;ส่งออกข้อมูลต่อไป

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

คำสั่ง.equ
ไวยากรณ์การเขียน:
.equ (ชื่อสัญลักษณ์) = (นิพจน์)
ตัวอย่างการใช้งาน:

Equ DDRB = 0x17 ;ตั้งชื่อ DDRB เป็น 0x17 .equ PORTB = DDRB + 1 ;ตั้งชื่อ PORTB เป็น 0x18

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

คำสั่ง.set
ไวยากรณ์การเขียน:
.set (ชื่อสัญลักษณ์) = (นิพจน์)
ตัวอย่างการใช้งาน:

ตั้งค่า OFFSET = 0x100 กำหนดชื่อ ค่าออฟเซ็ต 0x100 .

.set OFFSET = OFFSET + 1 แทนที่ค่า OFFSET คำสั่ง .def กำหนดชื่อเชิงสัญลักษณ์ให้กับหนึ่งในการลงทะเบียนวัตถุประสงค์ทั่วไป ในหลักสูตรต่อไปของโปรแกรมชื่อที่กำหนด

สามารถแทนที่ได้ด้วยคำสั่ง .undef
ไวยากรณ์การเขียน:
คำสั่ง .def, .undef
.def (ชื่อสัญลักษณ์) = (ตัวพิมพ์)
ตัวอย่างการใช้งาน:

.undef (ชื่อเชิงสัญลักษณ์)

Def temp = R16 ; กำหนด register R16 ชื่อ temp .undef temp ; ยกเลิกการใช้ชื่อ temp ต่อไป

คำสั่ง .db, .dw, .dd, .dq มีวัตถุประสงค์เพื่อสำรองหน่วยความจำไมโครคอนโทรลเลอร์สำหรับข้อมูลที่เตรียมใช้งาน ทั้งหมดสามารถใช้ได้เฉพาะในส่วนของโค้ดและหน่วยความจำ EEPROM เท่านั้น ความแตกต่างระหว่างคำสั่งเหล่านี้คือความลึกของบิตของข้อมูลที่แสดง คำสั่ง .db จะสงวนไบต์, .dw จะสงวนคำ, .dd จะสงวนคำคู่ ในบางกรณีที่พบไม่บ่อย การใช้คำสั่ง .dq ซึ่งสงวนข้อมูล 64 บิตอาจสะดวกกว่า
ไวยากรณ์การเขียน:
คำสั่ง.db, .dw, .dd, .dq
(ป้ายกำกับ): .db (ข้อมูล 8 บิต)
(ป้ายกำกับ): .dw (ข้อมูล 16 บิต)
(ป้ายกำกับ): .dd (ข้อมูล 32 บิต)
ตัวอย่างการใช้งาน:

(ป้ายกำกับ): .dq (ข้อมูล 64 บิต)

ป้ายกำกับ: .db 0xFA, 250, -6, 0b11111010 .dw 0xFADE, 64222, -1314, 0b1111101011011110 .dd 0xFADEEFCA, 4208914378, -86052918 .dq 0xFADEEFCAEFBACDEF, 8077149609196178927, -521103510453211

คำสั่ง .byte สงวนหน่วยความจำสำหรับข้อมูลที่ยังไม่ได้เตรียมใช้งานในส่วน SRAM และ EEPROM
ไวยากรณ์การเขียน:
คำสั่ง.ไบต์
ตัวอย่างการใช้งาน:

เท่ากับ PAGESIZE = 0x20 บัฟเฟอร์: . ไบต์ 2*PAGESIZE สำรอง 64 ไบต์ใน SRAM

คำสั่ง .dseg, .eseg, .cseg กำหนดจุดเริ่มต้นของข้อมูล, EEPROM และส่วนของโค้ด ตามลำดับ ในไฟล์ต้นฉบับ แต่ละเซ็กเมนต์สามารถแสดงเป็นสำเนาเดียวเท่านั้น หากคำสั่งเหล่านี้หายไปในโปรแกรม คอมไพลเลอร์โดยค่าเริ่มต้นจะถือว่าคำสั่งทั้งหมดอยู่ในส่วนของรหัส

คำสั่ง .dseg, .eseg, .cseg
ไวยากรณ์การเขียน:
.dseg
.eseg
.ซีซีจี
ตัวอย่างการใช้งาน:

Dseg ; จุดเริ่มต้นของบัฟเฟอร์ส่วนข้อมูล: . ไบต์ 32 ; สำรอง 32 ไบต์สำหรับบัฟเฟอร์ใน SRAM .cseg ; จุดเริ่มต้นของส่วนโค้ด rjmp เริ่มต้น string: .db "ATmega8",0 ;string เก็บไว้ในหน่วยความจำ FLASH.eseg ;จุดเริ่มต้นของส่วนหน่วยความจำ EEPROM _var: .byte 2 ;สำรอง 2 ไบต์สำหรับตัวแปร _var _cnst: .db 0xAA ;สำรองไบต์สำหรับตัวแปร _cnst = 0xAA

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

ไดเรกทีฟ.org
ไวยากรณ์การเขียน:
.org (ที่อยู่เริ่มต้น)
ตัวอย่างการใช้งาน:

Equ SRAM_START = 0x60 .equ RAMEND = 0x045F .dseg ;จุดเริ่มต้นของข้อมูล Segment.org SRAM_START ;สำรอง 32 ไบต์ใน SRAM สำหรับบัฟเฟอร์ บัฟเฟอร์: ไบต์ 32; เริ่มต้นที่ที่อยู่ 0x60 .cseg; จุดเริ่มต้นของรหัสเซ็กเมนต์.org 0; รีเซ็ตเวกเตอร์ที่ที่อยู่ 0 rjmp เริ่มต้น

.org 0x50 ;เริ่มโปรแกรมหลักที่ที่อยู่ 0x50 เริ่มต้น: ldi temp,สูง(RAMEND) ;การเริ่มต้นสแต็กออก SPH,temp ldi temp,ต่ำ(RAMEND) ออก SPL,temp

คำสั่ง .macro, .endmacro (.endm) กำหนดจุดเริ่มต้นและจุดสิ้นสุดของแมโครตามลำดับ
ไวยากรณ์การเขียน:
Directives.macro, .endmacro (.endm)
ตัวอย่างการใช้งาน:

.มาโคร (ชื่อมาโคร)

Macro set_bit ;การประกาศแมโครสำหรับการตั้งค่าบิตพอร์ต sbi @0,@1 ;set bit @1 ของพอร์ต register @0 sbi @0-1,@1 ;กำหนดค่าบรรทัด @1 ของ DDRx register .endm สำหรับเอาต์พุต .

set_bit PORTB,0 ; ตั้งค่าตรรกะพอร์ต B 1 บนบรรทัด 0
ไวยากรณ์การเขียน:
คำสั่ง .listmac อนุญาตให้แสดงข้อความแมโครเพิ่มเติมในไฟล์รายการ ในกรณีนี้ เนื้อหาของแต่ละคำจำกัดความของแมโครที่พบในโปรแกรมจะแสดงอย่างครบถ้วน หากไม่ได้ใช้คำสั่ง จะไม่มีการกำหนดโค้ดภายในมาโคร
ตัวอย่างการใช้งาน:

คำสั่ง.listmac

.listmac Listmac อนุญาตให้ขยายข้อความมาโครในไฟล์รายการเกี่ยวกับความคืบหน้าการเรียบเรียงโปรแกรม คำสั่ง .message จะสร้างข้อความสำหรับบรรทัดที่พบการโทร การใช้ .warning ส่งผลให้เกิดคำเตือน และ .error ส่งผลให้เกิดข้อความแสดงข้อผิดพลาด ในกรณีหลัง การสร้างโครงการจะหยุดลง

คำสั่ง .message, .warning, .error
ไวยากรณ์การเขียน:
.message "(ข้อความ)"
.warning "(ข้อความเตือน)"
.error "(ข้อความแสดงข้อผิดพลาด)"
ตัวอย่างการใช้งาน:

ข้อความ "มาโครถูกเรียกที่นี่" .warning "ความถี่สูงเกินไป!" .error "อาร์กิวเมนต์แมโครผิด!"

กลุ่มของคำสั่งการคอมไพล์แบบมีเงื่อนไข ifdef, .ifndef, .if, .else, elif, .endif ใช้สำหรับการแทรก รหัสโปรแกรมขึ้นอยู่กับ เงื่อนไขต่างๆ- คำสั่ง .ifdef จะตรวจสอบการมีอยู่ของการประกาศชื่อเชิงสัญลักษณ์ คำสั่งสามารถตามด้วยชุดคำสั่งที่จะแทรกลงในข้อความหากเงื่อนไขการทดสอบเป็น "จริง" (ชื่อได้รับการประกาศ) คำสั่ง .ifndef ตรงกันข้ามกับ .ifdef ซึ่งจะตรวจสอบว่าไม่มีการประกาศชื่อเชิงสัญลักษณ์หรือไม่ คำสั่ง .if ดำเนินการทดแทนโค้ดเมื่อตรงตามเงื่อนไขการเปรียบเทียบที่ระบุเป็นพารามิเตอร์ คำสั่งที่ต้องดำเนินการหากเงื่อนไขของคำสั่ง .if เป็น “false” จะอยู่หลังคำสั่ง .else การแตกแขนงเช่น "if" - "then" สามารถมีการซ้อนได้หลายระดับด้วยคำสั่ง .elif ทุกบล็อคตรวจสอบที่ขึ้นต้นด้วย .ifdef, .ifndef, .if จะต้องปิดด้วยคำสั่ง .endif

คำสั่ง if, .ifdef, .ifndef, .else, elif, .endif
ไวยากรณ์การเขียน:
.ifdef (อักขระ) (หรือ .ifndef (อักขระ))
.if (เงื่อนไข)
.else (นิพจน์) (หรือ .elif (เงื่อนไข))
.endif
ตัวอย่างการใช้งาน:

Macro del_ms ;มาโครที่สร้างการหน่วงเวลาใน ms.ifndef FREQ ;หากไม่ได้ประกาศค่าคงที่ FREQ (ความถี่เป็น Hz) .warning "ค่าคงที่ FREQ ที่ไม่ได้กำหนด!" ;ออกคำเตือน และ.equ FREQ = 1000000 ;กำหนดค่าเริ่มต้นเป็น 1 MHz.endif .equ DELAY = (@0*FREQ)/4000 ;ค่าการตั้งค่าการหน่วงเวลาหาก DELAY > 65535 ;หาก DELAY มากกว่า 2 ไบต์ จากนั้นเกิดข้อผิดพลาด “จำนวนเต็มล้นใน DELAY!” ;ไม่สามารถใช้งานมาโครได้ มิฉะนั้นให้กด XL ;บันทึกการลงทะเบียนการทำงาน XL, XH กด XH ldi XH,สูง(DELAY) ;รอบการหน่วงเวลา ldi XL,ต่ำ(DELAY) sbiw XH:XL,1 brne PC-1 pop XH pop XL ;คืนค่าการลงทะเบียนการทำงาน XH, XL จากสแต็ก .endif .endm .equ FREQ = 2000000 ;โฆษณาความถี่สัญญาณนาฬิกา

2 เมกะเฮิรตซ์ del_ms 25 ; การหน่วงเวลา 25 ms

กำหนดอุปกรณ์ที่จะคอมไพล์

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

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

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

คำสั่งฐานข้อมูล

ไวยากรณ์:
ป้ายกำกับ: .DB expression_list

ตัวอย่าง:
.ซีเอสอีจี
ค่าคงที่: .DB 0, 255, 0b01010101, -128, 0xaa

พารามิเตอร์ที่ส่งผ่านไปยังคำสั่งคือลำดับของนิพจน์ที่คั่นด้วยเครื่องหมายจุลภาค แต่ละนิพจน์ต้องเป็นตัวเลขในช่วง (-32768..65535) หรือ

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

ไวยากรณ์:
ป้ายกำกับ: รายการนิพจน์ .DW

ตัวอย่าง:
.ซีเอสอีจี
รายการ: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535

ไวยากรณ์:
.ENDMACRO

ตัวอย่าง:
.มาโคร SUBI16 ; การเริ่มต้นคำจำกัดความแบบมาโคร
subi r16,ต่ำ(@0) ; ลบไบต์ต่ำของพารามิเตอร์แรก
sbci r17,สูง(@0) ; ลบไบต์สูงของพารามิเตอร์แรก
.ENDMACRO

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

คำสั่ง EQU จะกำหนดค่าให้กับป้ายกำกับ ป้ายกำกับนี้สามารถนำมาใช้ในนิพจน์ได้ในภายหลัง ป้ายกำกับที่มีค่าที่กำหนดโดยคำสั่งนี้ไม่สามารถเป็นได้

ถูกกำหนดใหม่และค่าของมันไม่สามารถเปลี่ยนแปลงได้

ไวยากรณ์:
.EQU label = การแสดงออก

ตัวอย่าง:
.EQU io_offset = 0x23
.EQU พอร์ต = io_offset + 2

ซีเอสอีจี ; จุดเริ่มต้นของส่วนข้อมูล
clr r2 ; ล้างการลงทะเบียน r2
ออกพอร์ตา,r2 ; เขียนถึงพอร์ต A

ESEG – ส่วน EEPROM

คำสั่ง ESEG กำหนดจุดเริ่มต้นของส่วน EEPROM ไฟล์ต้นฉบับอาจประกอบด้วยเซ็กเมนต์ EEPROM หลายส่วน ซึ่งรวมกันเป็นเซ็กเมนต์เดียวในระหว่างการคอมไพล์

ส่วน EEPROM มักจะประกอบด้วยคำสั่งเท่านั้น

href="#DW - กำหนดคำคงที่ในหน่วยความจำโปรแกรมและ EEPROM">DW

และเครื่องหมาย ส่วน EEPROM มีของตัวเอง

ตัวนับตำแหน่งไบต์ สามารถใช้คำสั่งในการวางได้

ตัวแปรในตำแหน่งที่ต้องการใน EEPROM คำสั่งไม่มีพารามิเตอร์

ไวยากรณ์:
.ESEG

ตัวอย่าง:
var1: .ไบต์ 1 ; สำรอง 1 ไบต์สำหรับ var1
ตาราง: .BYTE tab_size ; สำรองไบต์ tab_size

สคส
eevar1: .DW 0xffff ; เริ่มต้น 1 คำใน EEPROM

EXIT – ออกจากไฟล์

ที่ได้พบกัน คำสั่งออกคอมไพเลอร์หยุดการคอมไพล์ ไฟล์นี้- หากมีการใช้คำสั่งในไฟล์ที่แนบมา (ดูคำสั่ง

href="#INCLUDE - รวมไฟล์อื่น">รวม

) จากนั้นการคอมไพล์จะดำเนินต่อไปจากบรรทัดตามคำสั่ง INCLUDE

หากไฟล์ไม่ได้ซ้อนกัน การคอมไพล์จะหยุดลง

ไวยากรณ์:
.ออก

ตัวอย่าง:
.ออก ; ออกจากไฟล์นี้

รวม – แนบไฟล์อื่น

เมื่อพบคำสั่ง INCLUDE คอมไพลเลอร์จะเปิดไฟล์ที่ระบุในนั้น คอมไพล์จนกว่าไฟล์จะสิ้นสุดหรือพบคำสั่ง

href="#EXIT - ออกจากไฟล์นี้">ออก

จากนั้นจึงรวบรวมไฟล์เริ่มต้นจากบรรทัดตามคำสั่งต่อไป

รวม. ไฟล์ที่แนบมาอาจมีคำสั่ง INCLUDE

ไวยากรณ์:
.รวม "ชื่อไฟล์"

ตัวอย่าง:
- ไฟล์ iodefs.asm:
.EQU sreg = 0x3f ; สถานะการลงทะเบียน
.EQU sphigh = 0x3e ; สแต็คพอยน์เตอร์ไบต์สูง
.EQU ไหล = 0x3d ; ไบต์ต่ำของตัวชี้สแต็ก

- ไฟล์ incdemo.asm
.รวม iodefs.asm ; คำจำกัดความของพอร์ต Nest
ใน r0, sreg ; อ่านสถานะการลงทะเบียน

LIST – เปิดใช้งานการสร้างรายชื่อ

คำสั่ง LIST บอกให้คอมไพเลอร์สร้างรายการ รายการนี้เป็นการผสมผสานระหว่างรหัสแอสเซมบลี ที่อยู่ และรหัส opcode โดย

ตามค่าเริ่มต้น การสร้างรายการจะถูกเปิดใช้งาน แต่คำสั่งนี้จะใช้ร่วมกับคำสั่งในการรับรายการ แต่ละส่วนไฟล์ต้นฉบับ

ไวยากรณ์:
.รายการ

ตัวอย่าง:

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

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

พารามิเตอร์

ไวยากรณ์:
.ลิสท์แมค

ตัวอย่าง:
.มาโคร MACX ; คำจำกัดความของมาโคร
เพิ่ม r0,@0 ; ตัวมาโคร
หรือ r1,@1

ลิสต์แมค; เปิดใช้งานการขยายมาโคร
แมคเอ็กซ์ r2,r1 ; การเรียกแมโคร (เนื้อความของแมโครจะแสดงในรายการ)

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

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

คอมไพเลอร์จะแทนที่ชื่อนี้ด้วยเนื้อความของมาโคร มาโครสามารถมีพารามิเตอร์ได้สูงสุด 10 ตัว ซึ่งเข้าถึงได้ผ่าน @0-@9 ในส่วนเนื้อหา เมื่อเรียก พารามิเตอร์จะแสดงรายการ

คั่นด้วยเครื่องหมายจุลภาค คำนิยามแมโครลงท้ายด้วยคำสั่ง

ตามค่าเริ่มต้น เฉพาะการเรียกแมโครเท่านั้นที่จะรวมอยู่ในรายการ เมื่อต้องการขยายแมโคร คุณต้องใช้คำสั่ง มาโครในรายการจะแสดงด้วยเครื่องหมาย +

ไวยากรณ์:
ชื่อมาโคร .MACRO

ตัวอย่าง:
.มาโคร SUBI16 ; จุดเริ่มต้นของคำจำกัดความมาโคร
ย่อย @1,ต่ำ(@0) ; ลบไบต์ต่ำของพารามิเตอร์ 0 จากพารามิเตอร์ 1
sbci @2,สูง(@0); ลบไบต์สูงของพารามิเตอร์ 0 จากพารามิเตอร์ 2
.ENDMACRO ; จุดสิ้นสุดของคำจำกัดความของแมโคร

ซีเอสอีจี; เริ่มต้นส่วนของโปรแกรม
SUBI16 0x1234,r16,r17 ; ลบ 0x1234 จาก r17:r16

NOLIST – ปิดการใช้งานการสร้างรายชื่อ

คำสั่ง NOLIST บอกให้คอมไพเลอร์หยุดสร้างรายการ รายการประกอบด้วยรหัสประกอบ ที่อยู่ และ

รหัสการดำเนินงาน ตามค่าเริ่มต้น การสร้างรายการจะถูกเปิดใช้งาน แต่สามารถปิดใช้งานได้ด้วยคำสั่งนี้ นอกจากนี้ยังสามารถใช้คำสั่งนี้ได้

พร้อมด้วยคำสั่งให้รับรายการชิ้นส่วนแต่ละชิ้น

ไฟล์ต้นฉบับ

ไวยากรณ์:
.โนลิส

ตัวอย่าง:
.โนลิส ; ปิดการใช้งานการสร้างรายการ
.รวม "macro.inc" ; ไฟล์แนบจะไม่เป็น
.รวม "const.def" ; แสดงอยู่ในรายการ
.รายการ ; เปิดใช้งานการสร้างรายการ

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

คำสั่ง ORG ตั้งค่าตัวนับตำแหน่งเป็นค่าที่กำหนด ซึ่งถูกส่งผ่านเป็นพารามิเตอร์ สำหรับส่วนข้อมูล จะตั้งค่าตัวนับตำแหน่งเป็น

SRAM (RAM) สำหรับส่วนของโปรแกรม นี่คือตัวนับโปรแกรม และสำหรับส่วนของ EEPROM นี่คือตำแหน่งใน EEPROM หากคำสั่งนำหน้าด้วยป้ายกำกับ (ในบรรทัดเดียวกัน) แล้ว

ป้ายกำกับถูกวางไว้ตามที่อยู่ที่ระบุในพารามิเตอร์คำสั่ง ก่อนที่จะเริ่มการคอมไพล์ ตัวนับโปรแกรมและตัวนับ EEPROM จะเท่ากับศูนย์ และตัวนับ RAM จะเท่ากับ 32

(เนื่องจากที่อยู่ 0-31 ถูกครอบครองโดยการลงทะเบียน) โปรดทราบว่าตัวนับไบต์ใช้สำหรับ RAM และ EEPROM และใช้ตัวนับแบบคำต่อคำสำหรับส่วนของโปรแกรม

ไวยากรณ์:
นิพจน์ .ORG

ตัวอย่าง:
.ดีเอสอีจี ; จุดเริ่มต้นของส่วนข้อมูล

องค์กร 0x37 ; ตั้งค่าที่อยู่ SRAM เป็น 0x37
ตัวแปร: .BYTE 1 ; จองไบต์ตามที่อยู่ 0x37H

ซีเอสอีจี
.ORG 0x10 ; ตั้งตัวนับโปรแกรมเป็น 0x10
มอฟ r0,r1 ; คำสั่งนี้จะอยู่ที่ที่อยู่ 0x10

SET – ตั้งค่าตัวแปรเชิงสัญลักษณ์ที่เทียบเท่ากับนิพจน์

สั่ง SET กำหนดค่าให้กับชื่อ ชื่อนี้สามารถนำไปใช้ในนิพจน์ได้ในภายหลัง ยิ่งกว่านั้นตรงกันข้ามกับคำสั่ง

href="#EQU - ตั้งค่าสัญลักษณ์เท่ากับนิพจน์">EQU

ค่าของชื่อสามารถเปลี่ยนแปลงได้โดยคำสั่ง SET อื่น

ไวยากรณ์:
ชื่อ .SET = การแสดงออก

ตัวอย่าง:
.SET io_offset = 0x23
.SET porta = io_offset + 2

ซีเอสอีจี; จุดเริ่มต้นของส่วนรหัส
clr r2 ; ล้างทะเบียน 2