Introduction to Computer organization & Assembly Language

Download Report

Transcript Introduction to Computer organization & Assembly Language

การกระโดดและการวนรอบ
คำสั่ งกระโดด

คำสัง่ กระโดดมี 3 รู ปแบบ
•
•
•
คำสัง่ กระโดดแบบไม่มีเงื่อนไข
คำสัง่ กระโดดแบบมีเงื่อนไขตำมแฟล็กซ์
คำสัง่ กระโดดแบบมีเงื่อนไขตำมค่ำในรี จิสเตอร์
AX := BX + 1;
IF AX = 0 THEN
AX:=AX+1;
CX := CX + 1;
Jxx
label
MOV
AX, 01H
ADD
AX, BX
CMP
AX, 0
JZ
TRUE
JNZ
FALSE
TRUE :
INC
AX
FALSE :
INC
CX
2
คำสั่ งกระโดด



นิยมใช้คู่กบั คำสัง่ ทำงคณิ ตศำสตร์โดยเฉพำะคำสัง่ เปรี ยบเทียบ (CMP)
ข้อมูลที่นำมำเปรี ยบเทียบเป็ นข้อมูลชนิดตัวเลขเสมอ แต่คำสัง่ กระโดด
รองรับได้ท้ งั ตัวเลขแบบคิดเครื่ องหมำยและไม่คิดเครื่ องหมำย
กำรกระโดดทุกครั้งสำมำรถกระโดดไปที่เลเบลเท่ำนั้น ไม่สำมำรถ
กระโดดไปที่หมำยเลขบรรทัดได้ กำรกำหนดเลเบลต้องกำหนดที่ตน้
บรรทัดเท่ำนั้น
3
คำสั่ งกำรกระโดดเบือ้ งต้ น
JMP
<เลเบล>
กระโดดข้ ำมไปที่ <เลเบล> อย่ ำงไม่ มเี งือ่ นไข
JZ (JE) <เลเบล>
กระโดดข้ ำมไปที่ <เลเบล> เมือ่ ผลของคำสั่ งทำง
คณิตศำสตร์ ล่ำสุ ดที่ผ่ำนมำเป็ นศูนย์
JNZ (JNE) <เลเบล>
กระโดดข้ ำมไปที่ <เลเบล> เมือ่ ผลของคำสั่ งทำง
คณิตศำสตร์ ล่ำสุ ดที่ผ่ำนมำไม่ เป็ นศูนย์
4
คำสั่ งกระโดด (ตัวเลขไม่ มีเครื่องหมำย)
คำสั่ ง
JA (JNBE)
JB (JNAE)
JAE (JNB)
JBE (JNA)
เงือ่ นไขกำรกระโดด
แฟล็กทดสอบ
Above
CF = 0 , ZF = 0
Below
CF = 1 , ZF = 0
Above or Equal Zero
CF = 0 , ZF = 1
Below or Equal Zero
CF = 1 , ZF = 1
5
คำสั่ งกระโดด (ตัวเลขมีเครื่องหมำย)
คำสั่ ง
เงือ่ นไขกำรกระโดด
Greater
JG (JNLE)
Less
JL (JNGE)
JGE (JNL) Greater or Equal Zero
JLE (JNG) Less or Equal Zero
แฟล็กทดสอบ
OF = SF , ZF = 0
OF ≠ SF , ZF = 0
OF = SF , ZF = 1
OF ≠ SF , ZF = 1
6
คำสั่ งกระโดด (ตำมแฟล็กซ์ และรีจิสเตอร์ )
กำรกระโดด
JNC
JO
JNO
JS
JNS
JPO (JNP)
JPE (JP)
JCXZ
ควำมหมำย
No Carry
Overflow
Not Overflow
Sign
No Sign
Parity odd
Parity Even
CX = 0
แฟล็กทดสอบ
CF = 0
OF =1
OF =0
SF = 1
SF = 0
PF = 0
PF = 1
none
7
ตัวอย่ ำงกำรใช้ คำสั่ งกระโดด
Ex#1
lab1:
cmp
jz
mov
add
ah,10
lab1
bx,2
cx,10
;เปรียบเทียบ ah กับ 10
;ถ้ ำเท่ ำกันให้ กระโดดไปที่ lab1
EX#2
cmp
jge
add
jmp
tenup:
add
endif:
ah,10
tenup
dl,’0’
endif
;เปรียบเทียบ ah กับ 10 ถ้ ำมำกกว่ ำ
;หรือเท่ ำกับให้ กระโดดไปที่ lab1
;ปรับค่ ำ dl
;กระโดดไปที่ endif
dl,’A’
;ปรับค่ ำ dl
8
กำรประยุกต์ คำสั่ งกระโดด
Repeat
While condition do
statement ;
Statement;
Statement;
Until condition ;
condition
Statement
False
Statement
True
Statement
Statement
False
condition
True
9
กำรประยุกต์ คำสั่ งกระโดด (repeat)
Pascal Language
ax := 10;
repeat
ax := ax-1;
bx := bx+1;
cx := ax-bx;
until ax = 0 ;
dx := dx + 10;
Assembly Language
mov
repeat: dec
inc
sub
mov
cmp
jnz
ax,10
ax
bx
ax,bx
cx,ax
ax,0
repeat
10
กำรประยุกต์ คำสั่ งกระโดด (while)
Pascal Language
while ax < 28h do
begin
ax := ax+bx ;
bx := bx+1 ;
end;
cx := cx-1 ;
Assembly Language
while:
cmp
jge
add
inc
jmp
endwhile:
dec
ax,128h
endwhile
ax,bx
bx
while
cx
11
คำสัง่ วนรอบ
คำสัง่ วนรอบเป็ นคำสัง่ ที่ใช้ในกำรกระทำซ้ ำ โดยใช้รีจิสเตอร์
CX (Counter Register) ในกำรนับจำนวนครั้งของกำรกระทำซ้ ำ
 รู ปแบบ
