SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
1 
Introduction to Assembly Language 
โดย อ.ภูษิต ก้อนสุรินทร์ 
โปรแกรมที่สร้างโดยภาษาแอสเซมบลีจะถูกแปลงให้เป็นภาษาเครื่องโดยแอสเซมเบลอร์ (Assembler) ดังนั้นเราจะต้องเขียนโปรแกรมให้อยู่ในรูปแบบที่แอสเซมเบลอร์ เข้าใจ ภาษาแอสเซมบลีจะไม่เป็น Case sensitive คือไม่มีความแตกต่างระหว่างการใช้ตัวอักษรแบบ ตัวพิมพ์ใหญ่ (Uppercase)และตัวพิมพ์เล็ก(Lowercase) แต่โดยส่วน ใหญ่จะเขียนตัวคาสั่งให้อยู่ในรูปแบบของ Uppercase และค่าอื่นๆจะให้เป็น Lowercase 
โครงสร้างของการเขียนภาษาแอสเซมบลี 
ตัวอย่าง This program prints the message “Hello world” 
.MODEL small 
.STACK 100h 
.DATA 
msg1 db ‘Hello world’, 10h, 13h, ‘$’ 
.CODE 
start: 
mov ax, @data 
mov ds, ax 
mov ah, 9h 
mov dx, offset msg1 
int 21h 
mov ax, 4c00h 
int 21h 
end start 
.MODEL <model_type> 
.STACK <stack_size> 
.DATA 
;This is data segment 
<Define_variables> 
.CODE 
;This is code segment 
<statements>
2 
Statements 
ในโปรแกรมจะประกอบไปด้วยคาสั่ง (Statement) การเขียนคาสั่งจะเขียน 1 คาสั่ง ต่อ 1 บรรทัด เราเรียกทั้ง บรรทัดว่า “Instruction” ซึ่งจะถูกแอสเซมเบลอร์แปลงให้เป็นภาษาเครื่อง และอีกประเภทหนึ่งคือ “Assembler directive” ซึ่งจะ สั่งให้ แอสเซมเบลอร์ทางานพิเศษบางอย่าง เช่นให้กาหนดพื้นที่ว่างในหน่วยความจาสาหรับค่าตัวแปร หรือใช้สาหรับ การสร้างโปรแกรมย่อย(Procedure) ทั้งการเขียน “Instructions” และ “Directives” จะประกอบไปด้วย 4 ฟิลด์ดังนี้ 
name operation operand(s) comment 
ระหว่างฟิลด์จะต้องเว้นช่องว่างอย่างน้อย 1 ช่อง ตัวอย่างของ Instruction เช่น 
START: MOV CX,5 ;initialize counter 
START: เป็น name field MOV เป็น Operation CX,5 เป็น Operand ;initialize counter เป็นคาอธิบาย (Comment) 
ตัวอย่างของ Directive 
MAIN PROC 
MAIN เป็น name field ส่วน PROC เป็น Operation เป็นการสร้าง Procedure ชื่อ MAIN 
Name Field 
Name field ถูกใช้สาหรับเป็น Instruction labels, Procedure names, Variable names เมื่อมีการแปลงไปเป็น ภาษาเครื่อง Assembler จะแปลงชื่อเหล่านี้ลงไปยังตาแหน่งของหน่วยความจา Name สามารถจะมีจานวนตัวอักษร ได้ตั้งแต่ 1-31 ตัวอักษร ซึ่งจะประกอบไปด้วย ตัวอักษร, ตัวเลข, เครื่องหมายพิเศษต่างๆ แต่ห้ามมีการใช้ช่องว่างใน การตั้งชื่อ 
ตัวอย่างของ Name field ที่ถูกต้อง 
COUNTER 
@character 
SUM_OF_DIGITS 
$100 
DONE? 
.TEST 
ตัวอย่างของ Name field ที่ไม่ถูกต้อง 
TWO WORD เพราะมีช่องว่าง 
2abc เพราะเริ่มต้นด้วยตัวเลข 
A45.28 เพราะมีเครื่องหมายจุด (ต้องอยู่ตาแหน่งแรกเท่านั้น) 
YOU&ME เพราะใช้ตัวอักษร & 
Operation Field 
แต่ละ Instruction ตัวที่เป็น Operation field จะมีสัญลักษณ์ของการทางานต่างๆ เช่น MOV, ADD, SUB แทนคาสั่ง การ MOVE ,ADDITIONAL, SUBTRACTION ซึ่งจะถูกแปลให้เป็นภาษาเครื่องโดย Assembler แต่สาหรับ Directives นั้น Operation field จะอยู่ในรูปของ Pseudo-operation code (Pseudo-op) ซึ่งจะไม่มีการแปลงให้เป็น ภาษาเครื่อง เช่นคาว่า PROC ถูกใช้ในการสร้าง Procedure เท่านั้น
3 
Operand Field 
ใน Instruction มี Operand field จะกาหนดข้อมูลที่จะถูกกระทาโดย Operation ซึ่งอาจจะประกอบไปด้วย 1 หรือ 2 หรือไม่มี Operand เลยก็ได้ ดังตัวอย่างต่อไปนี้ 
NOP ไม่มี operation ไม่มีการทางานใดๆ 
INC AX มีเพียง 1 operand คือให้เพิ่มค่า 1 เข้าไปใน AX 
ADD WORD1,2 มี 2 operand คือให้เพิ่มค่า 2 เข้าไปในตัวแปร WORD1 
สาหรับ Instruction ที่มี 2 Operand ตัวOperand ตัวแรกจะเป็น “Destination Operand” ซึ่งอาจจะเป็น Register หรือ Variables (Memory location) ซึ่งจะใช้เก็บผลลัพธ์ (แต่ในบางทีก็ไม่ใช้เก็บผลลัพธ์) และ Operand ส่วนที่สองก็จะ เรียกว่า “Source Operand” 
Comment Field 
ใช้หรับโปรแกรมเมอร์เพื่ออธิบายสิ่งที่เกิดขึ้นในแต่ละ Instruction โดยมีเครื่องหมาย semi-colon “;” เป็นเครื่องหมาย แรกของการเขียนคาอธิบาย เพราะ Assembler จะยกเลิกการแปลงค่าใดๆ ที่อยู่หลังเครื่องหมาย ; ในการเขียน โปรแกรมที่ดีควรมี คาอธิบายประกอบด้วยเพื่อให้ผู้ที่อ่าน Source Code สามารถเข้าใจได้โดยง่าย เช่น 
MOV CX,0 ;move 0 to CX 
อาจจะใช้ข้อความที่สื่อความหมายมากขึ้นคือ 
MOV CX,0 ; CX counter term ,initialize by 0 
หรืออาจจะเขียนคาอธิบายในรูปแบบต่อไปนี้ 
; 
;initialize register 
; 
MOV AX,0 
MOV BX,0 
Program Data 
เนื่องจากโพรเซสเซอร์จะใช้งานข้อมูลในรูปของเลขฐานสอง ดังนั้น Assembler จะต้องทาการแปลงค่าข้อมูลทั้งหมด ให้อยู่ในรูปของเลขฐานสองก่อน แต่อย่างไรก็ตามเรายังคงสามารถใช้ระบบเลขฐานต่างๆ และตัวอักษรได้ตามปกติ แต่เราต้องทราบวิธีการเขียนเพื่อแยกแยะให้ Assembler ทราบว่าข้อมูลนั้นๆ เป็นตัวเลขในระบบใด
4 
Numbers 
ระบบเลขฐานสองจะเขียนโดยใช้ ตัวอักษร B, b อยู่ด้านหลังเช่น 10b 
ระบบเลขฐานสิบจะเขียนโดยใช้ ตัวอักษร D, d อยู่ด้านหลังเช่น 10d หรืออาจจะไม่ต้องเขียน 
ระบบเลขฐานสิบหกจะเขียนโดยใช้ ตัวอักษร H, h อยู่ด้านหลังเช่น 10h แต่ถ้าเป็น A-F ทั้งหมดจะต้องมี 0 อยู่ ด้านหน้าเสมอเช่น 0ABCh 
Number 
Type 
11011 
Decimal 
11011b 
Binary 
-1234 
Illegal ->เพราะมี - 
1,234 
Illegal ->เพราะมี , 
1BD4h 
Hex 
1BD4 
Illegal -> ขาด h 
FFFFh 
Illegal ->เพราะขาด 0 นาหน้า 
0FFFFh 
Hex 
Character 
สาหรับข้อมูลที่เป็น Character หรือ Character string จะใช้เครื่องหมาย “ ” หรือ ‘ ’ เช่น “A” ‘Hello’ โดย Assembler จะแปลงค่าให้เป็น รหัส ASCII ดังนั้นถ้าเราใช้ 41h ก็ไม่มีความแตกต่างกับ “A” ในโปรแกรม 
Variables 
บทบาทของตัวแปรในโปรแกรมภาษาแอสเซมบลี นั้นก็จะเหมือนกับโปรแกรมภาษาระดับสูง โดยตัวแปรแต่ละตัวจะ มี data type ของตัวเองและถูกกาหนดตาแหน่งในหน่วยความจาโดย โปรแกรม สาหรับในโปรแกรมภาษาแอสเซมบลี จะมีการกาหนดชนิดของข้อมูลจะเรียกว่า Pseudo-op ดังนี้ 
Pseudo-op 
ความหมาย 
DB 
Define Byte 
DW 
Define Word 
DD 
Define Double word 
DQ 
Define Quad word 
DT 
Define Tenbytes 
Byte Variables 
ในส่วนของ assembler directive นั้นจะมีการกาหนดค่าตัวแปรให้เป็น Byte โดยมีรูปแบบดังนี้ 
name DB initial_value 
ตัวอย่างเช่น 
ALPHA DB 4
5 
จะทาให้ assembler รู้จักว่า ส่วนของหน่วยความจา ที่มีชื่อว่า ALPHA นั้นมีเป็นชนิด byte และมีค่าเริ่มต้นคือ 4 ถ้ายัง ไม่ต้องการกาหนดค่าเริ่มต้นสามารถใช้เครื่องหมาย ? แทน เช่น 
BYT DB ? 
ค่าของตัวแปร BYT นั้นจะมีค่าที่อาจเป็นไปได้คือ -128 ถึง 127 ถ้าเป็นแบบ signed หรือ 0-255 ถ้าเป็น Unsigned 
Word Variables 
ในส่วนของ assembler directive นั้นจะมีการกาหนดค่าตัวแปรให้เป็น Word โดยมีรูปแบบดังนี้ 
name DW initial_value 
ตัวอย่างเช่น 
WRD DW -2 
ตัวแปรชื่อ WRD มีชนิดข้อมูลเป็นแบบ Word และมีค่าเริ่มต้นเป็น -2 และถ้ามีการใช้เครื่องหมาย ? แทนค่าเริ่มต้น จะ ทาให้ช่วงของข้อมูลจะขึ้นอยู่กับว่าเป็น Signed (-32768 ถึง 32767) หรือ Unsigned (0 ถึง 65535) 
Arrays 
ในภาษาแอสเซมบลีนั้น array จะเป็นโครงสร้างข้อมูลที่อยู่เรียงกันในหน่วยความจา โดยขนาดของสมาชิกแต่ละตัวจะ ขึ้นอยู่กับ data type ว่าจะเป็น DB หรือ DW ตัวอย่าง สาหรับ array ขนาด 3 ตัวโดยมีชื่อว่า B_ARRAY มีชนิดข้อมูล แบบ byte และได้กาหนดค่าเริ่มต้นคือ 10h, 20h, 30h จะกาหนดได้ดังนี้ 
B_ARRAY DB 10h, 20h, 30h 
Array ชื่อ B_ARRAY ถูกกาหนดไว้ในหน่วยความจาโดยมีค่า Offset เป็น 0200h ดังนั้นถ้าพิจารณาใน array นี้คือ 
การอ้างอิง 
Address 
contents 
B_ARRAY 
200h 
10h 
B_ARRAY + 1 
201h 
20h 
B_ARRAY + 2 
202h 
30h 
ทานองเดียวกัน ถ้ากาหนดให้ Array มีชนิดข้อมูลแบบ Word ก็สามารถกาหนดได้คือ 
W_ARRAY DW 1000, 40, 29887, 329 
จะมีข้อมูลในหน่วยความจาที่ Offset ที่ 0300 ดังนี้ 
การอ้างอิง 
Address 
contents 
W_ARRAY 
0300h 
1000d 
W_ARRAY + 1 
0301h 
40d 
W_ARRAY + 2 
0302h 
2988d 
W_ARRAY + 3 
0303h 
329d 
High and Low Bytes and Word 
บางครั้งเราจาเป็นที่จะต้องมีการอ้างอิงการใช้งานจากตาแหน่งในหน่วยความจาในรูปแบบ High และ Low Bytes ใน ตัวแปรแบบ Word จะพิจารณาจากตัวอย่างต่อไปนี้ 
WORD1 DW 1234h 
4 
3 
2 
1
6 
ถ้ามีการอ้างอิงถึง low byte ในตัวแปรนี้จะได้ข้อมูลคือ 12h สัญลักษณ์ที่ใช้อ้างอิงคือ WORD1 และถ้าอ้างอิงถึงค่าใน High byte จากตัวแปรนี้คือ 34h และสัญลักษณ์ที่ใช้อ้างอิงคือ WORD1 + 1 
Character strings 
สาหรับ Array ที่มีการเก็บข้อมูลที่ใช้รหัส ASCII การกาหนดค่าชนิดข้อมูลและค่าเริ่มต้น สามารถกระทาได้ดังนี้ 
LETTERS DB ‘ABC’ 
ซึ่งมีค่าเท่ากับการกาหนดดังนี้ 
LETTERS DB 41h, 42h, 43h1 
ส่วนค่าที่เป็นข้อความ (String) ก็สามารถกาหนดค่าเริ่มต้นได้ดังนี้ 
MSG DB ‘HELLO’, 0Ah, 0Dh, ‘$’ 
หรือ MSG DB 48h, 45h, 4Ch, 4Fh, 0Ah, 0Dh, 24h 
Named Constants 
ค่าคงที่มีความจาเป็นในการเขียนโปรแกรม และในภาษาแอสเซมบลี ก็มีการใช้ค่าคงที่ในการทางาน สาหรับการ กาหนดค่าจะใช้คาสั่ง EQU (Equates) เพื่อทาการกาหนดค่าคงที่ให้ตัวแปรที่จะนาไปใช้ในโปรแกรม โดยมีรูปแบบคือ 
name EQU2 constant 
ตัวอย่างเช่น 
LF EQU 0Ah 
จะมีการกาหนดค่า 0Ah ซึ่งเป็นรหัส ASCII ที่ใช้ในการเลื่อนหน้ากระดาษ (line feed) ให้แก่ตัวแปร LF แทนที่เราจะ เขียน 0Ah ในส่วนต่างๆของโปรแกรม และเมื่อมีการเปลี่ยนแปลงแก้ไขค่าข้อมูล ก็จะเสียเวลาในการที่ต้องมาเปลี่ยน ทุกๆที่ที่ใช้งาน ใน constant เราจะเปลี่ยนค่าเพียงที่เดียวเท่านั้น สาหรับคาสั่งข้างต้น ตัว Assembler จะมองการทางาน เป็นดังนี้ 
MOV DL,0Ah 
MOV LF,DL 
ขั้นตอนการแปลโปรแกรมภาษา Assembly 
1. สร้าง Source Code โดยใช้โปรแกรม text Editor และให้บันทึกเป็นนามสกุล .asm 
2. แปล Source ให้เป็นแฟ้มเป้าหมาย (Object file) ที่มีนามสกุลเป็น .OBJ โดยใช้โปรแกรม Assembler เช่น MASM (Microsoft Macro Assembler) หรือ TASM (Turbo Assembler) กรณีนี้เราจะใช้ MASM ซึ่งการ แปลทาได้โดยพิมพ์ชื่อโปรแกรม MASM ตามด้วยแฟ้มที่เก็บ source code ของโปรแกรมภาษา Assembly เช่น source program เก็บในไฟล์ชื่อ test.asm ก็สั่งทาการแปลโดยพิมพ์ 
A:>MASM test 
ถ้ามีข้อผิดพลาด Assembler จะแจ้งข้อผิดพลาดให้ ให้ทาการแก้ไข Source code แล้วทาการแปลใหม่ ถ้าเราแปล โปรแกรมภาษา Assembly สาเร็จ จะได้แฟ้มเป้าหมายที่มีนามสกุลเป็น .OBJ จากตัวอย่างคือ test.obj 
1 41h, 42h, 43h เป็นรหัส ASCII ของตัวอักษร A, B, C ตามลาดับ 
2 EQU name จะไม่มีการกาหนดตาแหน่งในหน่วยความจาไว้เหมือนกับตัวแปร
7 
3. ใช้โปรแกรม LINK เพื่อทาการเชื่อมโยงแฟ้มเป้าหมาย (object file) เข้ากับ function ต่างๆ ใน library ซึ่ง 
ผลลัพธ์จะได้ไฟล์โปรแกรมภาษาเครื่องที่สามารถทางาน (execute) ได้ มีนามสกุลเป็น .EXE ซึ่งการ เชื่อมโยงโดยใช้โปรแกรม LINK ทาได้โดยการพิมพ์ชื่อโปรแกรม LINK ตามด้วยชื่อแฟ้มเป้าหมาย (.OBJ) 
A:>LINK test 
ซึ่งหลังจากขั้นตอนของการเชื่อมโยงเราจะได้แฟ้มโปรแกรมที่มีนามสกุลเป็น .EXE (Executable file) 
ที่สามารถเรียกใช้ได้จาก DOS prompt 
คาสั่งพื้นฐาน 
ภาษาแอสเซมบลีที่ทางานโดยอาศัยพื้นฐานของโพรเซสเซอร์ 8086นั้น จะประกอบด้วยคาสั่งเป็นร้อยคาสั่งที่ ต้องใช้งาน แต่คาสั่งที่เราต้องรู้จักกันในเบื้องต้น ซึ่งคาสั่งเหล่านี้จะทางานในด้านการโอนย้ายข้อมูล การ คานวณทางคณิตศาสตร์ โดยจะมีการใช้งาน Operand ทั้งในรูปแบบของ bytes และ word 
MOV and XCHG 
MOV(MOVE) เป็นคาสั่งที่ใช้ในการโอนถ่ายข้อมูลจาก register ไปยัง register, จาก register ไปยังหน่วยความจา หรือจากตัวเลขหรือตัวอักษรไปยัง register หรือหน่วยความจา โดยมีรูปแบบดังนี้ 
MOV destination, source 
ตัวอย่างเช่น 
MOV AX,BX 
MOV AX,WORD1 
MOV AH,2 
MOV AH,'A' 
จากตัวอย่าง MOV AX,WORD1 จะอ่านว่า "ย้ายค่าจากตัวแปร WORD1 ไปยัง register AX" ผลที่เกิดขึ้นคือจะมีการ นาเอาค่า content ที่อยู่ภายในตัวแปร WORD1 ไปใส่ไว้แทนที่ content ใน register AX ทาให้ content ของ AX เปลี่ยนแปลง ส่วนค่าของตัวแปร WORD1 จะคงเดิม 
รูปแสดงค่า content ของการ MOV 
XCHG (Exchange) เป็นคาสั่งที่เตรียมไว้สาหรับการแลกเปลี่ยน contents ระหว่าง register ไปยัง register หรือจาก register ไปยัง หน่วยความจา โดยมีรูปแบบดังนี้ 
XCHG destination,source 
0006 
0008 
AX 
WORD1 
ก่อนการ MOV 
0008 
0008 
AX 
WORD1 
หลังการ MOV
8 
ตัวอย่างเช่น 
XCHG AH,BL 
XCHG AX,WORD1 
รูปแสดงผลของการใช้คาสั่ง XCHG 
ข้อห้ามของการใช้คาสั่ง MOV 
Destination Operand 
Source Operand 
General register 
Segment register 
Variables 
Constant 
General register 
 
 
 
 
Segment register 
 
 
 
 
Variables 
 
 
 
 
Constant 
 
 
 
 
ข้อห้ามของการใช้คาสั่ง XCHG 
Destination Operand 
Source Operand 
General register 
Variables 
General register 
 
 
Variables 
 
 
ตัวอย่างของการใช้คาสั่งที่ไม่ถูกต้อง 
MOV WORD1,WORD2 ;WORD1 และ WORD2 เป็นตัวแปรทั้งคู่ 
ควรจะแก้ไขให้เป็น 
MOV AX, WORD1 
MOV WORD2, AX 
0006 
0008 
AX 
WORD1 
ก่อนการ XCHG 
0008 
0006 
AX 
WORD1 
หลังการ XCHG
9 
ADD, SUB, INC and DEC 
คาสั่งในการบวก(ADD : Addition) และลบ(SUB : Subtraction) จะเป็นการนาเอา contents ระหว่าง register 2 ตัว หรือระหว่าง register กับ ตัวแปร หรือระหว่างตัวเลขกับ register หรือ กับตัวแปร โดยมีรูปแบบคือ 
ADD destination, source 
SUB destination, source 
ตัวอย่างเช่น 
ADD WORD1,AX 
จะอ่านว่า "ให้บวกค่า content ใน register AX เข้ากับค่า content ในตัวแปร WORD1 แล้วนาเอาผลลัพธ์ไปเก็บไว้ที่ตัว แปร WORD1" 
SUB AX,DX 
จะอ่านว่า "ให้เอา register DX ไปลบออกจาก register AX แล้วนาเอาผลลัพธ์ไปเก็บไว้ที่ register AX" 
รูปแสดงผลของการใช้คาสั่ง ADD WORD1, AX 
รูปแสดงผลของการใช้คาสั่ง SUB AX,DX 
ข้อห้ามของการใช้คาสั่ง ADD, SUB 
Destination Operand 
Source Operand 
General register 
Variables 
General register 
Variables 
Constant 
0006 
0008 
AX 
WORD1 
ก่อนการ ADD 
0008 
0006 
AX 
WORD1 
01BCh 
0523h 
01BCh 
06DFh 
หลังการ ADD 
0006 
0008 
AX 
DX 
ก่อนการ SUB 
0008 
0006 
AX 
DX 
0000h 
0001h 
FFFFh 
0001h 
หลังการ SUB
10 
Shift Instructions 
คาสั่ง shift เป็นคาสั่งที่ทาให้มีการเลื่อนข้อมูลใน bit โดยจะมีการเลื่อนไป 1 bit หรือมากกว่าก็ได้ คาสั่งใน การ shift จะทาให้ ตัวที่ถูกเลื่อนออกไปสูญหายไป ซึ่งไม่เหมือนกับคาสั่ง rotate ซึ่งเมื่อค่า bit ถูกเลื่อนออกไปก็จะมี การนากลับเข้ามาในกลุ่มของ bit อีก โดยจะมีลักษณะคาสั่งคือ 
Opcode destination,1 หรือ 
Opcode destination,CL 
Left shift Instructions 
คาสั่งคือ SHL (Shift Left) คาสั่งนี้จะทาให้เกิดการเลื่อนค่า bit ใน destination ไปยังด้านซ้ายโดยมีรูปแบบ คาสั่งคือ 
SHL destination,1 
ค่า 0 จะถูกใส่เข้ามาทาง bit ขวาสุดของ destination ทาให้ค่าใน msb ถูกเลื่อนออกไปเก็บที่ CFซCarry Flag(ตามรูปที่ 7.2 ) แต่ถ้าต้องการให้มีการเลื่อนออกไปจานวน N bits ก็จะมีรูปแบบคือ 
SHL destination,CL 
เมื่อค่า CL ใช้เก็บค่าจานวน bit ที่ต้องการให้มีการเลื่อน 
คาสั่ง SHL จะกระทบ กับ Flags 
SF, PF, ZF จะขึ้นอยู่กับผลลัพธ์ 
AF ไม่มีการกาหนด 
CF จะขึ้นอยู่กับค่าที่ถูกเลื่อนออกมา 
OF จะถูกเซต (1) ถ้าผลลัพธ์ทาให้เกิดการเปลี่ยนแปลงเครื่องหมาย 
แสดงภาพของคาสั่ง SHL,SAL (Word, Byte) 
ตัวอย่าง 
สมมุติให้ DH เก็บข้อมูล 8Ah และมีค่า CL คือ 3 ค่าของ DH และ CF จะเป็นอย่างไรเมื่อเราใช้คาสั่ง 
SHL DH,CL 
DH จะเก็บค่า 8Ah = 1000 1010 b gเมื่อมีการเลื่อน 3 ครั้งดังนี้ 
ครั้งที่ 1  0 00010100 
CF 
15 
14 
13 
12 
11 
10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
0 
0 
CF 
0 
7 
6 
5 
4 
3 
2 
1 
0
11 
ครั้งที่ 2  0 00101000 
ครั้งที่ 3  0 0101 0000 
ซึ่ง 0101 0000 มีค่าเท่ากับ 50h จะถูกเก็บอยู่ใน DH 
Multiplication by Left Shift 
ถ้าเราพิจารณา ตัวเลขในระบบฐานสิบคือ 543 ถ้าแต่หลัก มีการเลื่อนไปทางด้านซ้าย 1 ตาแหน่ง โดยมีการใช้ ค่าตัวเลข 0 เข้ามาทางด้านขวา จะได้ 5430 ซึ่งก็เหมือนกับการเอาค่า 543 คูณด้วยเลข 10 นั่นเอง ในทานองเดียวกัน การทา left shift กับตัวเลขในระบบเลขฐานสอง ก็เหมือนกับการเอาเลขฐานสองนั้นมาคูณด้วยเลข 2 ตัวอย่างเช่น ให้ AL มีค่าเท่ากับ 5d = 0000 0101b ถ้ามีการ Shift left ไป 1 ครั้ง ผลที่ได้คือ 00001010 ซึ่งมีค่าเท่ากับ 10d ถ้าเราเอาค่า เดิมมา shift left อีกก็ย่อมได้ผลลัพธ์คือ 20d อย่างแน่นอน 
SAL Instructions 
ดังที่กล่าวมาว่าคาสั่ง SHLสามารถใช้ในการคูณได้ แต่อย่างไรก็ตามถ้าต้องการเน้น ให้เป็นการคาสั่งในเชิง คณิตศาสตร์โดยตรงก็สามารถใช้คาสั่ง SAL (Shift Arithmetic Left) ซึ่งจะถูกนามาใช้บ่อยๆ เมื่อมีการคูณแบบนี้ เกิดขึ้น ซึ่งอย่างไรก็ตามคาสั่ง SHL และ SAL ก็ จะถูกสร้างให้เป็น machine code ตัวเดียวกัน สาหรับตัวเลขที่ติดลบ สามารถที่จะนามาใช้ในการคูณได้โดยจะมีการยกกาลังตามการ left ship ตัวอย่างเช่น AX = FFFFh(-1d) ถ้ามีการ shift ไป 3 ครั้งจะได้ผลลัพธ์คือ FFF8h (-8d) 
Right Shift Instructions 
คาสั่ง SHR(Shift Right) จะทาให้เกิดการเลื่อนbit ไปทางด้านขวาของ destination โดยมีรูปแบบคือ 
SHR destination,1 
จะมีการนาเอาค่า 0 ใส่เข้ามาทาง msb ทาให้เลื่อน bit จานวน 1 bit ออกไปทางด้านขวา และเลื่อนค่าของ bit ขวาสุดออกไปไว้ที่ CF (รูปที่ 7.3) หรือถ้ามีการเลื่อนมากกว่า 1 bit ก็จะใช้ คาสั่งคล้ายๆกับคาสั่ง SHL คือ 
SHR destination,CL 
ตัวอย่าง 
สมมุติให้ DH มีค่าเท่ากับ 8Ah และค่า CL = 2 ถ้าใช้คาสั่ง SHR DH,CL จะทาให้ผลลัพธ์ที่ได้ใน DH และค่า ของ CF คืออะไร 
ค่าใน DH = 8Ah = 1000 1010 b 
ครั้งที่ 1  0100 0101 0 
ครั้งที่ 2  0010 0010 1 
ดังนั้น DH = 0010 0010 = 22h และค่าใน CF คือ 1 
แสดงคาสั่ง SHR (Word, Byte) 
CF 
0 
15 
14 
13 
12 
11 
10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
0 
CF 
0 
7 
6 
5 
4 
3 
2 
1 
0
12 
The SAR instruction 
คาสั่ง SAR (Shift Arithmetic Right) ก็จะทางานคล้ายๆกับคาสั่ง SHR แต่จะมีความแตกต่าง คือค่าใน msb ยังคงตัวเดิมไม่มีการเปลี่ยนแปลง (รูปที่ 7.4) โดยมีรูปแบบคือ 
SAR destination,1 และ 
SAR destination,CL 
ผลต่อ Flags ก็เหมือนกับคาสั่ง SHL 
ผังแสดงคาสั่ง SAR (Word, Byte) 
การหารโดยการใช้ Right Shift 
เป็นเพราะว่า left shift ทาให้ค่าใน destination มีค่าเพิ่มจากเดิมเป็น 2 เท่า ก็พอจะเป็นการเดาเหตุผลง่ายๆได้ ว่า right shift ก็ย่อมทาให้ค่าใน destination ลดลง ครึ่งหนึ่งได้ เหมือนกับการหารด้วย 2 นั่นเอง แต่จะถูกต้องเฉพาะ ค่าที่เป็นเลขจานวนคู่ แต่ถ้าสาหรับเลขจานวนคี่แล้วคาสั่งในการทาแบบ right shift จะมีการปัดค่าทิ้ง ตัวอย่างเช่น BL = 5= 0000 0101b เมื่อใช้คาสั่ง SAL BL,1 จะได้ 0000 0010 = 2 
Signed and unsigned division 
ในการหารโดย right shift เราจาเป็นที่จะต้องแสดงให้เห็นความแตกต่างระหว่างตัวเลขแบบ Signed และ unsigned ใน กรณีที่มีการทางานกับ unsigned ก็จะเลือกใช้คาสั่ง SHR แต่ถ้าเป็น signed จะเลือกใช้ SAR เป็นเพราะรูปแบบของ SAR ยังคงรักษา msb ไว้ซึ่งเป็น bit สาหรับเก็บเครื่องหมายอยู่แล้วทาให้เครื่องหมายไม่เปลี่ยนแปลง 
ตัวอย่าง 
ให้ใช้ right shift หารตัวเลขที่เป็น unsigned ระหว่าง 65143 ถูกหารโดย 4 แล้วเก็บผลลัพธ์ไว้ที่ AX 
ในการหารด้วย 4 นั้นจะต้องเป็นการทา right shift 2 ครั้งเพราะการทา right shift แต่ละครั้งก็คือการด้วย 2 นั่นเอง และ ก็เป็นการหารตัวเลขแบบ unsigned จึงเลือกใช้คาสั่ง SHR จะได้ 
MOV AX,65143 
MOV CL,2 
SHR AX,CL 
ตัวอย่าง 
ถ้า AL = -15 ถ้ามีการใช้คาสั่ง SAR AL,1 จะได้ผลลัพธ์ที่เก็บใน AL คืออะไร 
คาสั่ง SAR AL,1 ทาให้เกิดการหารค่า -15 ด้วยเลข 2 ได้ผลลัพธ์เป็น - 7.5 แต่จะมีการปัดค่าทศนิยม จะได้ -8 
-15 => 1111 0001 b 
หลังการ SAR => 1111 1000 b = -8 
CF 
15 
14 
13 
12 
11 
10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
0 
CF 
7 
6 
5 
4 
3 
2 
1 
0
13 
Rotate Instructions 
คาสั่ง ROL (Rotate Left) จะทาให้มีการเลื่อน bit ไปทั้งด้านซ้าย และค่าใน msb จะถูกเลื่อนออกไปเก็บที่ bit ด้านขวา สุด และ CF ยังคงเก็บค่าที่มีการเลื่อนออกจาก msb ดังนั้นลักษณะของการเลื่อนจะเป็นแบบวงกลม จากค่าใน lsb กับ msb (รูปที่ 7.5) โดยมีรูปแบบคาสั่งคือ 
ROL destination,1 และ 
ROL destination,CL 
คาสั่ง ROR (Rotate Right) จะทางานคล้ายๆกับคาสั่ง ROL แตกต่างกันเพียงการเลื่อนของ bit จะดาเนินไปทางด้านขวา bit ทางด้านขวาสุดจะถูกเลื่อนออกไปที่ msb และ CF (รูปที่ 7.6) โดยมีรูปแบบคือ 
ROR destination,1 และ 
ROR destination,CL 
สาหรับคาสั่ง ROL และ ROR ค่าใน CF จะขึ้นอยู่กับ ค่าของ bit ที่ถูกเลื่อนออกไป ตัวอย่างต่อไปนี้จะแสดงให้เห็น ว่า เราจะสามารถตรวจสอบ bit ในชุดข้อมูลขนาด byte หรือ word โดยไม่มีการเปลี่ยนแปลงค่าข้อมูลเลย 
ตัวอย่าง 
จะใช้คาสั่ง ROL เพื่อทาการนับจานวนของ bit ที่มีค่าเป็น 1 ใน BX โดยไม่มีการเปลี่ยนแปลงค่า BX เลย และให้นามาเก็บไว้ที่ AX 
XOR AX,AX ;AX count bit 
MOV CX,16 ;assign loop counter 
TOP: 
ROL BX,1 ;CF = bit that rotate out 
JNC NEXT 
INC AX ;increment total if 1 bit was found 
NEXT: 
LOOP TOP ;loop until done 
จากตัวอย่าง เราจะใช้คาสั่ง JNC(Jump if Not carry) เพราะจะให้มีการกระโดดไปยังส่วนของ NEXT นั่นคือให้มีการ วนรอบใหม่ ถ้าค่าใน CF ยังคงเป็น 0 อยู่ และถ้าค่าใน CF = 1 ก็จะมีการเพิ่มค่าการนับให้แก่ AX 
CF 
15 
14 
13 
12 
11 
10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
0 
CF 
7 
6 
5 
4 
3 
2 
1 
0 
CF 
15 
14 
13 
12 
11 
10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
0 
CF 
7 
6 
5 
4 
3 
2 
1 
0
14 
Rotate Carry Left 
คาสั่ง RCL (Rotate through Carry Left) จะเป็นการเลื่อน bit ของ destination ไปด้านซ้าย โดยค่า bit ใน msb จะถูกเลื่อนออกอยู่ที่ CF และค่าที่อยู่ใน CF (ซึ่งเป็นค่าก่อนที่จะเกิดการเลื่อน) จะถูกเลื่อนออกไปเข้าที่ bit ด้านขวาสุด ของชุดข้อมูล หรืออาจจะกล่าวได้ว่า คาสั่ง RCL ทางานคล้ายกับคาสั่ง ROL แต่มีความแตกต่างคือ CF ถูกนาเข้ามา เป็นส่วนหนึ่งของวงรอบการเลื่อนครั้งนี้ (รูปที่ 7.7) โดยมีรูปแบบคาสั่งคือ 
RCL destination,1 และ RCL destination,CL 
Rotate Carry Right 
คาสั่ง RCR (Rotate through Carry Right) ทางานคล้ายกับคาสั่ง RCL ยกเว้นว่า bit ที่มีการเลื่อนจะถูกเลื่อน ไปทางด้านขวา(รูปที่ 7.8) โดยมีรูปแบบคือ 
RCR destination,1 และ 
RCR destination, CL 
ตัวอย่าง 
ให้ DH = 8Ah , CF = 1 และ CL = 3 ถ้าใช้คาสั่ง RCR DH,CL หลังการทางานของคาสั่งนี้จะทาให้ค่า DH และ CL เป็นอย่างไร 
CF DH 
เริ่มต้น 1 1000 1010 
ครั้งที่ 1 0 1100 0101 
ครั้งที่ 2 1 0110 0010 
ครั้งที่ 3 0 1011 0001 
ดังนั้น DH = 1011 0001 = B1h และ CF = 1 
JMP Instruction 
คาสั่ง JMP(Jump) จะสั่งให้ CPU กระโดดไปทาคาสั่งตามที่กาหนดไว้ โดยตาแหน่งที่จะกระโดดไปนั้นจะถูกกาหนด ด้วยป้ายชื่อ(label ) ซึ่งจะถูกแปลโดยแอสเซมเบอร์ ให้กลายเป็นที่อยู่(Address) คาสั่ง JMP จะเป็นการกระโดดไปทา คาสั่งอื่นแบบไม่มีเงื่อนไข โดยมีรูปแบบดังนี้ 
JMP destination 
ตาแหน่งที่ destination อยู่นั้นมักจะอยู่ในเซกเมนต์เดียวกันกับคาสั่ง JMP แต่เราสามารถสั่งให้มีการกระโดดไปทางาน ในตาแหน่งต่างได้โดยใช้ คาว่า NEAR ,FAR ,SHORT ประกอบกับคาสั่ง คาสั่งการกระโดดแบบไม่มีเงื่อนไขนี้จะมี 2 รูปแบบคือ แบบทางตรง(Direct jump) และแบบทางอ้อม(Indirect jump) 
แบบทางตรง จะแบ่งออกเป็น 3 แบบคือ 
1.1 SHORT การกระโดดแบบสั้นนี้จะใช้จานวนไบต์จานวน 1 ไบต์มาเป็นระยะที่จะนาเอามาบวกเข้า กับค่าใน IP ซึ่งอยู่ในช่วงค่าตัวเลขตั้งแต่ -128 ถึง +127 ก็หมายความว่า จะกระโดดไปข้างหน้าไม่ เกิน 127 ไบต์ และกระโดดไปด้านหลังได้ไม่เกิน 128 ไบต์ 
CF 
15 
14 
13 
12 
11 
10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
0 
CF 
7 
6 
5 
4 
3 
2 
1 
0
15 
1.2 NEAR การกระโดดแบบนี้จะแตกต่างจาก SHORT ตรงที่จะมีการใช้จานวนไบต์ 2 ไบต์มาบวก 
เขากับ IP ดังนั้นจะทาให้สามารถกระโดไปได้ในช่วงขนาด 32 KB(Kilobyte) ก็หมายความว่า สามารถกระโดดไปยังตาแหน่งใดๆก็ได้ที่อยู่ภายใน Segment เดียวกัน เพราะใน 1 Segment จะมี ขนาด 64 KB 
1.3 FAR จะใช้ในการกระโดดไปยังตาแหน่งใน Segment ใดๆ ก็ได้ เพราะการกระโดดแบบนี้มีการใช้ จานวนไบต์ ถึง 4 ไบต์ โดยแบ่งออกเป็น 2 ไบต์สาหรับค่า Offset และอีก 2 ไบต์สาหรับค่า Segment เพื่อนาไปใส่ใน IP และ CS ตามลาดับ เราสามารถอ้างอิงไปที่ตาแหน่งใดๆใน หน่วยความจา 1 MB ได้ทันที 
คาสั่ง JMP สามารถใช้ร่วมกับคาสั่งที่มีการกระโดดแบบมีเงื่อนไขได้ ดังตัวอย่างต่อไปนี้จะสมมุติให้เราต้องการ เรียกใช้คาสั่งใน Loopต่อไปนี้ 
TOP : ;body of the loop 
DEC CX ; decrement counter 
JNZ TOP ; jump to top ,if a result of CX is not 0 
MOV AX,BX 
และใน loop นี้บรรจุเอาคาสั่งไว้หลายคาสั่งดังนั้นทาให้ label TOP อยู่นอกขอบเขต สาหรับคาสั่ง JNZ (ขนาดมี มากกว่า 126 ไบต์ ) ซึ่งเราจะแก้ไขโดยใช้คาสั่ง JMP เข้มาช่วยได้ดังนี้ 
TOP : ; body of the loop 
DEC CX 
JNZ BOTTOM 
JMP EXIT 
BOTTOM : 
JMP TOP 
EXIT : 
MOV AX,BX 
การรับและแสดงข้อมูลโดยใช้ DOS Interrupt 
ชุดคาสั่งสาหรับ Input และ Output จะถูกเก็บไว้ใน ROM BIOS (Basic Input Output System) และเก็บไว้ในดิสก์ นั่น คือโปรแกรมระบบปฏิบัติการ (Operation System) ซึ่งเป็นโปรแกรมที่มีหน้าที่ควบคุมการทางานของระบบ คอมพิวเตอร์ หรือเป็นตัวกลางระหว่าง ROM BIOS กับ Applications ในการรับและแสดงข้อมูล สามารถเรียกใช้ ชุดคาสั่งที่อยู่ใน ROM BIOS มาใช้ได้ โดยอยู่ในลักษณะการขอใช้ Interrupt โดยจะระบุหมายเลขของ ฟังก์ชัน และ สาหรับรีจิสเตอร์ที่ถูกนามาใช้รับค่าฟังก์ชันคือ AH ร่วมกับ Interrupt หมายเลข 21 
Memory 
Input Devices. 
Output 
Devices
16 
การอ่านตัวอักษรจากแป้นพิมพ์ 
ใช้ฟังก์ชันหมายเลข 10 ร่วมกัน Interrupt หมายเลข 21 เช่น 
MOV AH,10h 
INT 21h 
การแสดงตัวอักษรออกทางจอภาพ 
ใช้ฟังก์ชันหมายเลข 02 ร่วมกัน Interrupt หมายเลข 21 เช่น 
MOV AH,02h 
INT 21h 
การแสดงข้อความออกทางจอภาพ 
ใช้ฟังก์ชันหมายเลข 09 ร่วมกัน Interrupt หมายเลข 21 เช่น 
MOV AH,09h 
INT 21h 
การหยุดโปรแกรมและกลับสู่ DOS 
ใช้ฟังก์ชันหมายเลข 4C ร่วมกัน Interrupt หมายเลข 21 เช่น 
MOV AH,4Ch 
INT 21h 
หรือเรียกใช้ INT 20 เพียงอย่างเดียว 
ตัวอย่างบริการต่างๆ ของ DOS ที่สาคัญ 
หมายเลข 
หน้าที่ 
พารามิเตอร์ 
01h 
รับค่าจากแป้นพิมพ์ 
Input : AH = 01h 
Output: AL = รหัส ASCII ของปุ่มที่กด 
02h 
แสดงตัวอักษร 
Input : AH = 02h 
DL = รหัส ASCII ของอักษรที่จะแสดง 
05h 
พิมพ์ตัวอักษรทางเครื่องพิมพ์ 
Input: AH = 05h 
DL= รหัส ASCII ของอักษรที่จะพิมพ์ 
07h 
อ่านตัวอักษรจากแป้นพิมพ์ แต่ไม่แสดงผล และไม่ตรวจสอบการกด Ctrl-Break 
Input: AH = 07h 
Output: AL = รหัส ASCII ของอักษรที่อ่านได้ 
08h 
อ่านตัวอักษรจากแป้นพิมพ์ แต่ไม่แสดงผล และมีการตรวจสอบการกด Ctrl-Break 
Input: AH = 08h 
Output: AL = รหัส ASCII ของอักษรที่อ่านได้ 
09h 
พิมพ์ข้อความ(string) 
Input: AH = 09h 
DS:DX = ตาแหน่งข้อความที่ต้องการพิมพ์ และข้อความต้องปิดท้ายด้วย $ 
0Ah 
อ่านข้อความ (string) 
Input: AH = 0Ah
17 
DS:DX = ตาแหน่งของ buffer ที่เก็บข้อมูล 
ที่อ่านเข้ามา 
4Ch 
จบโปรแกรม 
Input: AH = 4Ch 
AL = รหัสที่จะส่งคืนสู่ระบบ

