เซกเมนต์สแตก (Stack Segment) มี Directive segment ในภาษา assembly คือ .stack เป็นเซกเมนต์ที่เป็นหน่วยความจำแสตก การใช้หน่วยความจำส่วนนี้เป็นแบบ Last in first out (LIFO) ใช้ร่วมกับรีจิสเตอร์ SP หรือตัวชี้แสตก
เซกเมนต์พิเศษ (Extra Segment) เป็นเซกเมนต์ที่เป็นหน่วยความจำพิเศษ ใช้ร่วมกับรีจิสเตอร์ DI
การเขียนโปรแกรมจะแบ่งออกเป็น 4 ส่วน
ลาเบล หรือ ชื่อ (Label or Name) หมายถึง ตำแหน่งอ้างอิงในโปรแกรม
:: โปรแกรมนี้เป็นการกำหนด segment แบบเดิม
:: ผลของโปรแกรมนี้คือ ตัวอักษร c เพราะตัวอักษร a คือ 61h
seg1.asm : โปรแกรมพิมพ์อักษร a ด้วย int 21 บริการ ah=2
sseg segment
db 64 dup(?)
sseg ends
dseg segment
a db 61h
dseg ends
cseg segment
main proc far
assume cs:cseg,ds:dseg,ss:sseg
mov ax,dseg
mov ds,ax
mov dl,a
mov ah,2h
int 21h
mov ah,4ch
int 21h
main endp
cseg ends
end main
:: โปรแกรมนี้เป็นการกำหนด segment แบบเดิม
:: ผลของโปรแกรมนี้คือ ตัวอักษร c เพราะตัวอักษร a คือ 61h
seg2.asm : โปรแกรมพิมพ์อักษร ที่เกิดจากคำสั่ง add register al และ bl
sseg segment
db 64 dup(?) ; กำหนดที่ว่าง 64 byte
sseg ends
dseg segment
data1 db 31h
data2 db 32h
sum db ?
dseg ends
cseg segment
main proc far
assume cs:cseg,ds:dseg,ss:sseg
mov ax,dseg
mov ds,ax
mov al,data1
mov bl,data2
add al,bl
mov sum,al
mov dl,sum
mov ah,2
int 21h
mov ah,4ch
int 21h
main endp
cseg ends
end main
:: โปรแกรมนี้เป็นการกำหนด segment แบบเดิม
:: ผลของโปรแกรมนี้คือ ตัวอักษร a ถึง z แล้ววนกลับมา a อีก
seg3.asm : พิมพ์อักษร 1 ตัว รอรับ any key พิมพ์ถึง z แล้ววนมา a ใหม่ หยุดเมื่อกด Ctrl-C
sseg segment
db 64 dup(?) ; กำหนดที่ว่าง 64 byte
sseg ends
dseg segment
data1 db 60h
data2 db 01h
sum db ?
dseg ends
cseg segment
main proc far
assume cs:cseg,ds:dseg,ss:sseg
mov ax,dseg
mov ds,ax
mov al,data1
mov bl,data2
burin:
add al,01h
mov sum,al
mov dl,sum
mov ah,2h
int 21h
mov ah,08h
int 21h
mov al,sum
cmp al,7ah
jne burin
mov al,60h
jmp burin
main endp
cseg ends
end main
sseg segment
db 64 dup(?) ; กำหนดที่ว่าง 64 byte
sseg ends
dseg segment
data db 30h
sum db ?
dseg ends
cseg segment
main proc far
assume cs:cseg,ds:dseg,ss:sseg
mov ax,dseg
mov ds,ax
mov al,data
burin:
add al,01h
mov sum,al
mov dl,sum
mov ah,2h
int 21h
mov al,sum
cmp al,35h
jne burin
mov ah,4ch
int 21h
main endp
cseg ends
end main
:: โปรแกรมนี้เป็นการกำหนด segment แบบใหม่ และง่ายกว่า
:: ผลของโปรแกรมนี้คือ ตัวอักษร c เพราะตัวอักษร a คือ 61h และเพิ่มการพิมพ์ String เข้าไปจากตัวอย่างข้างต้น
.model small
.stack 64h
.data
data1 db 31h
data2 db 32h
data3 db 'burin rujjanapan $'
sum db ?
.code
main proc
mov ax,@data
mov ds,ax
mov al,data1
mov bl,data2
add al,bl
mov sum,al
mov dl,sum
mov ah,2
int 21h
lea dx,data3
mov ah,9
int 21h
mov ah,4ch
int 21h
main endp
end main
"Imagination is more important than knowledge" - Albert Einstein