โปรแกรมภาษาแอสเซมบลี้เบือ้ งต้ น ธนาวินท์ รักธรรมานนท์ [email protected] หัวข้อในวันนี้      รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบเก่า รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบใหม่ การเรี ยกใช้บริ การของ DOS ขั้นตอนการแปลโปรแกรม ตัวอย่างโปรแกรม.

Download Report

Transcript โปรแกรมภาษาแอสเซมบลี้เบือ้ งต้ น ธนาวินท์ รักธรรมานนท์ [email protected] หัวข้อในวันนี้      รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบเก่า รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบใหม่ การเรี ยกใช้บริ การของ DOS ขั้นตอนการแปลโปรแกรม ตัวอย่างโปรแกรม.

โปรแกรมภาษาแอสเซมบลี้เบือ้ งต้ น
ธนาวินท์ รักธรรมานนท์
[email protected]
หัวข้อในวันนี้





รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบเก่า
รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบใหม่
การเรี ยกใช้บริ การของ DOS
ขั้นตอนการแปลโปรแกรม
ตัวอย่างโปรแกรม
2
รู ปแบบของโปรแกรมภาษาแอสเซมบลี้
การโปรแกรมภาษาแอสเซมบลี้จะเขียนโปรแกรมบน
เซกเมนต์ต่าง ๆ
 การประกาศในเซกเมนต์ต่าง ๆ จะใช้สาหรับกาหนดข้อมูล,
ขนาดของสแต็กซ์และคาสัง่ ในการโปรแกรม

3
ตัวอย่างโปรแกรมภาษาแอสเซมบลี้
; This program prints the message ”Hello world”
dseg
msg1
dseg
sseg
sseg
cseg
segment
db ’Hello world’,10h,13h,’$’
ends
segment stack
db
100 dup (?)
ends
segment
assume cs:cseg,ds:dseg,ss:sseg
start:
cseg
mov ax,dseg
;set DS
mov ds,ax
mov ah,9h
;print message
mov dx,offset msg1
int 21h
mov ax,4c00h
;exit program
int 21h
ends
end start
4
คำสั่ งเทียม
เป็ นคาสัง่ ที่ผเู ้ ขียนโปรแกรมเขียนเพื่อระบุให้ assembler แปล
โปรแกรมในรู ปแบบที่ตอ้ งการ
 เป็ นคาสัง่ กลุ่มที่ไม่ปรากฏในรหัสคาสัง่ ภาษาเครื่ อง เช่น
คาสัง่ segment , db , และ assume เป็ นต้น

5
กำรประกำศเซกเมนต์


ในโปรแกรมภาษาแอสเซมบลี้เราสามารถประกาศเซกเมนต์ได้โดย
ใช้คาสัง่ เทียม segment
การโปรแกรมทัว่ ไปจะประกาศเซกเมนต์ท้ งั สิ้ น 3 เซกเมนต์
•
•
•
dseg ใช้ในการจองพื้นที่สาหรับตัวแปร
sseg ใช้ในการจองพื้นที่สาหรับสแต็กซ์
cseg เป็ นเซกเมนต์หลักที่บรรจุชุดคาสั่งที่ใช้ในการประมวลผล
segment_name segment
….
segment_name ends
6
ตัวอย่ ำงโปรแกรมภำษำแอสเซมบลี้
; This program prints the message ”Hello world”
dseg
msg1
dseg
sseg
sseg
cseg
segment
db ’Hello world’,10h,13h,’$’
ends
segment stack
db
100 dup (?)
ends
segment
assume cs:cseg,ds:dseg,ss:sseg
start:
cseg
mov ax,dseg
;set DS
mov ds,ax
mov ah,9h
;print message
mov dx,offset msg1
int 21h
mov ax,4c00h
;exit program
int 21h
ends
end start
7
กำรประกำศให้ assembler ทรำบกำรใช้ เซกเมนต์
คาสัง่ เทียม assume ใช้เพื่อระบุให้ assembler ทราบว่าเราจะใช้
เซกเมนต์ต่าง ๆ อย่างไร
 การระบุโดยวิธีน้ ี น้ น
ั จะเป็ นการระบุให้ assembler นาไปแปล
โปรแกรมได้ถกู ต้องเท่านั้น
 ไม่ ได้ ระบุให้ assembler ตั้งค่ ำเซกเมนต์ รีจิสเตอร์ ต่างๆ ให้
ดังนั้นเราจะต้องตั้งค่าให้กบั เซกเมนต์รีจิสเตอร์เอง

8
กำรประกำศให้ assembler ทรำบกำรใช้ เซกเมนต์
mov
mov


ax,dseg
ds,ax
เซกเมนต์ขอ้ มูล (DS)
•
จะต้องมีการกาหนดตาแหน่งเริ่ มต้นให้กบั DS ก่อนการใช้งานเสมอ
เซกเมนต์คาสัง่ (CS) และแสต็กเซกเมนต์ (SS)
•
•
•
ระบบปฏิบตั ิการจะตั้งค่าของ CS และ SS ให้กบั โปรแกรมเมื่อเริ่ มทางาน
ต้องระบุเซกเมนต์ที่จะใช้เป็ น stack โดยใช้คาสั่งเทียม stack หลังการ
ประกาศเซกเมนต์ที่ตอ้ งการให้เป็ นแสต็ก
เซกเมนต์คาสั่งระบบจะตั้งให้อตั โนมัติ
9
รู ปแบบโปรแกรม