Más contenido relacionado

La actualidad más candente

โปรแกรม Paint คืออะไร
โปรแกรม Paint คืออะไรโปรแกรม Paint คืออะไร
โปรแกรม Paint คืออะไรBenjapeon Jantakhot
 
โครงงานคอมพิวเตอร์ เรื่อง เว็บไซต์ NIFTY HEALTH ด้วยภาษา HTML
โครงงานคอมพิวเตอร์  เรื่อง เว็บไซต์ NIFTY HEALTH ด้วยภาษา HTMLโครงงานคอมพิวเตอร์  เรื่อง เว็บไซต์ NIFTY HEALTH ด้วยภาษา HTML
โครงงานคอมพิวเตอร์ เรื่อง เว็บไซต์ NIFTY HEALTH ด้วยภาษา HTMLธณัชช์ภรณ์ ศิริวัชเดชากุล
 
โครงงานคอมพิวเตอร์ เรื่อง โรคซึมเศร้า
โครงงานคอมพิวเตอร์ เรื่อง โรคซึมเศร้าโครงงานคอมพิวเตอร์ เรื่อง โรคซึมเศร้า
โครงงานคอมพิวเตอร์ เรื่อง โรคซึมเศร้าธนัชพร ส่งงาน
 
ตัวอย่างบทคัดย่อ
ตัวอย่างบทคัดย่อตัวอย่างบทคัดย่อ
ตัวอย่างบทคัดย่อsukanya5729
 