LOOP label
 คำสัง่ ในกลุ่มนี้ คือ

•
•
LOOP : คำสัง่ ที่พิจำรณำค่ำของ CX อย่ำงเดียว
LOOPZ , LOOPNZ : พิจำรณำแฟล็กร่ วมด้วย
12
คำสัง่ วนรอบ LOOP
 กำรทำงำนของคำสัง่ LOOP
• ลดค่ำของ CX ลงหนึ่ง โดยไม่กระทบแฟล็ก
• ถ้ำ CX ยังมีค่ำมำกกว่ำศูนย์ กระโดดไปทำงำนที่เลเบลที่ระบุ
 คำสัง่ LOOP มีกำรทำงำนเทียบเท่ำกับ
DEC
JNZ
CX
label
แต่ไม่มีกำรกระทบแฟล็ก
13
ตัวอย่ำงกำรใช้คำสัง่ วนรอบ
EX
mov
mov
mov
addnumber:
add
adc
inc
loop
cx,50h
bl,1
dx,0
; ทำซ้ำ 50 ครั้ง
; เริ่มที่ 1
; ค่ำเริ่มต้ น = 0
dl,bl
dh,0
bl
addnumber
; บวก 8 บิตล่ำง
; บวกตัวทด
; ทำซ้ำ
14
คำสัง่ LOOPZ และ LOOPNZ

คำสัง่ LOOPZ และ LOOPNZ มีกำรทำงำนเหมือนกับคำสัง่
LOOP แต่จะนำค่ำของแฟล็กศูนย์มำใช้ในกำรพิจำรณำด้วย
• LOOPZ จะกระโดดกลับไปทำงำนถ้ำค่ำของ CX ที่ลดแล้วมีค่ำไม่
เท่ำกับศูนย์ และค่ำของแฟล็กศูนย์มีค่ำเป็ นหนึ่ง (Zero)
(CX ≠ 0) and (Z = 1)
• LOOPNZ จะกระโดดกลับไปทำงำนถ้ำค่ำของ CX ที่ลดแล้วมีค่ำไม่
เท่ำกับศูนย์ และค่ำของแฟล็กศูนย์มีค่ำเป็ นศูนย์ (Not Zero)
(CX ≠ 0) and (Z = 0)
15
ข้อพึงระวังของกำรใช้คำสัง่ วนรอบ



