Operating System 2

Download Report

Transcript Operating System 2

Computer Architecture
and Assembly Language
By Juthawut Chantharamalee
Suan Dusit Rajabhat University (Computer Science)
1
บทที่ 8 โปรแกรมภาษาแอสเซมบลีเบื้องต้น
(Assembly Language Progamming)
บทที่ 2
Suan Dusit Rajabhat University (Computer Science)
2
การประกาศข้อมูล
 การประกาศข้อมูลหรือตัวแปรในโปรแกรมภาษาแอสเซมบลีนนั้ ทาได้โดยประกาศจองเนือ้
ทีใ่ นหน่วยความจาในเซกเมนต์ขอ้ มูล แล้วตัง้ เลเบลของข้อมูลนัน้ ไว้ ในการอ้างถึงข้อมูลใน
หน่วยความจาตาแหน่งนัน้ เราสามารถอ้างโดยใช้เลเบลทีเ่ ราประกาศไว้ได้ ดังนัน้ การ
ประกาศตัวแปรหรือข้อมูลนัน้ จะมีลกั ษณะเช่นเดียวกับการประกาศเลเบลนัน่ เอง
Suan Dusit Rajabhat University (Computer Science)
3
คาสั่งเทียมในการประกาศข้อมูล
 คาสัง่ เทียมทีเ่ ราใช้ในการประกาศข้อมูลมีหลายคาสัง่ ดังตารางที่ 8.1 คาสัง่ เทียม
เหล่านีใ้ ช้ในระบุขนาดในการจองหน่วยความจา
ตารางที่ 8.1 คาสัง่ เทียมสาหรับการระบุขนาดข้อมูลในการจองหน่วยความจา
ในการประกาศจองข้อมูลนีจ้ ะทาให้ assembler กันเนือ้ ทีใ่ นเซกเมนต์นนั้ ตามข้อมูลทีร่ ะบุตามหลัง
คาสัง่ เทียมเหล่านี้ โดยจะกันหน่วยความจาทีม่ ขี นาดของแต่ละหน่วยตามทีร่ ะบุในคาสัง่
Suan Dusit Rajabhat University (Computer Science)
4
รูปแบบของการประกาศข้อมูล
ในการประกาศข้อมูล (ตัวแปร) เรามักประกาศในเซกเมนต์ขอ้ มูล โดยเราจะระบุชอื่ ของตัว
แปรนัน้ พร้อมทัง้ คาสัง่ เทียมทีใ่ ช้ระบุขนาดของข้อมูล จากนัน้ เราจะระบุขอ้ มูลต่าง ๆ ทีจ่ ะใช้
ตาแหน่งทีจ่ ะจองนัน้ รูปแบบในการระบุเป็ นดังนี้
variable_name
Dx data
Suan Dusit Rajabhat University (Computer Science)
5
รูปแบบของการประกาศข้อมูล
ส่วนของโปรแกรมที่ 8.1 การประกาศข้อมูล
ตัวอย่างการประกาศข้อมูล
จากการประกาศข้อมูลในส่วนของโปรแกรมที่ 8.2 จะมีการจัดสรรเนือ้ ทีใ่ นหน่วยความจา
ดังรูปที่ 8.1 สังเกตว่าในการประกาศ data1 กับ data2 นัน้ การระบุขอ้ มูลเหมือนกัน
แต่ขนาดของข้อมูลต่างกัน ทาให้การจองเนือ้ ทีใ่ นหน่วยความจาแตกต่างกันด้วย
Suan Dusit Rajabhat University (Computer Science)
6
รูปแบบของการประกาศข้อมูล
ส่วนของโปรแกรมที่ 8.2 ตัวอย่างการประกาศข้อมูล
Suan Dusit Rajabhat University (Computer Science)
7
การระบุไม่ระบุค่าของข้อมูลที่จองเนื้อที่
เราสามารถประกาศจองหน่วยความจาโดยไม่ระบุค่าเริม่ ต้นได้โดยการระบุค่าเป็ น ‘?’
ดังเช่นในส่วนของโปรแกรมที่ 8.3 จะมีการจองเนือ้ ทีไ่ ว้แต่ไม่มกี ารกาหนดค่าเริม่ ต้น
data5 db ?
data6 dw ?
ส่วนของโปรแกรมที่ 8.3 การใช้จองหน่วยความจาโดยไม่ระบุค่าเริม่ ต้น
เราสามารถใช้คาสั่งเทียม dup เพือ่ บอกการซ้ากันของข้อมูลได้ รูปแบบของคาสัง่
เทียม dup มีดงั นี้
count dup (value)
Suan Dusit Rajabhat University (Computer Science)
8
การประกาศข้อมูลที่ซ้ ากัน
ตัวอย่างของการประกาศทีใ่ ช้คาสัง่ เทียม dup ดังเช่นในส่วนของโปรแกรมที่ 8.4
ส่วนของโปรแกรมที่ 8.4 การใช้คาสัง่ เทียม dup
Assembler จะจองหน่วยความจาขนาด 10 ไบต์ ทีม่ คี ่าเป็ น 0 และจะให้เลเบล data7 ชีไ้ ปที่
ตาแหน่งเริม่ ต้นของข้อมูลนี้ ในส่วนของ data8 จะเป็ นข้อมูลแบบไบต์จานวน 4x5 ไบต์ ทีม่ คี ่าเท่ากับ
0 เช่นเดียวกัน สังเกตว่าภายในเครือ่ งหมายวงเล็บของคาสัง่ เทียม dup เราสามารถใส่ขอ้ มูลได้หลาย
ค่า รวมทัง้ กาหนดค่าแบบซ้ากันโดยใช้คาสัง่ dup อีกได้ ดังเช่นตัวแปร data9 ในตัวแปร
data10 เป็ นการประกาศจองหน่วยความจาไว้โดยไม่ระบุค่าเริม่ ต้น
Suan Dusit Rajabhat University (Computer Science)
9
การอ้ างใช้ข้อมูลที่ประกาศไว้
 ในการอ้างใช้ขอ้ มูลหรือตัวแปรทีป่ ระกาศไว้ เราสามารถอ้างโดยใช้ชอื่ ของเลเบลทีป่ ระกาศ