คู่มือ Thunkable
คู่มือ Thunkableคู่มือ Thunkable
คู่มือ ThunkableKhunakon Thanatee
 
ตัวอย่างโครงงานคอม
ตัวอย่างโครงงานคอมตัวอย่างโครงงานคอม
ตัวอย่างโครงงานคอมปยล วชย.
 
แบบฝึกหัดโครงสร้างการเขียนผังงาน
แบบฝึกหัดโครงสร้างการเขียนผังงานแบบฝึกหัดโครงสร้างการเขียนผังงาน
แบบฝึกหัดโครงสร้างการเขียนผังงานChess
 
ผลวิเคราะห์การจัดประชุมสัมมนา
ผลวิเคราะห์การจัดประชุมสัมมนาผลวิเคราะห์การจัดประชุมสัมมนา
ผลวิเคราะห์การจัดประชุมสัมมนาAtivitt Crystalbell
 
รูปเล่มวิชาโครงงาน
รูปเล่มวิชาโครงงานรูปเล่มวิชาโครงงาน
รูปเล่มวิชาโครงงานAjBenny Pong
 
เกณฑ์การประเมินรูบริคส์
เกณฑ์การประเมินรูบริคส์เกณฑ์การประเมินรูบริคส์
เกณฑ์การประเมินรูบริคส์Lamai Fungcholjitt
 
