โปรแกรมภาษาแอสเซมบลี้ (2) ธนาวินท์ รักธรรมานนท์ [email protected] หัวข้อในวันนี้ รู ปแบบในการประกาศข้อมูล  การอ้างใช้ขอ ้ มูลและตาแหน่งของข้อมูล  การประกาศข้อมูลสาหรับการเรี ยกใช้งานบริ การของ DOS หมายเลข 09h และ 0Ah 

Download Report

Transcript โปรแกรมภาษาแอสเซมบลี้ (2) ธนาวินท์ รักธรรมานนท์ [email protected] หัวข้อในวันนี้ รู ปแบบในการประกาศข้อมูล  การอ้างใช้ขอ ้ มูลและตาแหน่งของข้อมูล  การประกาศข้อมูลสาหรับการเรี ยกใช้งานบริ การของ DOS หมายเลข 09h และ 0Ah 

โปรแกรมภาษาแอสเซมบลี้ (2)
ธนาวินท์ รักธรรมานนท์
[email protected]
หัวข้อในวันนี้
รู ปแบบในการประกาศข้อมูล
 การอ้างใช้ขอ
้ มูลและตาแหน่งของข้อมูล
 การประกาศข้อมูลสาหรับการเรี ยกใช้งานบริ การของ DOS
หมายเลข 09h และ 0Ah

2
ตัวอย่างโปรแกรมภาษาแอสเซมบลี้
; 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
3
รู ปแบบโปรแกรมแบบใหม่
; 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
4
ประเภทการบริการของ DOS

Function 01h : อ่ านการกดปุ่ มจากแป้ นพิมพ์
AH = 01h
AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด

Function 02h : แสดงตัวอักษรออกทางหน้ าจอ
AH = 02h
DL = รหัสแอสกีของอักขระที่ตอ้ งการแสดง

Function 05h : พิมพ์ตัวอักษรทางเครื่องพิมพ์
AH = 05h
DL = รหัสแอสกีของอักขระที่ตอ้ งการพิมพ์
5
ประเภทการบริการของ DOS

Function 07h : อ่ านการกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด
(ไม่ ตรวจการกด Ctrl-Break)
AH = 07h
AL = รหัสแอสกีของอักขระที่ผใู้ ช้กด

Function 08h : อ่ านการกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด
(ตรวจการกด Ctrl-Break)
AH = 08h
AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด
6
ประเภทการบริการของ DOS

Function 09h : แสดงข้ อความทางหน้ าจอ
AH = 09h
DS:DX = ตาแหน่งของข้อความที่ตอ้ งการแสดง
โดยข้อความนี้ตอ้ งจบด้วยอักษร ‘$’ เท่านั้น

Function 0Ah : อ่านข้ อความ
AH = 0Ah
DS:DX = ตาแหน่งของบัฟเฟอร์สาหรับเก็บข้อมูล

Function 4Ch : จบโปรแกรม
AH = 4Ch
AL = ค่าที่ตอ้ งการคืนให้กบั ระบบ
7
การประกาศข้ อมูลหรือตัวแปร
ข้อมูลที่โปรแกรมใช้และตัวแปรต่างๆ ที่อยูใ่ นหน่วยความจา
เป็ นสิ่ งเดียวกัน
 การประกาศข้อมูล คือ
• การระบุให้ assembler จองเนื้อที่ในหน่วยความจาไว้ใช้
สาหรับการเก็บข้อมูล
• และตั้งชื่อให้กบั หน่วยความจาตาแหน่งนั้น (สร้างเลเบล)

8
ตัวอย่ างแนวคิดการจองพืน้ ที่
 ตัวอย่างการประกาศตัวแปร
• เลขจานวนเต็ม 16 บิต 2 ตัว (i, j)
• อักขระ 1 ไบต์ (ch)
i:
j:
ch :
จะเป็ นการจองเนื้อที่
ในหน่วยความจา
ขนาด 5 ไบต์ โดยจะ
มีเลเบล i j และ ch
ชี้ตาแหน่งดังรู ป
9
คาสั่ งเทียมสาหรับการจองเนือ้ ที่ในหน่ วยความจา


