เซกเมนต์ Segment
Digital logic | OS | คำสั่งดอส | Batch | Debug | Assembly | GWBasic | Docker |
    ภาษา Assembly จะแบ่ง Segment ออกเป็น 4 ส่วน
  1. เซกเมนต์ข้อมูล (Data Segment)
    มี Directive segment ในภาษา assembly คือ .data เป็นเซกเมนต์ที่เก็บข้อมูลของโปรแกรม มักถูกอ้างอิงด้วยรีจิสเตอร์ DS
  2. เซกเมนต์คำสั่ง (Code Segment)
    มี Directive segment ในภาษา assembly คือ .code เป็นเซกเมนต์ที่เก็บคำสั่งโปรแกรมทั้งหมด มักทำงานร่วมกับรีจิสเตอร์ชี้คำสั่ง IP ซึ่งเป็นออฟเซตในการชี้ตำแหน่งคำสั่ง
  3. เซกเมนต์สแตก (Stack Segment)
    มี Directive segment ในภาษา assembly คือ .stack เป็นเซกเมนต์ที่เป็นหน่วยความจำแสตก การใช้หน่วยความจำส่วนนี้เป็นแบบ Last in first out (LIFO) ใช้ร่วมกับรีจิสเตอร์ SP หรือตัวชี้แสตก
  4. เซกเมนต์พิเศษ (Extra Segment)
    เป็นเซกเมนต์ที่เป็นหน่วยความจำพิเศษ ใช้ร่วมกับรีจิสเตอร์ DI
    การเขียนโปรแกรมจะแบ่งออกเป็น 4 ส่วน
  1. ลาเบล หรือ ชื่อ (Label or Name) หมายถึง ตำแหน่งอ้างอิงในโปรแกรม
  2. โอเปอเรชัน (Operation) หรือนีโมนิค (Mnemonic) หมายถึง คำสั่งดำเนินการ
  3. โอเปอแรนด์ (Operand) หมายถึง ตัวถูกดำเนินการ
  4. คอมเมนต์ (Comment) หมายถึง หมายเหตุ
Name Operation Operand Comment
x: mov ah,08; Wait Character
int21
mov ah,4c; Program Stop
int21
:: โปรแกรมนี้เป็นการกำหนด 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

:: โปรแกรมนี้เป็นการกำหนด segment แบบเดิม
:: นำ seg3.asm มาปรับให้สั้นลง
seg4.asm : พิมพ์อักษร 1 - 5 แล้วเลิกการทำงาน
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 เข้าไปจากตัวอย่างข้างต้น
seg5.asm : พิมพ์ cburin rujjanapan แล้วเลิกการทำงาน
      .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