บทที่3 วิธีดำเนินงาน
บทที่3 วิธีดำเนินงานบทที่3 วิธีดำเนินงาน
บทที่3 วิธีดำเนินงานChamp Wachwittayakhang
 
ตัวอย่างโครงงาน
ตัวอย่างโครงงานตัวอย่างโครงงาน
ตัวอย่างโครงงานSattawat Backer
 
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซีใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซีNattapon
 
บทที่ 5สรุปผล และข้อเสนอแนะ
บทที่ 5สรุปผล และข้อเสนอแนะบทที่ 5สรุปผล และข้อเสนอแนะ
บทที่ 5สรุปผล และข้อเสนอแนะBeeiiz Gubee
 
รูปเล่มวิชาโครงงาน
รูปเล่มวิชาโครงงานรูปเล่มวิชาโครงงาน
รูปเล่มวิชาโครงงานAjBenny Pong
 

La actualidad más candente (20)

ลอการิทึม
ลอการิทึมลอการิทึม
ลอการิทึม
 
โปรแกรม Paint คืออะไร
โปรแกรม Paint คืออะไรโปรแกรม Paint คืออะไร
โปรแกรม Paint คืออะไร
 
โครงงานคอมพิวเตอร์ เรื่อง เว็บไซต์ NIFTY HEALTH ด้วยภาษา HTML
โครงงานคอมพิวเตอร์  เรื่อง เว็บไซต์ NIFTY HEALTH ด้วยภาษา HTMLโครงงานคอมพิวเตอร์  เรื่อง เว็บไซต์ NIFTY HEALTH ด้วยภาษา HTML
โครงงานคอมพิวเตอร์ เรื่อง เว็บไซต์ NIFTY HEALTH ด้วยภาษา HTML
 
โครงการบริจาคโลหิต
โครงการบริจาคโลหิตโครงการบริจาคโลหิต
โครงการบริจาคโลหิต
 
โครงงานคอม สตรอเบอร์รี่(strawberry)
โครงงานคอม สตรอเบอร์รี่(strawberry)โครงงานคอม สตรอเบอร์รี่(strawberry)
โครงงานคอม สตรอเบอร์รี่(strawberry)
 
โครงงานคอมพิวเตอร์ เรื่อง โรคซึมเศร้า
โครงงานคอมพิวเตอร์ เรื่อง โรคซึมเศร้าโครงงานคอมพิวเตอร์ เรื่อง โรคซึมเศร้า
โครงงานคอมพิวเตอร์ เรื่อง โรคซึมเศร้า
 
ตัวอย่างบทคัดย่อ
ตัวอย่างบทคัดย่อตัวอย่างบทคัดย่อ
ตัวอย่างบทคัดย่อ
 
คู่มือ Thunkable
คู่มือ Thunkableคู่มือ Thunkable
คู่มือ Thunkable
 
ตัวอย่างโครงงานคอม
ตัวอย่างโครงงานคอมตัวอย่างโครงงานคอม
ตัวอย่างโครงงานคอม
 
แบบฝึกหัดโครงสร้างการเขียนผังงาน
แบบฝึกหัดโครงสร้างการเขียนผังงานแบบฝึกหัดโครงสร้างการเขียนผังงาน
แบบฝึกหัดโครงสร้างการเขียนผังงาน
 