กรณี ที่รีจิสเตอร์ CX มีค่ำเท่ำกับศูนย์ก่อนกำรทำงำนของคำสัง่ LOOP
ค่ำของ CX จะถูกปรับค่ำเป็ น 0FFFFh และกำรทำงำนจะผิดพลำด
แก้โดยใช้คำสัง่ JCXZ ในกำรป้ องกันควำมผิดพลำด
LABEL1:
ENDLOOP:
action_0
CXZ ENDLOOP
action_1
action_2
action_3
LOOP LABEL1
16
โปรแกรมภาษาแอสเซมบลี้เบือ้ งต้ น
หัวข้อในวันนี้





รู ปแบบของโปรแกรมภำษำแอสเซมบลี้แบบเก่ำ
รู ปแบบของโปรแกรมภำษำแอสเซมบลี้แบบใหม่
กำรเรี ยกใช้บริ กำรของ DOS
ขั้นตอนกำรแปลโปรแกรม
ตัวอย่ำงโปรแกรม
18
รู ปแบบของโปรแกรมภำษำแอสเซมบลี้
กำรโปรแกรมภำษำแอสเซมบลี้จะเขียนโปรแกรมบน
เซกเมนต์ต่ำง ๆ
 กำรประกำศในเซกเมนต์ต่ำง ๆ จะใช้สำหรับกำหนดข้อมูล,
ขนำดของสแต็กซ์และคำสัง่ ในกำรโปรแกรม

19
ตัวอย่ำงโปรแกรมภำษำแอสเซมบลี้
; 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
20
คำสั่ งเทียม
เป็ นคำสัง่ ที่ผเู ้ ขียนโปรแกรมเขียนเพื่อระบุให้ assembler แปล
โปรแกรมในรู ปแบบที่ตอ้ งกำร
 เป็ นคำสัง่ กลุ่มที่ไม่ปรำกฏในรหัสคำสัง่ ภำษำเครื่ อง เช่น
คำสัง่ segment , db , และ assume เป็ นต้น

21
กำรประกำศเซกเมนต์


ในโปรแกรมภำษำแอสเซมบลี้เรำสำมำรถประกำศเซกเมนต์ได้โดย
ใช้คำสัง่ เทียม segment
กำรโปรแกรมทัว่ ไปจะประกำศเซกเมนต์ท้ งั สิ้ น 3 เซกเมนต์
•
•
•
dseg ใช้ในกำรจองพื้นที่สำหรับตัวแปร
sseg ใช้ในกำรจองพื้นที่สำหรับสแต็กซ์
cseg เป็ นเซกเมนต์หลักที่บรรจุชุดคำสั่งที่ใช้ในกำรประมวลผล
segment_name segment
….
segment_name ends
22
ตัวอย่ ำงโปรแกรมภำษำแอสเซมบลี้
; 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
23
กำรประกำศให้ assembler ทรำบกำรใช้ เซกเมนต์
คำสัง่ เทียม assume ใช้เพื่อระบุให้ assembler ทรำบว่ำเรำจะใช้
เซกเมนต์ต่ำง ๆ อย่ำงไร
 กำรระบุโดยวิธีน้ ี น้ น
ั จะเป็ นกำรระบุให้ assembler นำไปแปล
โปรแกรมได้ถกู ต้องเท่ำนั้น
 ไม่ ได้ ระบุให้ assembler ตั้งค่ ำเซกเมนต์ รีจิสเตอร์ ต่ำงๆ ให้
ดังนั้นเรำจะต้องตั้งค่ำให้กบั เซกเมนต์รีจิสเตอร์เอง

24
กำรประกำศให้ assembler ทรำบกำรใช้ เซกเมนต์
mov
mov


ax,dseg
ds,ax
เซกเมนต์ขอ้ มูล (DS)
•
จะต้องมีกำรกำหนดตำแหน่งเริ่ มต้นให้กบั DS ก่อนกำรใช้งำนเสมอ
เซกเมนต์คำสัง่ (CS) และแสต็กเซกเมนต์ (SS)
•
•
•
ระบบปฏิบตั ิกำรจะตั้งค่ำของ CS และ SS ให้กบั โปรแกรมเมื่อเริ่ มทำงำน
ต้องระบุเซกเมนต์ที่จะใช้เป็ น stack โดยใช้คำสั่งเทียม stack หลังกำร
ประกำศเซกเมนต์ที่ตอ้ งกำรให้เป็ นแสต็ก
เซกเมนต์คำสั่งระบบจะตั้งให้อตั โนมัติ
25
รู ปแบบโปรแกรม