กำรประกำศจุดเริ่มโปรแกรม
•
กาหนดหลังคาสั่งเทียม end ในบรรทัดสุ ดท้ายโดยระบุดว้ ย label
กำรประกำศเลเบล
• การระบุตาแหน่งของหน่วยความจา ทาได้โดยการสร้างเลเบลที่บรรทัดนั้น
• Assembler จะจดจาแอดเดรสของเลเบลต่าง ๆ และจะนาไปแทนค่าให้ตาม
ความเหมาะสม
label_name :

กำรใส่ หมำยเหตุ
• หลังเครื่ องหมาย ‘ ; ’ assembler จะถือว่าเป็ นหมายเหตุ
10
รู ปแบบโปรแกรม

กำรสั่ งให้ โปรแกรมจบกำรทำงำน
•
ใช้บริ การหมายเลข 4Ch ของระบบปฏิบตั ิการ DOS โดยใช้คาสัง่ :
mov
int

ax,4C00h
21h
กำรใช้ บริกำรของระบบปฏิบัติกำร DOS
•
•
สามารถใช้บริ การได้หลายรู ปแบบ โดยกาหนดประเภทใน AX
และเรี ยกใช้คาสัง่
int 21h
11
ตัวอย่ ำงโปรแกรมภำษำแอสเซมบลี้
; This program prints the message ”Hello world”
dseg
msg1
dseg
sseg
sseg
cseg
segment
db ’Hello world’,10h,13h,’$’
ends
segment stack
db
100 dup (?)
ends
segment
assume cs:cseg,ds:dseg,ss:sseg
start:
cseg
mov ax,dseg
;set DS
mov ds,ax
mov ah,9h
;print message
mov dx,offset msg1
int 21h
mov ax,4c00h
;exit program
int 21h
ends
end start
12
รู ปแบบโปรแกรมแบบใหม่
; This program prints "Hello world"
.model small
.dosseg
.data
msg1
db ’Hello world’,10h,13h,’$’
.stack 100h
.code
start:
mov ax,@data
mov ds,ax
mov ah,9h
mov dx,offset msg1
int 21h
mov ax,4c00h
int 21h
end
start
13
รู ปแบบโปรแกรมแบบใหม่





เพื่อให้โปรแกรมสั้นและกะทัดรัดมากขึ้น
ชื่อของ segment จะถูกประกาศให้โดยอัตโนมัติ
ชื่อของเซกเมนต์ขอ้ มูลคือ @data แทน dseg
การประกาศเซกเมนต์ไม่ตอ้ งมีคาสัง่ xseg ends
จุดเริ่ มต้นของการทางานของโปรแกรมยังคงเริ่ มต้นที่เลเบลภายหลัง
คาสัง่ end
14
รู ปแบบโปรแกรมแบบใหม่
; This program prints "Hello world"
.model small
.dosseg
.data
msg1
db ’Hello world’,10h,13h,’$’
.stack 100h
.code
start:
mov ax,@data
mov ds,ax
mov ah,9h
mov dx,offset msg1
int 21h
mov ax,4c00h
int 21h
end
start
15
กำรเรียกใช้ บริกำรของ DOS




ระบบปฏิบตั ิการ DOS ได้จดั เตรี ยมบริ การต่าง ๆ ให้ผเู ้ ขียนโปรแกรมเรี ยกใช้ได้
โดยผ่านทางการขัดจังหวะหมายเลข 21h
ในการเรี ยกใช้บริ การของ DOS เราจะต้องกาหนดหมายเลขของบริ การลงใน
รี จิสเตอร์ AH และกาหนดค่าพารามิเตอร์ต่างๆ ลงในรี จิสเตอร์
ใช้คาสัง่ INT 21h เพื่อเรี ยกใช้การบริ การของระบบ
รู ปแบบโดยทัว่ ไปในการเรี ยกใช้บริ การ คือ
;
set parameters
mov
int
AH,function_number
21h
16
ประเภทกำรบริกำรของ DOS

Function 01h : อ่ ำนกำรกดปุ่ มจำกแป้ นพิมพ์
AH = 01h
AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด

Function 02h : แสดงตัวอักษรออกทำงหน้ ำจอ
AH = 02h
DL = รหัสแอสกีของอักขระที่ตอ้ งการแสดง

Function 05h : พิมพ์ตัวอักษรทำงเครื่องพิมพ์
AH = 05h
DL = รหัสแอสกีของอักขระที่ตอ้ งการพิมพ์
17
ประเภทกำรบริกำรของ DOS

Function 07h : อ่ ำนกำรกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด
(ไม่ ตรวจกำรกด Ctrl-Break)
AH = 07h
AL = รหัสแอสกีของอักขระที่ผใู้ ช้กด

Function 08h : อ่ ำนกำรกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด
(ตรวจกำรกด Ctrl-Break)
AH = 08h
AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด
18
ประเภทกำรบริกำรของ DOS