บทที่ 5 การแปลง er diagram ให้เป็น table
บทที่ 5 การแปลง er diagram ให้เป็น tableบทที่ 5 การแปลง er diagram ให้เป็น table
บทที่ 5 การแปลง er diagram ให้เป็น table
 
ผลวิเคราะห์การจัดประชุมสัมมนา
ผลวิเคราะห์การจัดประชุมสัมมนาผลวิเคราะห์การจัดประชุมสัมมนา
ผลวิเคราะห์การจัดประชุมสัมมนา
 
รูปเล่มวิชาโครงงาน
รูปเล่มวิชาโครงงานรูปเล่มวิชาโครงงาน
รูปเล่มวิชาโครงงาน
 
เกณฑ์การประเมินรูบริคส์
เกณฑ์การประเมินรูบริคส์เกณฑ์การประเมินรูบริคส์
เกณฑ์การประเมินรูบริคส์
 
บทที่3 วิธีดำเนินงาน
บทที่3 วิธีดำเนินงานบทที่3 วิธีดำเนินงาน
บทที่3 วิธีดำเนินงาน
 
ตัวอย่างโครงงาน
ตัวอย่างโครงงานตัวอย่างโครงงาน
ตัวอย่างโครงงาน
 
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซีใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
 
บทที่ 5สรุปผล และข้อเสนอแนะ
บทที่ 5สรุปผล และข้อเสนอแนะบทที่ 5สรุปผล และข้อเสนอแนะ
บทที่ 5สรุปผล และข้อเสนอแนะ
 
ใบงาน1ประมวลผลคำ
ใบงาน1ประมวลผลคำใบงาน1ประมวลผลคำ
ใบงาน1ประมวลผลคำ
 
รูปเล่มวิชาโครงงาน
รูปเล่มวิชาโครงงานรูปเล่มวิชาโครงงาน
รูปเล่มวิชาโครงงาน
 

Similar a แนะนำการเขียนโปรแกรมภาษาแอสเซมลีเบื้องต้น

พื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาพื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาJK133
 
บทที่ 4 การเขียนโปรแกรมภาษาแอสแซมบลี
บทที่ 4 การเขียนโปรแกรมภาษาแอสแซมบลีบทที่ 4 การเขียนโปรแกรมภาษาแอสแซมบลี
บทที่ 4 การเขียนโปรแกรมภาษาแอสแซมบลีNattawut Kathaisong
 
โครงสร้างของโปรแกรมภาษาซี
โครงสร้างของโปรแกรมภาษาซีโครงสร้างของโปรแกรมภาษาซี
โครงสร้างของโปรแกรมภาษาซีณัฐพล บัวพันธ์
 
รายงาน PHP - Know2pro.com
รายงาน PHP - Know2pro.comรายงาน PHP - Know2pro.com
รายงาน PHP - Know2pro.comKnow Mastikate
 
งานนำเสนอ1
งานนำเสนอ1งานนำเสนอ1
งานนำเสนอ1Thank Chiro
 
พื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาพื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาSaranporn Rungrueang
 
พื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาพื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาAeew Autaporn
 
ภาษา C
ภาษา Cภาษา C
ภาษา C0872671746
 

Similar a แนะนำการเขียนโปรแกรมภาษาแอสเซมลีเบื้องต้น (20)

พื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาพื้นฐานภาษาจาวา
พื้นฐานภาษาจาวา
 
บทที่ 4 การเขียนโปรแกรมภาษาแอสแซมบลี
บทที่ 4 การเขียนโปรแกรมภาษาแอสแซมบลีบทที่ 4 การเขียนโปรแกรมภาษาแอสแซมบลี
บทที่ 4 การเขียนโปรแกรมภาษาแอสแซมบลี
 
C slide
C slideC slide
C slide
 
งานจารทรงศักดิ์
งานจารทรงศักดิ์งานจารทรงศักดิ์
งานจารทรงศักดิ์
 
Basic
BasicBasic
Basic
 
3 instruction design
3 instruction design3 instruction design
3 instruction design
 
โครงสร้างของโปรแกรมภาษาซี
โครงสร้างของโปรแกรมภาษาซีโครงสร้างของโปรแกรมภาษาซี
โครงสร้างของโปรแกรมภาษาซี
 
รายงาน PHP - Know2pro.com
รายงาน PHP - Know2pro.comรายงาน PHP - Know2pro.com
รายงาน PHP - Know2pro.com
 
งานนำเสนอ1
งานนำเสนอ1งานนำเสนอ1
งานนำเสนอ1
 
Php beginner
Php beginnerPhp beginner
Php beginner
 
C lu
C luC lu
C lu
 
งานคอม 1
งานคอม 1งานคอม 1
งานคอม 1
 
Know 1 1
Know 1 1Know 1 1
Know 1 1
 
พื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาพื้นฐานภาษาจาวา
พื้นฐานภาษาจาวา
 
พื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาพื้นฐานภาษาจาวา
พื้นฐานภาษาจาวา
 
Presentation1
Presentation1Presentation1
Presentation1
 
lesson 3
lesson 3lesson 3
lesson 3
 
Computer Programming 1
Computer Programming 1Computer Programming 1
Computer Programming 1
 
ภาษา C
ภาษา Cภาษา C
ภาษา C
 
3.8 การทำงานตามลำดับ
3.8 การทำงานตามลำดับ3.8 การทำงานตามลำดับ
3.8 การทำงานตามลำดับ
 

Más de Phusit Konsurin

นักศึกษากับการแสวงหาความรู้ในศตวรรษที่21
นักศึกษากับการแสวงหาความรู้ในศตวรรษที่21นักศึกษากับการแสวงหาความรู้ในศตวรรษที่21
นักศึกษากับการแสวงหาความรู้ในศตวรรษที่21Phusit Konsurin
 
สอนการใช้งาน Debug ใน DOS mode
สอนการใช้งาน Debug ใน DOS modeสอนการใช้งาน Debug ใน DOS mode
สอนการใช้งาน Debug ใน DOS modePhusit Konsurin
 
สร้างแบบทดสอบออนไลน์ ด้วยโปรแกรม Hot Potatoes
สร้างแบบทดสอบออนไลน์ ด้วยโปรแกรม Hot Potatoesสร้างแบบทดสอบออนไลน์ ด้วยโปรแกรม Hot Potatoes
สร้างแบบทดสอบออนไลน์ ด้วยโปรแกรม Hot PotatoesPhusit Konsurin
 
สร้าง E book ด้วยโปรแกรม sigil
สร้าง E book ด้วยโปรแกรม sigilสร้าง E book ด้วยโปรแกรม sigil
สร้าง E book ด้วยโปรแกรม sigilPhusit Konsurin
 
3D button and Animation Tips in Powerpoint
3D button and Animation Tips in Powerpoint3D button and Animation Tips in Powerpoint
3D button and Animation Tips in PowerpointPhusit Konsurin
 

Más de Phusit Konsurin (7)

นักศึกษากับการแสวงหาความรู้ในศตวรรษที่21
นักศึกษากับการแสวงหาความรู้ในศตวรรษที่21นักศึกษากับการแสวงหาความรู้ในศตวรรษที่21
นักศึกษากับการแสวงหาความรู้ในศตวรรษที่21
 
สอนการใช้งาน Debug ใน DOS mode
สอนการใช้งาน Debug ใน DOS modeสอนการใช้งาน Debug ใน DOS mode
สอนการใช้งาน Debug ใน DOS mode
 
สร้างแบบทดสอบออนไลน์ ด้วยโปรแกรม Hot Potatoes
สร้างแบบทดสอบออนไลน์ ด้วยโปรแกรม Hot Potatoesสร้างแบบทดสอบออนไลน์ ด้วยโปรแกรม Hot Potatoes
สร้างแบบทดสอบออนไลน์ ด้วยโปรแกรม Hot Potatoes
 
สร้าง E book ด้วยโปรแกรม sigil
สร้าง E book ด้วยโปรแกรม sigilสร้าง E book ด้วยโปรแกรม sigil
สร้าง E book ด้วยโปรแกรม sigil
 
Joomla Day1
Joomla  Day1Joomla  Day1
Joomla Day1
 
Joomla Day2
Joomla Day2Joomla Day2
Joomla Day2
 
3D button and Animation Tips in Powerpoint
3D button and Animation Tips in Powerpoint3D button and Animation Tips in Powerpoint
3D button and Animation Tips in Powerpoint
 