กำรประกำศจุดเริ่มโปรแกรม
•
กำหนดหลังคำสั่งเทียม end ในบรรทัดสุ ดท้ำยโดยระบุดว้ ย label
กำรประกำศเลเบล
• กำรระบุตำแหน่งของหน่วยควำมจำ ทำได้โดยกำรสร้ำงเลเบลที่บรรทัดนั้น
• Assembler จะจดจำแอดเดรสของเลเบลต่ำง ๆ และจะนำไปแทนค่ำให้ตำม
ควำมเหมำะสม
label_name :

กำรใส่ หมำยเหตุ
• หลังเครื่ องหมำย ‘ ; ’ assembler จะถือว่ำเป็ นหมำยเหตุ
26
รู ปแบบโปรแกรม

กำรสั่ งให้ โปรแกรมจบกำรทำงำน
•
ใช้บริ กำรหมำยเลข 4Ch ของระบบปฏิบตั ิกำร DOS โดยใช้คำสัง่ :
mov
int

ax,4C00h
21h
กำรใช้ บริกำรของระบบปฏิบัติกำร DOS
•
•
สำมำรถใช้บริ กำรได้หลำยรู ปแบบ โดยกำหนดประเภทใน AX
และเรี ยกใช้คำสัง่
int 21h
27
ตัวอย่ ำงโปรแกรมภำษำแอสเซมบลี้
; 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
28
รู ปแบบโปรแกรมแบบใหม่
; 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
29
รู ปแบบโปรแกรมแบบใหม่





เพื่อให้โปรแกรมสั้นและกะทัดรัดมำกขึ้น
ชื่อของ segment จะถูกประกำศให้โดยอัตโนมัติ
ชื่อของเซกเมนต์ขอ้ มูลคือ @data แทน dseg
กำรประกำศเซกเมนต์ไม่ตอ้ งมีคำสัง่ xseg ends
จุดเริ่ มต้นของกำรทำงำนของโปรแกรมยังคงเริ่ มต้นที่เลเบลภำยหลัง
คำสัง่ end
30
รู ปแบบโปรแกรมแบบใหม่
; 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
31
กำรเรียกใช้ บริกำรของ DOS




ระบบปฏิบตั ิกำร DOS ได้จดั เตรี ยมบริ กำรต่ำง ๆ ให้ผเู ้ ขียนโปรแกรมเรี ยกใช้ได้
โดยผ่ำนทำงกำรขัดจังหวะหมำยเลข 21h
ในกำรเรี ยกใช้บริ กำรของ DOS เรำจะต้องกำหนดหมำยเลขของบริ กำรลงใน
รี จิสเตอร์ AH และกำหนดค่ำพำรำมิเตอร์ต่ำงๆ ลงในรี จิสเตอร์
ใช้คำสัง่ INT 21h เพื่อเรี ยกใช้กำรบริ กำรของระบบ
รู ปแบบโดยทัว่ ไปในกำรเรี ยกใช้บริ กำร คือ
;
set parameters
mov
int
AH,function_number
21h
32
ประเภทกำรบริกำรของ DOS

Function 01h : อ่ ำนกำรกดปุ่ มจำกแป้ นพิมพ์
AH = 01h
AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด

Function 02h : แสดงตัวอักษรออกทำงหน้ ำจอ
AH = 02h
DL = รหัสแอสกีของอักขระที่ตอ้ งกำรแสดง

Function 05h : พิมพ์ตัวอักษรทำงเครื่องพิมพ์
AH = 05h
DL = รหัสแอสกีของอักขระที่ตอ้ งกำรพิมพ์
33
ประเภทกำรบริกำรของ DOS

Function 07h : อ่ ำนกำรกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด
(ไม่ ตรวจกำรกด Ctrl-Break)
AH = 07h
AL = รหัสแอสกีของอักขระที่ผใู้ ช้กด

Function 08h : อ่ ำนกำรกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด
(ตรวจกำรกด Ctrl-Break)
AH = 08h
AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด
34
ประเภทกำรบริกำรของ DOS