Function 09h : แสดงข้ อควำมทำงหน้ ำจอ
AH = 09h
DS:DX = ตาแหน่งของข้อความที่ตอ้ งการแสดง
โดยข้อความนี้ตอ้ งจบด้วยอักษร ‘$’ เท่านั้น

Function 0Ah : อ่ำนข้ อควำม
AH = 0Ah
DS:DX = ตาแหน่งของบัฟเฟอร์สาหรับเก็บข้อมูล

Function 4Ch : จบโปรแกรม
AH = 4Ch
AL = ค่าที่ตอ้ งการคืนให้กบั ระบบ
19
ขั้นตอนกำรพัฒนำโปรแกรม



…
mov
add
sub
push
…
สร้างโปรแกรมเก็บไว้ในแฟ้ มนำมสกุล ASM
ใช้โปรแกรม assembler เช่น MASM หรื อ TASM แปลโปรแกรมเป็ นแฟ้ ม
เป้ าหมาย (Object file) โดยใช้คาสัง่
MASM filename;
ใช้โปรแกรม LINK เพื่อเชื่อมโยงแฟ้ มเป้ าหมายแฟ้ มเดียวหรื อหลายแฟ้ มเข้า
ด้วยกัน โดยใช้คาสัง่
LINK filename;
.ASM
A, B
B,A
A, B
A
Assembler
Linker
.ASM
.ASM
Hello
20
ตัวอย่ ำงโปรแกรม 1

อ่านตัวอักษรจากผูใ้ ช้แล้วแสดงตัวอักษรนั้นออกมา
.model small
.dosseg
.stack 100h
.code
start:
mov
int
end
ah,01h
21h
;read character (Func 01h)
mov
mov
int
dl,al
ah,02h
21h
;copy character to DL
;display it (Func 02h)
mov
int
start
ax,4C00h ;Exit (Function 4Ch)
21h
21
ตัวอย่ ำงโปรแกรม 2

อ่านตัวอักษรจากผูใ้ ช้แล้วแสดงตัวอักษรตัวถัดไปออกมา
sseg
sseg
cseg
segment stack
db
100 dup (?)
ends
segment
assume cs:cseg,ss:sseg
start:
cseg
mov
int
ah,01h
21h
;read character (Func 01h)
mov
inc
mov
int
dl,al
dl
ah,02h
21h
;copy to DL
;increse DL (next char.)
;display it (Func 02h)
mov
int
ends
end
ax,4C00h
21h
;Exit
start
22
ตัวอย่ ำงโปรแกรม 3

อ่านตัวอักษรพิมพ์เล็กจากผูใ้ ช้แล้วแสดงตัวอักษรพิมพ์ให่่
.model small
.dosseg
.stack 100h
.code
start:
mov
int
end
ah,01h
21h
mov
sub
mov
int
dl,al
dl,32
ah,02h
21h
mov
int
start
ax,4C00h
21h
;read char.
;change char. case
;display it
;exit
23
ตัวอย่ ำงโปรแกรม 4

อ่านตัวอักษรพิมพ์เล็กจากผูใ้ ช้แล้วแสดงตัวอักษรพิมพ์ให่่โดยไม่
แสดงอักษรที่ผใู้ ช้กดให้เห็น
sseg
sseg
cseg
start:
cseg
segment
db
ends
segment
assume
mov
int
mov
sub
mov
int
mov
int
ends
end
stack
100 dup (?)
cs:cseg,ss:sseg
ah,08h
;readchar(Func 08h)
21h
dl,al
;Change case
dl,32
ah,02h
21h
ax,4C00h
;exit
21h
start
24
ตัวอย่ ำงโจทย์


รับการกดปุ่ มจากผูใ้ ช้แล้วแสดงค่ารหัสแอสกีของอักขระที่ผใู ้ ช้กดเป็ นเลขฐาน
10 (เพื่อความง่าย : ให้แสดงเป็ นตัวเลข 3 หลักเสมอ)
ขั้นตอน
• รับการกดปุ่ ม
• ใช้ Function 01h
•
คานวณเลขในแต่ละหลักของรหัสแอสกี
•
แสดงเลขในแต่ละหลักออกมา
• ใช้คาสัง่ ทางคณิตศาสตร์
• ใช้ Function 02h
25
.model small
.dosseg
.stack
.code
start:
mov
int
mov
mov
div
mov
mov
div
mov
mov
100h
ah,01h
21h
ah,0
bl,10
bl
cl,ah
ah,0
bl
ch,ah
dh,al
;read character
;ASCII -> AL
;last digit->cl
;2nd digit->ch
;1st digit->dh
mov
mov
int
mov
int
ah,02h
dl,10
21h
dl,13
21h
;disp newline
;LF
mov
mov
add
int
ah,02h
dl,dh
dl,'0'
21h
;display ascii
;1st digit
mov
add
int
dl,ch
dl,'0'
21h
;2nd digit
mov
add
int
dl,cl
dl,'0'
21h
;3rd digit
mov
int
ax,4C00h
21h
end
;CR
start
26
Question ?
27