เราใช้คาสัง่ เทียม Dx ในการระบุกบั assembler ว่าจะต้องการ
หน่วยความจาขนาดหน่วยละเท่าใด
เราใช้ เครื่องหมาย ‘?’ ในการระบุการจองเนื้อที่หน่วยความจา
โดยไม่ ระบุค่าของข้อมูล
คาสั่ ง
ความหมาย
dseg
data1
data2
data3
data4
dseg
segment
db
1,?
dw
1,2
db
’Hi’,10,13
dd
1234h
ends
ขนาด
(ไบต์ )
DB Define Byte
1
DW Define Word
2
DD Define Double
4
DQ Define Quad word
8
DT Define Ten byte
10
10
dseg : 0000
0001
0002
0003
dseg segment
0004
data1 db 1,?
0005
data2 dw 1,2
0006
data3 db ’Hi’,10,13
data4 dd 1234h
0007
dseg ends
0008
0009
000A
000B
000C
000D
01h
?
01h
00h
02h
00h
48h
69h
0Ah
0Dh
34h
12h
00h
00h
data1
db
1,?
data2
dw
1,2
data3
db
’Hi’,10,13
data4
dd
1234h
11
การระบุค่าของหน่ วยความจาทีม่ ีการซ้า


เราใช้คาสัง่ เทียม dup ในการระบุค่าเริ่ มต้นที่มีการซ้ ากันหลายชุด.
รู ปแบบ
จานวนซ้า dup (ค่ าที่ซ้า)
Data7 db
10 dup (0)
data7
data8
Data8 db
Data9 db
5 dup (4 dup (5))
data9
4 dup
(1,2,3 dup (4))
data10
Data10 db 20 dup (?)
0 0 0 0 0
5 5 5 5 5
ซ้ำ
ซ้ำ
ซ้ำ
0
5
1 2 4 4 4 1 2 4 4 4
1 2 4 4 4 1 2 4 4 4
ซ้ำ
? ? ? ? ?
ซ้ำ
?
12
การอ้ างใช้ ข้อมูลในหน่ วยความจา
data1
data2
data3
data4
01h
00h
01h
22h
01h
00h
02h
23h
00h
11h
48h
69h
0Ah
0Dh
34h
12h
00h
00h
dseg
data1
data2
data3
data4
dseg
mov
mov
mov
mov
mov
mov
segment
db
1,?
dw
1,2
db
’Hi’,10,13
dd
1234h
ends
al,data1
bx,data2
data1,0
[data2+2],1123h
data1[1],22h
cl,byte ptr data4
AL = 01h
BX = 01h
CL = 34h
13
การอ้ างใช้ ข้อมูลในหน่ วยความจา




เราสามารถใช้เลเบลที่ประกาศแทนตาแหน่งของมูลในหน่วยความจา
ได้โดยตรง
เราสามารถอ้างหน่วยความจาโดยคิดระยะสั มพัทธ์ กบั ตาแหน่งของเล
เบลได้ โดยใช้รีจิสเตอร์ BX
สังเกตว่าในการกาหนดค่าคงที่ให้กบั หน่วยความจานั้น เราไม่ตอ้ ง
ระบุขนาดอีก เพราะเราระบุตอนประกาศแล้ว
ไม่จาเป็ นต้องใช้ขอ้ มูลตามขนาดที่ระบุเสมอไป โดยเราสามารถระบุ
ขนาดกากับไปด้วย โดยคาสัง่ byte ptr
14
การอ้ างใช้ ข้อมูลในหน่ วยความจา