Function 09h : แสดงข้ อควำมทำงหน้ ำจอ
AH = 09h
DS:DX = ตำแหน่งของข้อควำมที่ตอ้ งกำรแสดง
โดยข้อควำมนี้ตอ้ งจบด้วยอักษร ‘$’ เท่ำนั้น

Function 0Ah : อ่ำนข้ อควำม
AH = 0Ah
DS:DX = ตำแหน่งของบัฟเฟอร์สำหรับเก็บข้อมูล

Function 4Ch : จบโปรแกรม
AH = 4Ch
AL = ค่ำที่ตอ้ งกำรคืนให้กบั ระบบ
35
ขั้นตอนกำรพัฒนำโปรแกรม



…
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
36
ตัวอย่ ำงโปรแกรม 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
37
ตัวอย่ ำงโปรแกรม 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
38
ตัวอย่ ำงโปรแกรม 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
39
ตัวอย่ ำงโปรแกรม 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
40
ตัวอย่ ำงโจทย์


รับกำรกดปุ่ มจำกผูใ้ ช้แล้วแสดงค่ำรหัสแอสกีของอักขระที่ผใู ้ ช้กดเป็ นเลขฐำน
10 (เพื่อควำมง่ำย : ให้แสดงเป็ นตัวเลข 3 หลักเสมอ)
ขั้นตอน
• รับกำรกดปุ่ ม
• ใช้ Function 01h
•
คำนวณเลขในแต่ละหลักของรหัสแอสกี
•
แสดงเลขในแต่ละหลักออกมำ
• ใช้คำสัง่ ทำงคณิตศำสตร์
• ใช้ Function 02h
41
.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
42
โปรแกรมภาษาแอสเซมบลี้
หัวข้อในวันนี้
รู ปแบบในกำรประกำศข้อมูล
 กำรอ้ำงใช้ขอ
้ มูลและตำแหน่งของข้อมูล
 กำรประกำศข้อมูลสำหรับกำรเรี ยกใช้งำนบริ กำรของ DOS
หมำยเลข 09h และ 0Ah

44
ตัวอย่ำงโปรแกรมภำษำแอสเซมบลี้
; 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
45
รู ปแบบโปรแกรมแบบใหม่
; 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
46
ประเภทกำรบริกำรของ DOS

Function 01h : อ่ ำนกำรกดปุ่ มจำกแป้ นพิมพ์
AH = 01h
AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด

Function 02h : แสดงตัวอักษรออกทำงหน้ ำจอ
AH = 02h
DL = รหัสแอสกีของอักขระที่ตอ้ งกำรแสดง

Function 05h : พิมพ์ตัวอักษรทำงเครื่องพิมพ์
AH = 05h
DL = รหัสแอสกีของอักขระที่ตอ้ งกำรพิมพ์
47
ประเภทกำรบริกำรของ DOS

Function 07h : อ่ ำนกำรกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด
(ไม่ ตรวจกำรกด Ctrl-Break)
AH = 07h
AL = รหัสแอสกีของอักขระที่ผใู้ ช้กด

Function 08h : อ่ ำนกำรกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด
(ตรวจกำรกด Ctrl-Break)
AH = 08h
AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด
48
ประเภทกำรบริกำรของ DOS

Function 09h : แสดงข้ อควำมทำงหน้ ำจอ
AH = 09h
DS:DX = ตำแหน่งของข้อควำมที่ตอ้ งกำรแสดง
โดยข้อควำมนี้ตอ้ งจบด้วยอักษร ‘$’ เท่ำนั้น

Function 0Ah : อ่ำนข้ อควำม
AH = 0Ah
DS:DX = ตำแหน่งของบัฟเฟอร์สำหรับเก็บข้อมูล

Function 4Ch : จบโปรแกรม
AH = 4Ch
AL = ค่ำที่ตอ้ งกำรคืนให้กบั ระบบ
49
กำรประกำศข้ อมูลหรือตัวแปร
ข้อมูลที่โปรแกรมใช้และตัวแปรต่ำงๆ ที่อยูใ่ นหน่วยควำมจำ
เป็ นสิ่ งเดียวกัน
 กำรประกำศข้อมูล คือ
• กำรระบุให้ assembler จองเนื้อที่ในหน่วยควำมจำไว้ใช้
สำหรับกำรเก็บข้อมูล
• และตั้งชื่อให้กบั หน่วยควำมจำตำแหน่งนั้น (สร้ำงเลเบล)