ไว้ได้ Assembler จะจัดการนาตาแหน่งของข้อมูลนัน้ มาแทนค่าให้โดยอัตโนมัต ิ
เรายังสามารถอ้างค่าในหน่วยความจาโดยอ้างสัมพัทธ์ กบั เลเบลทีเ่ รากาหนดขึน้ ได้ ส่วน
ของโปรแกรมที่ 8.5 เป็ นโปรแกรมทีอ่ ้างใช้ค่าของตัวแปรทีเ่ รากาหนดในส่วนของ
โปรแกรมที่ 8.2 โดยหลังจากการทางานของโปรแกรมค่าในหน่วยความจาจะเปลีย่ นไป
ตามรูปที่ 8.2
Suan Dusit Rajabhat University (Computer Science)
10
การอ้ างใช้ข้อมูลที่ประกาศไว้
โปรแกรมที่ 8.5 เป็ นโปรแกรมทีอ่ ้างใช้ค่าของตัวแปรทีเ่ รากาหนดในส่วนของโปรแกรมที่ 8.2
Suan Dusit Rajabhat University (Computer Science)
11
การอ้ างใช้ข้อมูลที่ประกาศไว้
ค่าในรีจสิ เตอร์ AL BX และ CL มีค่าเป็ น 01h 01h และ 00h ตามลาดับ สังเกตว่า
ในการกาหนดค่าคงทีใ่ ห้กบั ตัวแปรในหน่วยความจาเรากระทาได้ทนั ทีโดยไม่ต้องระบุ ขนาด เนือ่ งจากในการ
ประกาศตัวแปรเราได้ระบุกบั assembler แล้วว่าจะเป็ นตัวแปรขนากเท่าใด. แต่ในกรณีทเี่ ราต้องการ
จะอ้างแตกต่างจากทีเ่ ราระบุกส็ ามารถกระทาได้โดยต้องระบุขนาดของข้อมูลกากับด้วย เช่นในคาสัง่
mov cl, byte ptr data4[2] เป็ นการอ้างข้อมูลแบบ 8 บิต เพราะ CL เป็ นรีจสิ เตอร์
ขนาด 8 บิต
Suan Dusit Rajabhat University (Computer Science)
12
การอ้ างตาแหน่งของข้อมูล
เราสามารถอ้างถึงออฟเซ็ตของข้อมูลทีเ่ ราประกาศไว้ได้โดยใช้คาสัง่ เทียม OFFSET
ดังส่วนของโปรแกรมที่ 8.6
mov bx,offset data1
;bx = offset
mov byte ptr [bx],10h
mov bx,data2
;bx = value at data2
ส่วนของโปรแกรมที่ 8.6 การอ้างตาแหน่งของข้อมูล
Suan Dusit Rajabhat University (Computer Science)
13
การอ้ างตาแหน่งข้อมูลโดยคิดสัมพัทธ์กับรีจิสเตอร์ BX
นอกจากการระบุตาแหน่งสัมพัทธ์ กบั เลเบลโดยใช้ค่าคงทีแ่ ล้ว เราสามารถระบุตาแหน่งของข้อมูล
สัมพันธ์ กบั เลเบลโดยใช้ค่าจากรีจสิ เตอร์ BX ได้ ตัวอย่างเช่นส่วนของโปรแกรมที่ 8.7
ส่วนของโปรแกรมที่ 8.7 การอ้างตาแหน่งของข้อมูลสัมพัทธ์ กบั เลเบลโดยใช้ค่าจากรีจสิ เตอร์ BX
ในคาสัง่ mov ก่อนบรรทัดที่ 5 เราอ้างหน่วยความจาโดยสัมพันธ์กบั data3 และค่าใน BX แต่
ในคาสัง่ mov บรรทัดสุดท้ายของส่วนของโปรแกรมที่ 8.7 เราอ้างหน่วยความจาสัมพันธ์กบั BX
ซึง่ เก็บออฟเซ็ตของ data3
Suan Dusit Rajabhat University (Computer Science)
14
การประกาศข้อมูลสาหรับการใช้บริการของ DOS หมายเลข 09h แะละ 0Ah
ฟั งก์ชนั่ หมายเลข 09h และ 0Ah ของ DOS เป็ นฟั งก์ชนั่ ทีต่ ้องมีการส่งแอดเดรสของข้อมูลใน
หน่วยความจา การประกาศข้อมูลสาหรับฟั งก์ชนั่ หมายเลข 09h จะไม่มคี วามซับซ้อนมากนัก แต่
สาหรับฟั งก์ชนั่ หมายเลข 0Ah การประกาศข้อมูลทีเ่ หมาะสมจะทาให้เราเขียนโปรแกรมได้ง่ายมากขึน้
การใช้บริการของ DOS หมายเลข 09h : การพิมพ์ข้อความ
ฟั งก์ชนั่ หมายเลข 09h นีร้ บั ข้อมูลป้ อนเข้าคือ :
ส่วนของโปรแกรมที่ 8.8 ตัวอย่างการประกาศข้อมูลสาหรับการใช้บริการของ DOS หมายเลข09h
Suan Dusit Rajabhat University (Computer Science)
15
การประกาศข้อมูลสาหรับการใช้บริการของ DOS หมายเลข 09h แะละ 0Ah
การใช้บริการของ DOS หมายเลข 09h : การพิมพ์ข้อความ
ฟั งก์ชนั่ หมายเลข 09h นีร้ บั ข้อมูลป้ อนเข้าคือ :
เราสามารถสัง่ แสดงข้อมูลดังกล่าวได้โดย
mov ah,09h
mov dx,offset mesg
int
21h
ส่วนของโปรแกรมที่ 8.9 ตัวอย่างการการใช้บริการของ DOS หมายเลข 09h
อักขระหมายเลข 10 (Line feed) และ 13 (Carriage Return) คือรหัสควบคุ มใช้ในการสัง่ ให้
ขึ้นบรรทัดใหม่
Suan Dusit Rajabhat University (Computer Science)
16
การประกาศข้อมูลสาหรับการใช้บริการของ DOS หมายเลข 09h แะละ 0Ah
การใช้บริการของ DOS หมายเลข 0Ah : การอ่ านข้อความ
ฟั งก์ชนั่ นีจ้ ะอ่านข้อความจากผู ใ้ ช้จนกระทัง่ ผู ใ้ ช้กดปุ่ม Enter โดยข้อมูลป้ อนเข้าจะต้องระบุตาแหน่ง
ของหน่วยความจาทีใ่ ช้เก็บข้อมูล (บัฟเฟอร์ ) ของข้อความ ฟั งก์ชนั่ หมายเลข 0Ah นีร้ บั ข้อมูล
ป้ อนเข้าคือ
AH
= 0Ah
DS : DX
= ตาแหน่งของหน่วยความจาทีจ่ ะใช้เก็บข้อความ (บัฟเฟอร์ )
บัฟเฟอร์จะต้องมีรูปแบบดังนี้
1. ไบต์แรกของหน่วยความจาเก็บค่าความยาวสูงสุดของข้อความทีอ่ ่านได้ ความยาวนี้จะรวมรหัสขึน้
บรรทัดใหม่ด้วย
2. DOS จะเขียนความยาวจริงของข้อความทีอ่ ่านเข้ามาได้ในไบต์ทสี่ อง
Suan Dusit Rajabhat University (Computer Science)
17
การประกาศข้อมูลสาหรับการใช้บริการของ DOS หมายเลข 09h แะละ 0Ah
การใช้บริการของ DOS หมายเลข 0Ah : การอ่ านข้อความ
3. สาหรับไบต์ถดั ๆ ไปจะเป็ นรหัสแอสกีของข้อความทีอ่ ่านเข้ามา
การประกาศข้อมูลสาหรับการเรียกใช้ฟังก์ชนั่ นีจ้ ะสามารถประกาศได้ดงั ส่วนของโปรแกรมที่ 8.10
dseg
segment
maxlen db 30
; Maximum of 30 chars
msglen db ?
; 2nd byte contains the real length
msg
db 30 dup (?) ; Message recieved
dseg ends
ส่วนของโปรแกรมที่ 8.10 ตัวอย่างการประกาศข้อมูลสาหรับการใช้บริการของ DOS หมายเลข 0Ah
Suan Dusit Rajabhat University (Computer Science)
18
การประกาศข้อมูลสาหรับการใช้บริการของ DOS หมายเลข 09h แะละ 0Ah
การใช้บริการของ DOS หมายเลข 0Ah : การอ่ านข้อความ
เมือ่ เราเรียกใช้บริการหมายเลข 0Ah เราจะส่งตาแหน่งของ maxlen ซึง่ เป็ น
ตาแหน่งเริม่ ต้นของบัฟเฟอร์ทเี่ ราประกาศไปให้กบั DOS จากนัน้ เราสามารถอ่านความ
จริงของข้อความทีอ่ ่านมาได้ทางตัวแปร msglen ตัวอย่างโปรแกรมที่ 8.11
แสดงการใช้งานบริการหมายเลข 0Ah ในการอ่านข้อความและแสดงข้อความนัน้ ออกมา
โดยใช้บริการหมายเลข 09h
Suan Dusit Rajabhat University (Computer Science)
19
การประกาศข้อมูลสาหรับการใช้บริการของ DOS หมายเลข 09h แะละ 0Ah
การใช้บริการของ DOS หมายเลข 0Ah : การอ่ านข้อความ
ในการรับข้อความนัน้ บริการหมายเลข 0Ah จะเก็บอักขระขึน้ บรรทัดใหม่ให้ด้วย
ดังนัน้ เราจะต้องเพือ่ ขนาดบัฟเฟอร์ทจี่ ะให้เก็บข้อความไว้ 1 ไบต์ด้วย แต่ในการคืนค่า
ความยาวของข้อความมาให้ บริการหมายเลข 0Ah นีจ้ ะใส่ความยาวทีไ่ ม่รวมอักขระขึน้
บรรทัดใหม่น้ ี เมือ่ เรารับข้อความเสร็จแล้ว เคอร์เซอร์จะอยู่ทตี่ ้นบรรทัดทีเ่ ราป้ อนข้อความ
นัน้ ดังนัน้ ถ้าเราพิมพ์ขอ้ ความเดิมซ้าไปอีกครัง้ จะทาให้ขอ้ ความทับกันและจะไม่ทราบว่ามี
การพิมพ์ขอ้ ความออกมาอย่างถูกต้องหรือไม่ ดังนัน้ เราจึงใช้ฟังก์ชนั่ หมายเลข 09h
สัง่ พิมพ์ชุดอักขระสาหรับการขึน้ บรรทัดใหม่ก่อนทีจ่ ะสัง่ พิมพ์ขอ้ ความทีร่ บั มา
Suan Dusit Rajabhat University (Computer Science)
20
การประกาศข้อมูลสาหรับการใช้บริการของ DOS หมายเลข 09h แะละ 0Ah
ข้อความทีส่ งั่ พิมพ์ด้วยบริการหมายเลข 09h จะต้องจบด้วยอักขระ ‘$’ ดังนัน้ เราจึงต้อง
กาหนดค่าในไบต์สุดท้ายของข้อความทีร่ บั มาด้วยอักขระ ‘$’ โปรแกรมนีจ้ ะทางานผิดพลาดถ้าภายใน
ข้อความมีเครือ่ งหมาย ‘$’ อยู่ด้วย
Suan Dusit Rajabhat University (Computer Science)
21
The End
Lesson 8
Suan Dusit Rajabhat University (Computer Science)
22