การอ้างตาแหน่งของข้อมูล
• ใช้คาสัง่ เทียม OFFSET
การใช้รีจิสเตอร์ BX ในการอ้าง
ตาแหน่งข้อมูล
•
•
ใช้ BX เก็บออฟเซ็ตของ DATA7
ไว้ จากนั้นเราอ้างใช้หน่วยความจา
เทียบกับ BX
ใช้หน่วยความจาเทียบกับ DATA7
และค่าในBX
mov ax,data2
mov bx,offset data2
mov bx , offset data7
mov byte ptr [bx] ,10
mov byte ptr [bx+1] ,20
mov bx , 2
mov data7[bx] ,30
mov data7[bx+1] ,40
15
ตัวอย่ างการอ้ างใช้ ข้อมูลในหน่ วยความจา
01
DS:0000
02
DS:0001
03
DS:0003
?
DS:0004
?
DS:0005
?
DS:0006
05
DS:0007
00
DS:0008
06
DS:0009
00
DS:000A
dseg
data1
data2
data3
dseg
mov
mov
mov
mov
mov
segment
db 1,2,3
db 3 dup (?)
dw 5,6
ends
AL = 01h
BX = 0000h
CX = 0006h
[DS:0004] = 06h
[DS:0005] = 00h
al,data1
bx,offset data1
cx,data3[2]
bx,offset data2
[bx],cx
16
การใช้ บริการหมายเลข 09h ของ DOS
บริ การหมายเลข 09h : แสดงผลข้อความ

รับข้อมูลผ่านรี จิสเตอร์ดงั นี้
• DS : DX = ตาแหน่งของข้อความที่จะแสดง
• AH = 09h
โดยข้อความนี้ตอ้ งจบด้วยเครื่ องหมาย ‘$’
dseg
msg
dseg
segment
db ’hello’,10,13,’$’
ends
mov
mov
int
ah,9
dx,offset msg
21h
17
การใช้ บริการหมายเลข 0Ah ของ DOS
บริ การหมายเลข 0Ah : อ่านข้อความ

รับข้อมูลผ่านรี จิสเตอร์ดงั นี้
• DS : DX = ตาแหน่งของหน่วยความจาที่จะใช้เก็บข้อมูล (บัฟเฟอร์) โดยที่
จะต้องมีรูปแบบดังนี้
•
•
•
•
ไบต์ ที่ 1 : ความยาวของข้ อมูลทั้งหมด
(ต้องเผื่อที่วา่ งไว้ 1 ไบต์สาหรับอักขระขึ้นบรรทัดใหม่)
ไบต์ ที่ 2 : DOS จะใส่ ความยาวข้ อมูลจริงลงที่หน่วยความจาตาแหน่งนี้
ไบต์ ต่อ ๆ ไป : ข้ อความที่อ่านได้ โดยต้องจองเนื้อที่หน่วยความจาให้เพียงพอ
AH = 0Ah
.data
maxlen db 30 ;29char+return
msglen db ?
msg
db 30 dup (?)
18
การใช้ บริการหมายเลข 0Ah ของ DOS



การเรี ยกใช้บริ การอ่านข้อความ ต้องส่ งแอดเดรสของบัฟเฟอร์ไปยัง
DOS เราจะส่ งตาแหน่งของ maxlen ไปให้ เพื่อให้รูปแบบของ
ข้อมูลตรงตามข้อกาหนด
msglen จะเก็บความยาวของข้อความที่อ่านได้.
อักขระต่างในข้อความจะถูกเก็บในหน่วยความจาตั้งแต่ msg เป็ น
msg
บัฟเฟอร์
ต้นไป
msglen
maxlen
19
แบบฝึ กหัด

โปรแกรมที่รับข้อความจากผูใ้ ช้แล้วแสดงข้อความนั้นออกมา
• รับข้อความ ใช้บริ การหมายเลข 0Ah
• กาหนดความยาวสูงสุด
• รับค่าความยาวจริ ง
• รับข้อความ
• แสดงข้อความ ใช้บริ การหมายเลข 09h
• ข้อความต้องจบด้วย ‘$’
20
Question ?
21