50
ตัวอย่ ำงแนวคิดกำรจองพืน้ ที่
 ตัวอย่ำงกำรประกำศตัวแปร
• เลขจำนวนเต็ม 16 บิต 2 ตัว (i, j)
• อักขระ 1 ไบต์ (ch)
i:
j:
ch :
จะเป็ นการจองเนื้อที่
ในหน่วยความจา
ขนาด 5 ไบต์ โดยจะ
มีเลเบล i j และ ch
ชี้ตาแหน่งดังรู ป
51
คำสั่ งเทียมสำหรับกำรจองเนือ้ ที่ในหน่ วยควำมจำ


เรำใช้คำสัง่ เทียม 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
52
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
53
กำรระบุค่ำของหน่ วยควำมจำทีม่ ีกำรซ้ำ


เรำใช้คำสัง่ เทียม 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
ซ้ำ
? ? ? ? ?
ซ้ำ
?
54
กำรอ้ ำงใช้ ข้อมูลในหน่ วยควำมจำ
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
55
กำรอ้ ำงใช้ ข้อมูลในหน่ วยควำมจำ




เรำสำมำรถใช้เลเบลที่ประกำศแทนตำแหน่งของมูลในหน่วยควำมจำ
ได้โดยตรง
เรำสำมำรถอ้ำงหน่วยควำมจำโดยคิดระยะสั มพัทธ์ กบั ตำแหน่งของเล
เบลได้ โดยใช้รีจิสเตอร์ BX
สังเกตว่ำในกำรกำหนดค่ำคงที่ให้กบั หน่วยควำมจำนั้น เรำไม่ตอ้ ง
ระบุขนำดอีก เพรำะเรำระบุตอนประกำศแล้ว
ไม่จำเป็ นต้องใช้ขอ้ มูลตำมขนำดที่ระบุเสมอไป โดยเรำสำมำรถระบุ
ขนำดกำกับไปด้วย โดยคำสัง่ byte ptr
56
กำรอ้ ำงใช้ ข้อมูลในหน่ วยควำมจำ


กำรอ้ำงตำแหน่งของข้อมูล
• ใช้คำสัง่ เทียม 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
57
ตัวอย่ ำงกำรอ้ ำงใช้ ข้อมูลในหน่ วยควำมจำ
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
58
กำรใช้ บริกำรหมำยเลข 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
59
กำรใช้ บริกำรหมำยเลข 0Ah ของ DOS
บริ กำรหมำยเลข 0Ah : อ่ำนข้อควำม

รับข้อมูลผ่ำนรี จิสเตอร์ดงั นี้
• DS : DX = ตำแหน่งของหน่วยควำมจำที่จะใช้เก็บข้อมูล (บัฟเฟอร์) โดยที่
จะต้องมีรูปแบบดังนี้
•
•
•
•
ไบต์ ที่ 1 : ควำมยำวของข้ อมูลทั้งหมด
(ต้องเผื่อที่วำ่ งไว้ 1 ไบต์สำหรับอักขระขึ้นบรรทัดใหม่)
ไบต์ ที่ 2 : DOS จะใส่ ควำมยำวข้ อมูลจริงลงที่หน่วยควำมจำตำแหน่งนี้
ไบต์ ต่อ ๆ ไป : ข้ อควำมที่อ่ำนได้ โดยต้องจองเนื้อที่หน่วยควำมจำให้เพียงพอ
AH = 0Ah
.data
maxlen db 30 ;29char+return
msglen db ?
msg
db 30 dup (?)
60
กำรใช้ บริกำรหมำยเลข 0Ah ของ DOS



กำรเรี ยกใช้บริ กำรอ่ำนข้อควำม ต้องส่ งแอดเดรสของบัฟเฟอร์ไปยัง
DOS เรำจะส่ งตำแหน่งของ maxlen ไปให้ เพื่อให้รูปแบบของ
ข้อมูลตรงตำมข้อกำหนด
msglen จะเก็บควำมยำวของข้อควำมที่อ่ำนได้.
อักขระต่ำงในข้อควำมจะถูกเก็บในหน่วยควำมจำตั้งแต่ msg เป็ น
msg
บัฟเฟอร์
ต้นไป
msglen
maxlen
61