แนะนำการเขียนโปรแกรมภาษาแอสเซมลีเบื้องต้น

  • 1. 1 Introduction to Assembly Language โดย อ.ภูษิต ก้อนสุรินทร์ โปรแกรมที่สร้างโดยภาษาแอสเซมบลีจะถูกแปลงให้เป็นภาษาเครื่องโดยแอสเซมเบลอร์ (Assembler) ดังนั้นเราจะต้องเขียนโปรแกรมให้อยู่ในรูปแบบที่แอสเซมเบลอร์ เข้าใจ ภาษาแอสเซมบลีจะไม่เป็น Case sensitive คือไม่มีความแตกต่างระหว่างการใช้ตัวอักษรแบบ ตัวพิมพ์ใหญ่ (Uppercase)และตัวพิมพ์เล็ก(Lowercase) แต่โดยส่วน ใหญ่จะเขียนตัวคาสั่งให้อยู่ในรูปแบบของ Uppercase และค่าอื่นๆจะให้เป็น Lowercase โครงสร้างของการเขียนภาษาแอสเซมบลี ตัวอย่าง This program prints the message “Hello world” .MODEL small .STACK 100h .DATA msg1 db ‘Hello world’, 10h, 13h, ‘$’ .CODE start: mov ax, @data mov ds, ax mov ah, 9h mov dx, offset msg1 int 21h mov ax, 4c00h int 21h end start .MODEL <model_type> .STACK <stack_size> .DATA ;This is data segment <Define_variables> .CODE ;This is code segment <statements>
  • 2. 2 Statements ในโปรแกรมจะประกอบไปด้วยคาสั่ง (Statement) การเขียนคาสั่งจะเขียน 1 คาสั่ง ต่อ 1 บรรทัด เราเรียกทั้ง บรรทัดว่า “Instruction” ซึ่งจะถูกแอสเซมเบลอร์แปลงให้เป็นภาษาเครื่อง และอีกประเภทหนึ่งคือ “Assembler directive” ซึ่งจะ สั่งให้ แอสเซมเบลอร์ทางานพิเศษบางอย่าง เช่นให้กาหนดพื้นที่ว่างในหน่วยความจาสาหรับค่าตัวแปร หรือใช้สาหรับ การสร้างโปรแกรมย่อย(Procedure) ทั้งการเขียน “Instructions” และ “Directives” จะประกอบไปด้วย 4 ฟิลด์ดังนี้ name operation operand(s) comment ระหว่างฟิลด์จะต้องเว้นช่องว่างอย่างน้อย 1 ช่อง ตัวอย่างของ Instruction เช่น START: MOV CX,5 ;initialize counter START: เป็น name field MOV เป็น Operation CX,5 เป็น Operand ;initialize counter เป็นคาอธิบาย (Comment) ตัวอย่างของ Directive MAIN PROC MAIN เป็น name field ส่วน PROC เป็น Operation เป็นการสร้าง Procedure ชื่อ MAIN Name Field Name field ถูกใช้สาหรับเป็น Instruction labels, Procedure names, Variable names เมื่อมีการแปลงไปเป็น ภาษาเครื่อง Assembler จะแปลงชื่อเหล่านี้ลงไปยังตาแหน่งของหน่วยความจา Name สามารถจะมีจานวนตัวอักษร ได้ตั้งแต่ 1-31 ตัวอักษร ซึ่งจะประกอบไปด้วย ตัวอักษร, ตัวเลข, เครื่องหมายพิเศษต่างๆ แต่ห้ามมีการใช้ช่องว่างใน การตั้งชื่อ ตัวอย่างของ Name field ที่ถูกต้อง COUNTER @character SUM_OF_DIGITS $100 DONE? .TEST ตัวอย่างของ Name field ที่ไม่ถูกต้อง TWO WORD เพราะมีช่องว่าง 2abc เพราะเริ่มต้นด้วยตัวเลข A45.28 เพราะมีเครื่องหมายจุด (ต้องอยู่ตาแหน่งแรกเท่านั้น) YOU&ME เพราะใช้ตัวอักษร & Operation Field แต่ละ Instruction ตัวที่เป็น Operation field จะมีสัญลักษณ์ของการทางานต่างๆ เช่น MOV, ADD, SUB แทนคาสั่ง การ MOVE ,ADDITIONAL, SUBTRACTION ซึ่งจะถูกแปลให้เป็นภาษาเครื่องโดย Assembler แต่สาหรับ Directives นั้น Operation field จะอยู่ในรูปของ Pseudo-operation code (Pseudo-op) ซึ่งจะไม่มีการแปลงให้เป็น ภาษาเครื่อง เช่นคาว่า PROC ถูกใช้ในการสร้าง Procedure เท่านั้น
  • 3. 3 Operand Field ใน Instruction มี Operand field จะกาหนดข้อมูลที่จะถูกกระทาโดย Operation ซึ่งอาจจะประกอบไปด้วย 1 หรือ 2 หรือไม่มี Operand เลยก็ได้ ดังตัวอย่างต่อไปนี้ NOP ไม่มี operation ไม่มีการทางานใดๆ INC AX มีเพียง 1 operand คือให้เพิ่มค่า 1 เข้าไปใน AX ADD WORD1,2 มี 2 operand คือให้เพิ่มค่า 2 เข้าไปในตัวแปร WORD1 สาหรับ Instruction ที่มี 2 Operand ตัวOperand ตัวแรกจะเป็น “Destination Operand” ซึ่งอาจจะเป็น Register หรือ Variables (Memory location) ซึ่งจะใช้เก็บผลลัพธ์ (แต่ในบางทีก็ไม่ใช้เก็บผลลัพธ์) และ Operand ส่วนที่สองก็จะ เรียกว่า “Source Operand” Comment Field ใช้หรับโปรแกรมเมอร์เพื่ออธิบายสิ่งที่เกิดขึ้นในแต่ละ Instruction โดยมีเครื่องหมาย semi-colon “;” เป็นเครื่องหมาย แรกของการเขียนคาอธิบาย เพราะ Assembler จะยกเลิกการแปลงค่าใดๆ ที่อยู่หลังเครื่องหมาย ; ในการเขียน โปรแกรมที่ดีควรมี คาอธิบายประกอบด้วยเพื่อให้ผู้ที่อ่าน Source Code สามารถเข้าใจได้โดยง่าย เช่น MOV CX,0 ;move 0 to CX อาจจะใช้ข้อความที่สื่อความหมายมากขึ้นคือ MOV CX,0 ; CX counter term ,initialize by 0 หรืออาจจะเขียนคาอธิบายในรูปแบบต่อไปนี้ ; ;initialize register ; MOV AX,0 MOV BX,0 Program Data เนื่องจากโพรเซสเซอร์จะใช้งานข้อมูลในรูปของเลขฐานสอง ดังนั้น Assembler จะต้องทาการแปลงค่าข้อมูลทั้งหมด ให้อยู่ในรูปของเลขฐานสองก่อน แต่อย่างไรก็ตามเรายังคงสามารถใช้ระบบเลขฐานต่างๆ และตัวอักษรได้ตามปกติ แต่เราต้องทราบวิธีการเขียนเพื่อแยกแยะให้ Assembler ทราบว่าข้อมูลนั้นๆ เป็นตัวเลขในระบบใด
  • 4. 4 Numbers ระบบเลขฐานสองจะเขียนโดยใช้ ตัวอักษร B, b อยู่ด้านหลังเช่น 10b ระบบเลขฐานสิบจะเขียนโดยใช้ ตัวอักษร D, d อยู่ด้านหลังเช่น 10d หรืออาจจะไม่ต้องเขียน ระบบเลขฐานสิบหกจะเขียนโดยใช้ ตัวอักษร H, h อยู่ด้านหลังเช่น 10h แต่ถ้าเป็น A-F ทั้งหมดจะต้องมี 0 อยู่ ด้านหน้าเสมอเช่น 0ABCh Number Type 11011 Decimal 11011b Binary -1234 Illegal ->เพราะมี - 1,234 Illegal ->เพราะมี , 1BD4h Hex 1BD4 Illegal -> ขาด h FFFFh Illegal ->เพราะขาด 0 นาหน้า 0FFFFh Hex Character สาหรับข้อมูลที่เป็น Character หรือ Character string จะใช้เครื่องหมาย “ ” หรือ ‘ ’ เช่น “A” ‘Hello’ โดย Assembler จะแปลงค่าให้เป็น รหัส ASCII ดังนั้นถ้าเราใช้ 41h ก็ไม่มีความแตกต่างกับ “A” ในโปรแกรม Variables บทบาทของตัวแปรในโปรแกรมภาษาแอสเซมบลี นั้นก็จะเหมือนกับโปรแกรมภาษาระดับสูง โดยตัวแปรแต่ละตัวจะ มี data type ของตัวเองและถูกกาหนดตาแหน่งในหน่วยความจาโดย โปรแกรม สาหรับในโปรแกรมภาษาแอสเซมบลี จะมีการกาหนดชนิดของข้อมูลจะเรียกว่า Pseudo-op ดังนี้ Pseudo-op ความหมาย DB Define Byte DW Define Word DD Define Double word DQ Define Quad word DT Define Tenbytes Byte Variables ในส่วนของ assembler directive นั้นจะมีการกาหนดค่าตัวแปรให้เป็น Byte โดยมีรูปแบบดังนี้ name DB initial_value ตัวอย่างเช่น ALPHA DB 4
  • 5. 5 จะทาให้ assembler รู้จักว่า ส่วนของหน่วยความจา ที่มีชื่อว่า ALPHA นั้นมีเป็นชนิด byte และมีค่าเริ่มต้นคือ 4 ถ้ายัง ไม่ต้องการกาหนดค่าเริ่มต้นสามารถใช้เครื่องหมาย ? แทน เช่น BYT DB ? ค่าของตัวแปร BYT นั้นจะมีค่าที่อาจเป็นไปได้คือ -128 ถึง 127 ถ้าเป็นแบบ signed หรือ 0-255 ถ้าเป็น Unsigned Word Variables ในส่วนของ assembler directive นั้นจะมีการกาหนดค่าตัวแปรให้เป็น Word โดยมีรูปแบบดังนี้ name DW initial_value ตัวอย่างเช่น WRD DW -2 ตัวแปรชื่อ WRD มีชนิดข้อมูลเป็นแบบ Word และมีค่าเริ่มต้นเป็น -2 และถ้ามีการใช้เครื่องหมาย ? แทนค่าเริ่มต้น จะ ทาให้ช่วงของข้อมูลจะขึ้นอยู่กับว่าเป็น Signed (-32768 ถึง 32767) หรือ Unsigned (0 ถึง 65535) Arrays ในภาษาแอสเซมบลีนั้น array จะเป็นโครงสร้างข้อมูลที่อยู่เรียงกันในหน่วยความจา โดยขนาดของสมาชิกแต่ละตัวจะ ขึ้นอยู่กับ data type ว่าจะเป็น DB หรือ DW ตัวอย่าง สาหรับ array ขนาด 3 ตัวโดยมีชื่อว่า B_ARRAY มีชนิดข้อมูล แบบ byte และได้กาหนดค่าเริ่มต้นคือ 10h, 20h, 30h จะกาหนดได้ดังนี้ B_ARRAY DB 10h, 20h, 30h Array ชื่อ B_ARRAY ถูกกาหนดไว้ในหน่วยความจาโดยมีค่า Offset เป็น 0200h ดังนั้นถ้าพิจารณาใน array นี้คือ การอ้างอิง Address contents B_ARRAY 200h 10h B_ARRAY + 1 201h 20h B_ARRAY + 2 202h 30h ทานองเดียวกัน ถ้ากาหนดให้ Array มีชนิดข้อมูลแบบ Word ก็สามารถกาหนดได้คือ W_ARRAY DW 1000, 40, 29887, 329 จะมีข้อมูลในหน่วยความจาที่ Offset ที่ 0300 ดังนี้ การอ้างอิง Address contents W_ARRAY 0300h 1000d W_ARRAY + 1 0301h 40d W_ARRAY + 2 0302h 2988d W_ARRAY + 3 0303h 329d High and Low Bytes and Word บางครั้งเราจาเป็นที่จะต้องมีการอ้างอิงการใช้งานจากตาแหน่งในหน่วยความจาในรูปแบบ High และ Low Bytes ใน ตัวแปรแบบ Word จะพิจารณาจากตัวอย่างต่อไปนี้ WORD1 DW 1234h 4 3 2 1
  • 6. 6 ถ้ามีการอ้างอิงถึง low byte ในตัวแปรนี้จะได้ข้อมูลคือ 12h สัญลักษณ์ที่ใช้อ้างอิงคือ WORD1 และถ้าอ้างอิงถึงค่าใน High byte จากตัวแปรนี้คือ 34h และสัญลักษณ์ที่ใช้อ้างอิงคือ WORD1 + 1 Character strings สาหรับ Array ที่มีการเก็บข้อมูลที่ใช้รหัส ASCII การกาหนดค่าชนิดข้อมูลและค่าเริ่มต้น สามารถกระทาได้ดังนี้ LETTERS DB ‘ABC’ ซึ่งมีค่าเท่ากับการกาหนดดังนี้ LETTERS DB 41h, 42h, 43h1 ส่วนค่าที่เป็นข้อความ (String) ก็สามารถกาหนดค่าเริ่มต้นได้ดังนี้ MSG DB ‘HELLO’, 0Ah, 0Dh, ‘$’ หรือ MSG DB 48h, 45h, 4Ch, 4Fh, 0Ah, 0Dh, 24h Named Constants ค่าคงที่มีความจาเป็นในการเขียนโปรแกรม และในภาษาแอสเซมบลี ก็มีการใช้ค่าคงที่ในการทางาน สาหรับการ กาหนดค่าจะใช้คาสั่ง EQU (Equates) เพื่อทาการกาหนดค่าคงที่ให้ตัวแปรที่จะนาไปใช้ในโปรแกรม โดยมีรูปแบบคือ name EQU2 constant ตัวอย่างเช่น LF EQU 0Ah จะมีการกาหนดค่า 0Ah ซึ่งเป็นรหัส ASCII ที่ใช้ในการเลื่อนหน้ากระดาษ (line feed) ให้แก่ตัวแปร LF แทนที่เราจะ เขียน 0Ah ในส่วนต่างๆของโปรแกรม และเมื่อมีการเปลี่ยนแปลงแก้ไขค่าข้อมูล ก็จะเสียเวลาในการที่ต้องมาเปลี่ยน ทุกๆที่ที่ใช้งาน ใน constant เราจะเปลี่ยนค่าเพียงที่เดียวเท่านั้น สาหรับคาสั่งข้างต้น ตัว Assembler จะมองการทางาน เป็นดังนี้ MOV DL,0Ah MOV LF,DL ขั้นตอนการแปลโปรแกรมภาษา Assembly 1. สร้าง Source Code โดยใช้โปรแกรม text Editor และให้บันทึกเป็นนามสกุล .asm 2. แปล Source ให้เป็นแฟ้มเป้าหมาย (Object file) ที่มีนามสกุลเป็น .OBJ โดยใช้โปรแกรม Assembler เช่น MASM (Microsoft Macro Assembler) หรือ TASM (Turbo Assembler) กรณีนี้เราจะใช้ MASM ซึ่งการ แปลทาได้โดยพิมพ์ชื่อโปรแกรม MASM ตามด้วยแฟ้มที่เก็บ source code ของโปรแกรมภาษา Assembly เช่น source program เก็บในไฟล์ชื่อ test.asm ก็สั่งทาการแปลโดยพิมพ์ A:>MASM test ถ้ามีข้อผิดพลาด Assembler จะแจ้งข้อผิดพลาดให้ ให้ทาการแก้ไข Source code แล้วทาการแปลใหม่ ถ้าเราแปล โปรแกรมภาษา Assembly สาเร็จ จะได้แฟ้มเป้าหมายที่มีนามสกุลเป็น .OBJ จากตัวอย่างคือ test.obj 1 41h, 42h, 43h เป็นรหัส ASCII ของตัวอักษร A, B, C ตามลาดับ 2 EQU name จะไม่มีการกาหนดตาแหน่งในหน่วยความจาไว้เหมือนกับตัวแปร
  • 7. 7 3. ใช้โปรแกรม LINK เพื่อทาการเชื่อมโยงแฟ้มเป้าหมาย (object file) เข้ากับ function ต่างๆ ใน library ซึ่ง ผลลัพธ์จะได้ไฟล์โปรแกรมภาษาเครื่องที่สามารถทางาน (execute) ได้ มีนามสกุลเป็น .EXE ซึ่งการ เชื่อมโยงโดยใช้โปรแกรม LINK ทาได้โดยการพิมพ์ชื่อโปรแกรม LINK ตามด้วยชื่อแฟ้มเป้าหมาย (.OBJ) A:>LINK test ซึ่งหลังจากขั้นตอนของการเชื่อมโยงเราจะได้แฟ้มโปรแกรมที่มีนามสกุลเป็น .EXE (Executable file) ที่สามารถเรียกใช้ได้จาก DOS prompt คาสั่งพื้นฐาน ภาษาแอสเซมบลีที่ทางานโดยอาศัยพื้นฐานของโพรเซสเซอร์ 8086นั้น จะประกอบด้วยคาสั่งเป็นร้อยคาสั่งที่ ต้องใช้งาน แต่คาสั่งที่เราต้องรู้จักกันในเบื้องต้น ซึ่งคาสั่งเหล่านี้จะทางานในด้านการโอนย้ายข้อมูล การ คานวณทางคณิตศาสตร์ โดยจะมีการใช้งาน Operand ทั้งในรูปแบบของ bytes และ word MOV and XCHG MOV(MOVE) เป็นคาสั่งที่ใช้ในการโอนถ่ายข้อมูลจาก register ไปยัง register, จาก register ไปยังหน่วยความจา หรือจากตัวเลขหรือตัวอักษรไปยัง register หรือหน่วยความจา โดยมีรูปแบบดังนี้ MOV destination, source ตัวอย่างเช่น MOV AX,BX MOV AX,WORD1 MOV AH,2 MOV AH,'A' จากตัวอย่าง MOV AX,WORD1 จะอ่านว่า "ย้ายค่าจากตัวแปร WORD1 ไปยัง register AX" ผลที่เกิดขึ้นคือจะมีการ นาเอาค่า content ที่อยู่ภายในตัวแปร WORD1 ไปใส่ไว้แทนที่ content ใน register AX ทาให้ content ของ AX เปลี่ยนแปลง ส่วนค่าของตัวแปร WORD1 จะคงเดิม รูปแสดงค่า content ของการ MOV XCHG (Exchange) เป็นคาสั่งที่เตรียมไว้สาหรับการแลกเปลี่ยน contents ระหว่าง register ไปยัง register หรือจาก register ไปยัง หน่วยความจา โดยมีรูปแบบดังนี้ XCHG destination,source 0006 0008 AX WORD1 ก่อนการ MOV 0008 0008 AX WORD1 หลังการ MOV
  • 8. 8 ตัวอย่างเช่น XCHG AH,BL XCHG AX,WORD1 รูปแสดงผลของการใช้คาสั่ง XCHG ข้อห้ามของการใช้คาสั่ง MOV Destination Operand Source Operand General register Segment register Variables Constant General register     Segment register     Variables     Constant     ข้อห้ามของการใช้คาสั่ง XCHG Destination Operand Source Operand General register Variables General register   Variables   ตัวอย่างของการใช้คาสั่งที่ไม่ถูกต้อง MOV WORD1,WORD2 ;WORD1 และ WORD2 เป็นตัวแปรทั้งคู่ ควรจะแก้ไขให้เป็น MOV AX, WORD1 MOV WORD2, AX 0006 0008 AX WORD1 ก่อนการ XCHG 0008 0006 AX WORD1 หลังการ XCHG
  • 9. 9 ADD, SUB, INC and DEC คาสั่งในการบวก(ADD : Addition) และลบ(SUB : Subtraction) จะเป็นการนาเอา contents ระหว่าง register 2 ตัว หรือระหว่าง register กับ ตัวแปร หรือระหว่างตัวเลขกับ register หรือ กับตัวแปร โดยมีรูปแบบคือ ADD destination, source SUB destination, source ตัวอย่างเช่น ADD WORD1,AX จะอ่านว่า "ให้บวกค่า content ใน register AX เข้ากับค่า content ในตัวแปร WORD1 แล้วนาเอาผลลัพธ์ไปเก็บไว้ที่ตัว แปร WORD1" SUB AX,DX จะอ่านว่า "ให้เอา register DX ไปลบออกจาก register AX แล้วนาเอาผลลัพธ์ไปเก็บไว้ที่ register AX" รูปแสดงผลของการใช้คาสั่ง ADD WORD1, AX รูปแสดงผลของการใช้คาสั่ง SUB AX,DX ข้อห้ามของการใช้คาสั่ง ADD, SUB Destination Operand Source Operand General register Variables General register Variables Constant 0006 0008 AX WORD1 ก่อนการ ADD 0008 0006 AX WORD1 01BCh 0523h 01BCh 06DFh หลังการ ADD 0006 0008 AX DX ก่อนการ SUB 0008 0006 AX DX 0000h 0001h FFFFh 0001h หลังการ SUB
  • 10. 10 Shift Instructions คาสั่ง shift เป็นคาสั่งที่ทาให้มีการเลื่อนข้อมูลใน bit โดยจะมีการเลื่อนไป 1 bit หรือมากกว่าก็ได้ คาสั่งใน การ shift จะทาให้ ตัวที่ถูกเลื่อนออกไปสูญหายไป ซึ่งไม่เหมือนกับคาสั่ง rotate ซึ่งเมื่อค่า bit ถูกเลื่อนออกไปก็จะมี การนากลับเข้ามาในกลุ่มของ bit อีก โดยจะมีลักษณะคาสั่งคือ Opcode destination,1 หรือ Opcode destination,CL Left shift Instructions คาสั่งคือ SHL (Shift Left) คาสั่งนี้จะทาให้เกิดการเลื่อนค่า bit ใน destination ไปยังด้านซ้ายโดยมีรูปแบบ คาสั่งคือ SHL destination,1 ค่า 0 จะถูกใส่เข้ามาทาง bit ขวาสุดของ destination ทาให้ค่าใน msb ถูกเลื่อนออกไปเก็บที่ CFซCarry Flag(ตามรูปที่ 7.2 ) แต่ถ้าต้องการให้มีการเลื่อนออกไปจานวน N bits ก็จะมีรูปแบบคือ SHL destination,CL เมื่อค่า CL ใช้เก็บค่าจานวน bit ที่ต้องการให้มีการเลื่อน คาสั่ง SHL จะกระทบ กับ Flags SF, PF, ZF จะขึ้นอยู่กับผลลัพธ์ AF ไม่มีการกาหนด CF จะขึ้นอยู่กับค่าที่ถูกเลื่อนออกมา OF จะถูกเซต (1) ถ้าผลลัพธ์ทาให้เกิดการเปลี่ยนแปลงเครื่องหมาย แสดงภาพของคาสั่ง SHL,SAL (Word, Byte) ตัวอย่าง สมมุติให้ DH เก็บข้อมูล 8Ah และมีค่า CL คือ 3 ค่าของ DH และ CF จะเป็นอย่างไรเมื่อเราใช้คาสั่ง SHL DH,CL DH จะเก็บค่า 8Ah = 1000 1010 b gเมื่อมีการเลื่อน 3 ครั้งดังนี้ ครั้งที่ 1  0 00010100 CF 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 CF 0 7 6 5 4 3 2 1 0
  • 11. 11 ครั้งที่ 2  0 00101000 ครั้งที่ 3  0 0101 0000 ซึ่ง 0101 0000 มีค่าเท่ากับ 50h จะถูกเก็บอยู่ใน DH Multiplication by Left Shift ถ้าเราพิจารณา ตัวเลขในระบบฐานสิบคือ 543 ถ้าแต่หลัก มีการเลื่อนไปทางด้านซ้าย 1 ตาแหน่ง โดยมีการใช้ ค่าตัวเลข 0 เข้ามาทางด้านขวา จะได้ 5430 ซึ่งก็เหมือนกับการเอาค่า 543 คูณด้วยเลข 10 นั่นเอง ในทานองเดียวกัน การทา left shift กับตัวเลขในระบบเลขฐานสอง ก็เหมือนกับการเอาเลขฐานสองนั้นมาคูณด้วยเลข 2 ตัวอย่างเช่น ให้ AL มีค่าเท่ากับ 5d = 0000 0101b ถ้ามีการ Shift left ไป 1 ครั้ง ผลที่ได้คือ 00001010 ซึ่งมีค่าเท่ากับ 10d ถ้าเราเอาค่า เดิมมา shift left อีกก็ย่อมได้ผลลัพธ์คือ 20d อย่างแน่นอน SAL Instructions ดังที่กล่าวมาว่าคาสั่ง SHLสามารถใช้ในการคูณได้ แต่อย่างไรก็ตามถ้าต้องการเน้น ให้เป็นการคาสั่งในเชิง คณิตศาสตร์โดยตรงก็สามารถใช้คาสั่ง SAL (Shift Arithmetic Left) ซึ่งจะถูกนามาใช้บ่อยๆ เมื่อมีการคูณแบบนี้ เกิดขึ้น ซึ่งอย่างไรก็ตามคาสั่ง SHL และ SAL ก็ จะถูกสร้างให้เป็น machine code ตัวเดียวกัน สาหรับตัวเลขที่ติดลบ สามารถที่จะนามาใช้ในการคูณได้โดยจะมีการยกกาลังตามการ left ship ตัวอย่างเช่น AX = FFFFh(-1d) ถ้ามีการ shift ไป 3 ครั้งจะได้ผลลัพธ์คือ FFF8h (-8d) Right Shift Instructions คาสั่ง SHR(Shift Right) จะทาให้เกิดการเลื่อนbit ไปทางด้านขวาของ destination โดยมีรูปแบบคือ SHR destination,1 จะมีการนาเอาค่า 0 ใส่เข้ามาทาง msb ทาให้เลื่อน bit จานวน 1 bit ออกไปทางด้านขวา และเลื่อนค่าของ bit ขวาสุดออกไปไว้ที่ CF (รูปที่ 7.3) หรือถ้ามีการเลื่อนมากกว่า 1 bit ก็จะใช้ คาสั่งคล้ายๆกับคาสั่ง SHL คือ SHR destination,CL ตัวอย่าง สมมุติให้ DH มีค่าเท่ากับ 8Ah และค่า CL = 2 ถ้าใช้คาสั่ง SHR DH,CL จะทาให้ผลลัพธ์ที่ได้ใน DH และค่า ของ CF คืออะไร ค่าใน DH = 8Ah = 1000 1010 b ครั้งที่ 1  0100 0101 0 ครั้งที่ 2  0010 0010 1 ดังนั้น DH = 0010 0010 = 22h และค่าใน CF คือ 1 แสดงคาสั่ง SHR (Word, Byte) CF 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 CF 0 7 6 5 4 3 2 1 0
  • 12. 12 The SAR instruction คาสั่ง SAR (Shift Arithmetic Right) ก็จะทางานคล้ายๆกับคาสั่ง SHR แต่จะมีความแตกต่าง คือค่าใน msb ยังคงตัวเดิมไม่มีการเปลี่ยนแปลง (รูปที่ 7.4) โดยมีรูปแบบคือ SAR destination,1 และ SAR destination,CL ผลต่อ Flags ก็เหมือนกับคาสั่ง SHL ผังแสดงคาสั่ง SAR (Word, Byte) การหารโดยการใช้ Right Shift เป็นเพราะว่า left shift ทาให้ค่าใน destination มีค่าเพิ่มจากเดิมเป็น 2 เท่า ก็พอจะเป็นการเดาเหตุผลง่ายๆได้ ว่า right shift ก็ย่อมทาให้ค่าใน destination ลดลง ครึ่งหนึ่งได้ เหมือนกับการหารด้วย 2 นั่นเอง แต่จะถูกต้องเฉพาะ ค่าที่เป็นเลขจานวนคู่ แต่ถ้าสาหรับเลขจานวนคี่แล้วคาสั่งในการทาแบบ right shift จะมีการปัดค่าทิ้ง ตัวอย่างเช่น BL = 5= 0000 0101b เมื่อใช้คาสั่ง SAL BL,1 จะได้ 0000 0010 = 2 Signed and unsigned division ในการหารโดย right shift เราจาเป็นที่จะต้องแสดงให้เห็นความแตกต่างระหว่างตัวเลขแบบ Signed และ unsigned ใน กรณีที่มีการทางานกับ unsigned ก็จะเลือกใช้คาสั่ง SHR แต่ถ้าเป็น signed จะเลือกใช้ SAR เป็นเพราะรูปแบบของ SAR ยังคงรักษา msb ไว้ซึ่งเป็น bit สาหรับเก็บเครื่องหมายอยู่แล้วทาให้เครื่องหมายไม่เปลี่ยนแปลง ตัวอย่าง ให้ใช้ right shift หารตัวเลขที่เป็น unsigned ระหว่าง 65143 ถูกหารโดย 4 แล้วเก็บผลลัพธ์ไว้ที่ AX ในการหารด้วย 4 นั้นจะต้องเป็นการทา right shift 2 ครั้งเพราะการทา right shift แต่ละครั้งก็คือการด้วย 2 นั่นเอง และ ก็เป็นการหารตัวเลขแบบ unsigned จึงเลือกใช้คาสั่ง SHR จะได้ MOV AX,65143 MOV CL,2 SHR AX,CL ตัวอย่าง ถ้า AL = -15 ถ้ามีการใช้คาสั่ง SAR AL,1 จะได้ผลลัพธ์ที่เก็บใน AL คืออะไร คาสั่ง SAR AL,1 ทาให้เกิดการหารค่า -15 ด้วยเลข 2 ได้ผลลัพธ์เป็น - 7.5 แต่จะมีการปัดค่าทศนิยม จะได้ -8 -15 => 1111 0001 b หลังการ SAR => 1111 1000 b = -8 CF 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 CF 7 6 5 4 3 2 1 0
  • 13. 13 Rotate Instructions คาสั่ง ROL (Rotate Left) จะทาให้มีการเลื่อน bit ไปทั้งด้านซ้าย และค่าใน msb จะถูกเลื่อนออกไปเก็บที่ bit ด้านขวา สุด และ CF ยังคงเก็บค่าที่มีการเลื่อนออกจาก msb ดังนั้นลักษณะของการเลื่อนจะเป็นแบบวงกลม จากค่าใน lsb กับ msb (รูปที่ 7.5) โดยมีรูปแบบคาสั่งคือ ROL destination,1 และ ROL destination,CL คาสั่ง ROR (Rotate Right) จะทางานคล้ายๆกับคาสั่ง ROL แตกต่างกันเพียงการเลื่อนของ bit จะดาเนินไปทางด้านขวา bit ทางด้านขวาสุดจะถูกเลื่อนออกไปที่ msb และ CF (รูปที่ 7.6) โดยมีรูปแบบคือ ROR destination,1 และ ROR destination,CL สาหรับคาสั่ง ROL และ ROR ค่าใน CF จะขึ้นอยู่กับ ค่าของ bit ที่ถูกเลื่อนออกไป ตัวอย่างต่อไปนี้จะแสดงให้เห็น ว่า เราจะสามารถตรวจสอบ bit ในชุดข้อมูลขนาด byte หรือ word โดยไม่มีการเปลี่ยนแปลงค่าข้อมูลเลย ตัวอย่าง จะใช้คาสั่ง ROL เพื่อทาการนับจานวนของ bit ที่มีค่าเป็น 1 ใน BX โดยไม่มีการเปลี่ยนแปลงค่า BX เลย และให้นามาเก็บไว้ที่ AX XOR AX,AX ;AX count bit MOV CX,16 ;assign loop counter TOP: ROL BX,1 ;CF = bit that rotate out JNC NEXT INC AX ;increment total if 1 bit was found NEXT: LOOP TOP ;loop until done จากตัวอย่าง เราจะใช้คาสั่ง JNC(Jump if Not carry) เพราะจะให้มีการกระโดดไปยังส่วนของ NEXT นั่นคือให้มีการ วนรอบใหม่ ถ้าค่าใน CF ยังคงเป็น 0 อยู่ และถ้าค่าใน CF = 1 ก็จะมีการเพิ่มค่าการนับให้แก่ AX CF 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 CF 7 6 5 4 3 2 1 0 CF 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 CF 7 6 5 4 3 2 1 0
  • 14. 14 Rotate Carry Left คาสั่ง RCL (Rotate through Carry Left) จะเป็นการเลื่อน bit ของ destination ไปด้านซ้าย โดยค่า bit ใน msb จะถูกเลื่อนออกอยู่ที่ CF และค่าที่อยู่ใน CF (ซึ่งเป็นค่าก่อนที่จะเกิดการเลื่อน) จะถูกเลื่อนออกไปเข้าที่ bit ด้านขวาสุด ของชุดข้อมูล หรืออาจจะกล่าวได้ว่า คาสั่ง RCL ทางานคล้ายกับคาสั่ง ROL แต่มีความแตกต่างคือ CF ถูกนาเข้ามา เป็นส่วนหนึ่งของวงรอบการเลื่อนครั้งนี้ (รูปที่ 7.7) โดยมีรูปแบบคาสั่งคือ RCL destination,1 และ RCL destination,CL Rotate Carry Right คาสั่ง RCR (Rotate through Carry Right) ทางานคล้ายกับคาสั่ง RCL ยกเว้นว่า bit ที่มีการเลื่อนจะถูกเลื่อน ไปทางด้านขวา(รูปที่ 7.8) โดยมีรูปแบบคือ RCR destination,1 และ RCR destination, CL ตัวอย่าง ให้ DH = 8Ah , CF = 1 และ CL = 3 ถ้าใช้คาสั่ง RCR DH,CL หลังการทางานของคาสั่งนี้จะทาให้ค่า DH และ CL เป็นอย่างไร CF DH เริ่มต้น 1 1000 1010 ครั้งที่ 1 0 1100 0101 ครั้งที่ 2 1 0110 0010 ครั้งที่ 3 0 1011 0001 ดังนั้น DH = 1011 0001 = B1h และ CF = 1 JMP Instruction คาสั่ง JMP(Jump) จะสั่งให้ CPU กระโดดไปทาคาสั่งตามที่กาหนดไว้ โดยตาแหน่งที่จะกระโดดไปนั้นจะถูกกาหนด ด้วยป้ายชื่อ(label ) ซึ่งจะถูกแปลโดยแอสเซมเบอร์ ให้กลายเป็นที่อยู่(Address) คาสั่ง JMP จะเป็นการกระโดดไปทา คาสั่งอื่นแบบไม่มีเงื่อนไข โดยมีรูปแบบดังนี้ JMP destination ตาแหน่งที่ destination อยู่นั้นมักจะอยู่ในเซกเมนต์เดียวกันกับคาสั่ง JMP แต่เราสามารถสั่งให้มีการกระโดดไปทางาน ในตาแหน่งต่างได้โดยใช้ คาว่า NEAR ,FAR ,SHORT ประกอบกับคาสั่ง คาสั่งการกระโดดแบบไม่มีเงื่อนไขนี้จะมี 2 รูปแบบคือ แบบทางตรง(Direct jump) และแบบทางอ้อม(Indirect jump) แบบทางตรง จะแบ่งออกเป็น 3 แบบคือ 1.1 SHORT การกระโดดแบบสั้นนี้จะใช้จานวนไบต์จานวน 1 ไบต์มาเป็นระยะที่จะนาเอามาบวกเข้า กับค่าใน IP ซึ่งอยู่ในช่วงค่าตัวเลขตั้งแต่ -128 ถึง +127 ก็หมายความว่า จะกระโดดไปข้างหน้าไม่ เกิน 127 ไบต์ และกระโดดไปด้านหลังได้ไม่เกิน 128 ไบต์ CF 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 CF 7 6 5 4 3 2 1 0
  • 15. 15 1.2 NEAR การกระโดดแบบนี้จะแตกต่างจาก SHORT ตรงที่จะมีการใช้จานวนไบต์ 2 ไบต์มาบวก เขากับ IP ดังนั้นจะทาให้สามารถกระโดไปได้ในช่วงขนาด 32 KB(Kilobyte) ก็หมายความว่า สามารถกระโดดไปยังตาแหน่งใดๆก็ได้ที่อยู่ภายใน Segment เดียวกัน เพราะใน 1 Segment จะมี ขนาด 64 KB 1.3 FAR จะใช้ในการกระโดดไปยังตาแหน่งใน Segment ใดๆ ก็ได้ เพราะการกระโดดแบบนี้มีการใช้ จานวนไบต์ ถึง 4 ไบต์ โดยแบ่งออกเป็น 2 ไบต์สาหรับค่า Offset และอีก 2 ไบต์สาหรับค่า Segment เพื่อนาไปใส่ใน IP และ CS ตามลาดับ เราสามารถอ้างอิงไปที่ตาแหน่งใดๆใน หน่วยความจา 1 MB ได้ทันที คาสั่ง JMP สามารถใช้ร่วมกับคาสั่งที่มีการกระโดดแบบมีเงื่อนไขได้ ดังตัวอย่างต่อไปนี้จะสมมุติให้เราต้องการ เรียกใช้คาสั่งใน Loopต่อไปนี้ TOP : ;body of the loop DEC CX ; decrement counter JNZ TOP ; jump to top ,if a result of CX is not 0 MOV AX,BX และใน loop นี้บรรจุเอาคาสั่งไว้หลายคาสั่งดังนั้นทาให้ label TOP อยู่นอกขอบเขต สาหรับคาสั่ง JNZ (ขนาดมี มากกว่า 126 ไบต์ ) ซึ่งเราจะแก้ไขโดยใช้คาสั่ง JMP เข้มาช่วยได้ดังนี้ TOP : ; body of the loop DEC CX JNZ BOTTOM JMP EXIT BOTTOM : JMP TOP EXIT : MOV AX,BX การรับและแสดงข้อมูลโดยใช้ DOS Interrupt ชุดคาสั่งสาหรับ Input และ Output จะถูกเก็บไว้ใน ROM BIOS (Basic Input Output System) และเก็บไว้ในดิสก์ นั่น คือโปรแกรมระบบปฏิบัติการ (Operation System) ซึ่งเป็นโปรแกรมที่มีหน้าที่ควบคุมการทางานของระบบ คอมพิวเตอร์ หรือเป็นตัวกลางระหว่าง ROM BIOS กับ Applications ในการรับและแสดงข้อมูล สามารถเรียกใช้ ชุดคาสั่งที่อยู่ใน ROM BIOS มาใช้ได้ โดยอยู่ในลักษณะการขอใช้ Interrupt โดยจะระบุหมายเลขของ ฟังก์ชัน และ สาหรับรีจิสเตอร์ที่ถูกนามาใช้รับค่าฟังก์ชันคือ AH ร่วมกับ Interrupt หมายเลข 21 Memory Input Devices. Output Devices
  • 16. 16 การอ่านตัวอักษรจากแป้นพิมพ์ ใช้ฟังก์ชันหมายเลข 10 ร่วมกัน Interrupt หมายเลข 21 เช่น MOV AH,10h INT 21h การแสดงตัวอักษรออกทางจอภาพ ใช้ฟังก์ชันหมายเลข 02 ร่วมกัน Interrupt หมายเลข 21 เช่น MOV AH,02h INT 21h การแสดงข้อความออกทางจอภาพ ใช้ฟังก์ชันหมายเลข 09 ร่วมกัน Interrupt หมายเลข 21 เช่น MOV AH,09h INT 21h การหยุดโปรแกรมและกลับสู่ DOS ใช้ฟังก์ชันหมายเลข 4C ร่วมกัน Interrupt หมายเลข 21 เช่น MOV AH,4Ch INT 21h หรือเรียกใช้ INT 20 เพียงอย่างเดียว ตัวอย่างบริการต่างๆ ของ DOS ที่สาคัญ หมายเลข หน้าที่ พารามิเตอร์ 01h รับค่าจากแป้นพิมพ์ Input : AH = 01h Output: AL = รหัส ASCII ของปุ่มที่กด 02h แสดงตัวอักษร Input : AH = 02h DL = รหัส ASCII ของอักษรที่จะแสดง 05h พิมพ์ตัวอักษรทางเครื่องพิมพ์ Input: AH = 05h DL= รหัส ASCII ของอักษรที่จะพิมพ์ 07h อ่านตัวอักษรจากแป้นพิมพ์ แต่ไม่แสดงผล และไม่ตรวจสอบการกด Ctrl-Break Input: AH = 07h Output: AL = รหัส ASCII ของอักษรที่อ่านได้ 08h อ่านตัวอักษรจากแป้นพิมพ์ แต่ไม่แสดงผล และมีการตรวจสอบการกด Ctrl-Break Input: AH = 08h Output: AL = รหัส ASCII ของอักษรที่อ่านได้ 09h พิมพ์ข้อความ(string) Input: AH = 09h DS:DX = ตาแหน่งข้อความที่ต้องการพิมพ์ และข้อความต้องปิดท้ายด้วย $ 0Ah อ่านข้อความ (string) Input: AH = 0Ah
  • 17. 17 DS:DX = ตาแหน่งของ buffer ที่เก็บข้อมูล ที่อ่านเข้ามา 4Ch จบโปรแกรม Input: AH = 4Ch AL = รหัสที่จะส่งคืนสู่ระบบ