Assembly Language ภาษาแอสเซมบลี by variablepitch346

VIEWS: 3,784 PAGES: 78

									2110250 COMPUTER ORGANIZATION (Assembly Language) by Dr.Arthit Thongtak & Tawan Phurat Arthit.t@chula.ac.th & Tawan.p@siamu.ac.th

ลักษณะของภาษาแอสเซมบลี
• ภาษาแอสเซมบลีไม่ได้มีมาตรฐานกาหนดอย่างเช่น C, JAVA • ภาษาแอสเซมบลีจะมีความใกล้ชิดกันกับโครงสร้างของหน่วย ประมวลผล • ภาษาแอสเซมบลีของหน่วยประมวลผลตระกูลหนึ่ง ก็จะแตกต่างกับ ภาษาแอสเซมบลีของหน่วยประมวลผลอีกตระกูลหนึ่ง • รูปแบบของภาษาแอสเซมบลีจะเขียนหนึ่งคาสั่งต่อหนึ่งบรรทัด

ลาดับขั้นตอนจากแฟ้มต้นฉบับภาษาแอสเซมบลีไปสู่แฟ้มที่ สามารถประมวลผลได้
๒)ใช้ MASM แปลงไฟล์เป็น Object ไฟล์
Source file object code

Assembler

๓) ใช้ Link แปลงเป็น Executable ไฟล์

๑) เขียนโปรแกรมด้วย Text editor บันทึกให้มีนามสกุล เป็น .asm

other object code files

Linker

Executable file

other code libraries

ไฟล์ที่ได้จากกระบวนการแปลงไฟล์
• Object File (*.OBJ)
– จะประกอบด้วยภาษาเครื่อง เพื่อนาไป link รวมกันกับไฟล์ obj อื่นๆ(ถ้ามี) เพื่อแปลงเป็นไฟล์ .EXE โดยโปรแกรม LINK

• List File (*.LST)
– จะแสดงผลของการแปลภาษาของโปรแกรมต้นฉบับ รวมทั้งอธิบาย ข้อผิดพลาดที่เกิดขึ้น

• Cross-Reference File (*.CRF)
– จะแสดงรายชื่อต่าง ๆและตาแหน่งของหน่วยความจาที่ใช้ในโปรแกรม

รูปแบบชุดคาสั่ง
[identifier] operation [operand(s)] [;comment]

• • • •

identifier คือชื่ออ้างอิงใช้ตั้งชื่อเพื่อเรียกถึงในภายหลัง (ถ้ามี) operation คือคาสั่ง operand คือตัวดาเนินการที่ต้องใช้ในคาสั่ง(ถ้ามี) ;comment คือคาอธิบายโปรแกรมจะต้องเขียนคาอธิบาย(ถ้ามี) ไว้หลังเครื่องหมายเซมิโคลอน

ตัวอย่างไฟล์ภาษาแอสเซมบลี
ORG 100h ; this directive required for a simple 1 segment .com program. MOV AX, 0B800h ; set AX to hexadecimal value of B800h. MOV DS, AX ; copy value of AX to DS. MOV CL, 'A' ; set CL to ASCII code of 'A', it is 41h. MOV CH, 1101_1111b ; set CH to binary value. MOV BX, 15Eh ; set BX to 15Eh. MOV [BX], CX ; copy contents of CX €to memory at B800:015E RET ; returns to operating system.

ชื่อ (Identifiers)
• กฎการตั้งชื่อ
– สามารถใช้ตัวอักษร A-Z, a-z, 0-9, ?, _, $, @, (.) – ห้ามใช้ตัวเลข 0-9 และ (.) ขึ้นต้นชื่อ – ตัวอักษรเล็ก/ใหญ่ ไม่มีความแตกต่าง ถือเป็นตัวเดียวกัน – สูงสุดที่ 31 ตัวอักษร

คาสงวน (Reserved Words)
• ชื่อต่าง ๆ ในภาษาแอสเซมบลีที่ถูกจองไว้เพื่อวัตถุประสงค์ของแต่ ละตัว • ประเภท
– Instructions – Directives – Operators – Predefined symbols

ส่วนคาสั่ง (Statement)
• operation : code ต่าง ๆ
– defining data areas
– coding instructions

• operand : ตัวดาเนินการที่เกี่ยวข้องตาม operation นั้น ๆ

คาสั่ง(statement)จะมีสองลักษณะคือ
– Instructions : (ชุดคาสั่ง)สิ่งที่แอสเซมเบลอร์จะแปลไปเป็น object code – Directives : สิ่งที่บอกให้แอสเซมเบลอร์ดาเนินการปฏิบัติตามที่ระบุ

Directives...
ได้แก่
– PAGE & TITLE การจัดแบ่งหน้าและการตั้งชื่อหน้ากระดาษ – SEGMENT การประกาศส่วนของเซกเมนต์ – PROC การประกาศส่วนโปรแกรมย่อย – ASSUME การกาหนดเซกเมนต์ต่างๆ – END การจบโปรแกรม

SEGMENT Directive
• กาหนด segment โดยใช้คาสาคัญสองคาคือ
– SEGMENT – ENDS

• ขนาดของ segment คือ 64K. • ชื่อ segment ต้องไม่ซ้า (unique) • และสอดคล้องกับกฎการตั้งชื่อ

รูปแบบของการประกาศ segment

NAME OPERATION OPERAND COMMENT name SEGMENT . . [options] ;จุดเริ่ม segment

name

ENDS

;จุดสิ้น segment

PROC Directive
• ใช้กาหนด procedure ในโปรแกรม
NAME OPERATION OPERAND COMMENT PARA FAR

segname SEGMENT procname PROC procname ENDP segname ENDS

ASSUME Directive
• เพื่อกาหนดวัตถุประสงค์การใช้งานของแต่ละเซกเมนต์ใน โปรแกรม
OPERATION ASSUME OPERAND SS:stackname,DS:datasegname,CS:codesegname,...

Data definition
การให้นิยามข้อมูล เพื่อกาหนดเนื้อที่ในหน่วยความจา สาหรับเก็บค่าของตัวแปร และอาจจะกาหนดค่าเริ่มต้นกับตัว แปรด้วยก็ได้ [name] Dn expression

Data definition...
• name: ชื่อของตัวแปร จะมีหรือไม่มีก็ได้ ถ้ามีจะเป็นค่าของ ออฟเซตของไบต์แรกของคาสั่งนี้ • expression: คือค่าที่กาหนดให้กับตัวแปรอาจจะใส่เป็นค่า เริ่มต้นหรือไม่ใส่ก็ได้ • Dn : เป็นคาสั่งที่กาหนดเนื้อที่ให้กับตัวแปรมี 3 คาสั่งคือ DB, DW, และ DD

ตัวอย่างการกาหนดข้อมูลแบบต่างๆ
– DB คือ Define Byte กาหนด 1 ไบต์ในหน่วยความจา เช่น DATA_BYTE DB 10, 4, 10H – DW คือ Define Word กาหนด 2 ไบต์ในหน่วยความจา เช่น DATA_WORD DW 100, 100H, -5 – DD คือ Define Double Word กาหนด 4 ไบต์ในหน่วยความจา เช่น DATA_DD DD 0FFFCH

ภาพของหน่วยความจาที่ถูกนามาใช้
...

DATA_BYTE
DATA_WORD

0A 04 10 64 00 00 01 FB FF ...

DB

DW

ตัวอย่างการกาหนดค่าข้อมูล
• กาหนดค่าข้อมูลในลักษณะของตาราง
– B_TABLE – B_TABLE DB DB DB DB 0, 0, 0, 0, 8, 13 -10, 0, 5, 63, 63, 63 4 DUP (0), 8, 13, -10, 0, 5, 3 DUP (63)

• การกาหนดค่า Operand ที่ซ้ากัน

• กาหนดเนื้อที่ของตัวแปรโดยไม่ให้ค่าเริ่มต้น
– COUNT – AVERAGE DW ? DW ?

– BUFFER

DB

100 DUP (?)

ตัวอย่างการกาหนดค่าข้อมูล
• กาหนดนิพจน์ที่เป็นตัวอักษร
– MESSAGE DB ‘Enter the number’ DB ‘This number is too large’ DB ‘Please re-enter it’

The EQU Directive
คาสั่งการให้นิยามสัญลักษณ์ โดยที่นิพจน์อาจเป็นค่าคงที่ สัญลักษณ์ ค่าของเซกเมนต์ มีรูปแบบคือ

name

EQU

expression

The EQU Directive...
• สัญลักษณ์ที่ถูกกาหนดจะไม่สามารถเปลี่ยนค่าได้อกในโปรแกรม ี
–K –A EQU EQU 1024 AB+10

–B
– P8

EQU
EQU

[BP+8]
DS:[BP+8]

(=) Directive...
• คาสั่ง (=) เป็นการให้ค่านิพจน์เหมือน EQU แต่จะต่างที่สามารถ ให้ค่านิพจน์ใหม่กับสัญลักษณ์ได้
– CONST = 56

– CONST

=

CONST+1

Basic Instructions
          MOV XCHG LEA ADD/ADC SUB/SBB MUL/IMUL DIV/IDIV CMP INC/DEC NEG

MOV (move)
• เป็นการคัดลอกข้อมูลขนาดไบต์หรือเวิร์ดจากต้นทางไปยังปลายทางโดย ที่ต้นทางและปลายทางอาจจะเป็น รีจิสเตอร์กับรีจิสเตอร์ หรือรีจิสเตอร์ กับตาแหน่งของหน่วยความจา หรือค่าคงที่ไปยังรีจิสเตอร์หรือ หน่วยความจา

MOV
[label:] MOV destination, source ได้แก่
– [label:] MOV register, register – [label:] MOV register, memory – [label:] MOV register, immediate – [label:] MOV memory, register – [label:] MOV memory, immediate

ตัวอย่าง MOV
• • • • • • • MOV MOV MOV MOV MOV MOV MOV AX, Table Table, AX ES:[BX], AX DS, AX BL, AL CL, -30 Dest, 25H

MOV
• ไม่สามารถย้ายข้อมูลระหว่างหน่วยความจาได้โดยตรง ทาให้ต้องใช้ รีจิสเตอร์เป็นตัวกลางในการย้ายข้อมูลระหว่างหน่วยความจา เช่น ต้องการย้ายข้อมูลจาก Pounds ไปยัง Weight โดยผ่าน รีจิสเตอร์ AX
MOV
MOV

AX, Pounds
Weight, AX

MOV
• ไม่สามารถนาค่า immediate เช่นค่า offset ใส่ให้ segment register ได้โดยตรง ต้องใช้รีจิสเตอร์ AX เป็นตัวกลางผ่านค่า offset ไปยัง segment register
MOV AX, @DATA MOV DS, AX

• รีจิสเตอร์ CS ไม่สามารถใช้เป็น destination ของคาสั่ง MOV ได้

XCHG (exchange)
• คาสั่ง XCHG จะสลับค่าเป็นไบต์หรือเวิร์ดระหว่าง operand ที่เป็น source และ destination • สามารถสลับค่าระหว่างรีจิสเตอร์ 2 ตัว หรือระหว่างรีจิสเตอร์กับค่าใน หน่วยความจา • Segment Register ไม่สามารถนามาใช้เป็น operand ได้

XCHG : Format
• [label:] XCHG • [label:] XCHG destination, source register, register

• [label:] XCHG
• [label:] XCHG

register, memory
memory, register

XCHG : Example
• • • • XCHG XCHG XCHG XCHG AX, BX AL, BH DL, Byte Word, DX

LEA (load effective address)
• คาสั่ง LEA จะนาค่าออฟเซตของ Operand ในหน่วยความจา ไปใส่ไว้ในรีจสเตอร์ 16 บิต ิ • รูปแบบคาสั่ง
[label:] LEA register16, memory16

LEA : Example
• นาค่าออฟเซตของ Table ไปใส่ใน BX
Table LEA DB 10,20,30,40,50,60,70

BX, Table

Addition Instruction
• บวก operand 8/16 บิต • ADD
– destination = destination+source

• ADC : ADD with Carry
– destination = destination+source+carry

ADD & ADC : Format
• [Label:] register ADD/ADC register,

• [Label:] ADD/ADC

memory, register

• [Label:] ADD/ADC
• [Label:] ADD/ADC • [Label:] ADD/ADC immediate

register, memory
register, immediate memory,

ADD : Example
• ADD AX, BX

• ADD
• ADD

AL, Byte
Word, AX

• ADD
• ADD

BL, 10H
Byte, 25H

ADC : Example
• ADC AX, BX

• ADC
• ADC

AL, Byte
Word, AX

• ADC
• ADC

BL, 10H
Byte, 25H

Subtraction Instruction
• ลบค่า operand 8/16 บิต

• CF ทาหน้าที่เหมือนตัวยืม • SUB
– destination = destination-source

• SBB : Subtract with Borrow
– destination = destination-source-carry

SUB & SBB : Format
• [Label:] register SUB/SBB register,

• [Label:] SUB/SBB

memory, register

• [Label:] SUB/SBB
• [Label:] SUB/SBB • [Label:] SUB/SBB immediate

register, memory
register, immediate memory,

SUB : Example
• SUB AX, BX

• SUB
• SUB

AX, Word
Word, AX

• SUB
• SUB

BX, 1000H
Word, 256H

SBB : Example
• SBB AX, BX

• SBB
• SBB

AX, Word
Word, AX

• SBB
• SBB

BX, 1000H
Word, 256H

SUB & SBB : 32 bit
• ถ้าต้องการลบค่า 32 บิต ใช้คาสั่งดังนี้
– กาหนดตัวตั้งใน BX, AX
– ตัวลบอยู่ใน DX, CX – SUB AX, CX – SBB BX, DX

Multiplication Instruction
• เป็นคาสั่งที่ใช้ในการคูณเลข 8 บิตและ 16 บิต • ผลลัพธ์ที่ได้จากการคูณจะมีขนาดเพิ่มขึ้นเป็น 2 เท่า • มี 2 แบบคือ
– MUL : Unsigned Multiplication – IMUL : Signed Multiplication

Multiplication : 8 bit
• การคูณเลข 8 บิต
– ตัวตั้งเก็บไว้ที่รีจิสเตอร์ AL – ตัวคูณเก็บไว้ที่รีจิสเตอร์หรือหน่วยความจาขนาด 8 บิต – ผลลัพธ์จะมีขนาด 16 บิต เก็บอยู่ในรีจิสเตอร์ AX

Multiplication : 16 bit
• การคูณเลข 16 บิต
– ตัวตั้งเก็บไว้ที่รีจิสเตอร์ AX – ตัวคูณเก็บไว้ที่รีจิสเตอร์หรือหน่วยความจาขนาด 16 บิต – ผลลัพธ์จะมีขนาด 32 บิต เก็บอยู่ในรีจิสเตอร์ DX และ AX
• DX เก็บผลลัพธ์ 16 บิตบน • AX เก็บผลลัพธ์ 16 บิตล่าง

MUL : Format
• [label:] MUL register/memory

• เป็นการคูณแบบไม่คิดเครื่องหมาย • ถ้าครึ่งบนของผลลัพธ์การคูณเป็น 0
– CF และ OF จะมีค่าเป็น 0

IMUL : Format
• [label:] IMUL register/memory

• เป็นการคูณแบบคิดเครื่องหมาย • ถ้าครึ่งบนของผลลัพธ์การคูณเป็น sign-extension
– CF และ OF จะมีค่าเป็น 0

MUL & IMUL : Example
• • • • MUL MUL IMUL IMUL BX Byte DL Word

MUL : Example
• คูณเลขที่ไม่มีเครื่องหมาย ระหว่างเลข 8 บิต กับ 16 บิต
MOV MOV MOV MUL AX, Multiplicand CL, Multiplier CH, 0 CX ; AX = ตัวตั้ง ; CL = ตัวคูณ ; AX = AX * CX

IMUL : Example
• คูณเลขที่มีเครื่องหมาย ระหว่างเลข 8 บิต กับ 16 บิต
MOV CBW MOV IMUL AL, Multiplicand ; AL = เลข 8 บิต ; ขยายเป็น 16 บิต CX, Multiplier ; CX = เลข 16 บิต CX ; AX = AX * CX

Division Instruction
• เป็นคาสั่งที่ใช้ในการหารค่าตัวเลขด้วยเลข 8 บิตและ 16 บิต

• มี 2 แบบคือ
– DIV : Unsigned Division – IDIV : Signed Division

• รูปแบบ
– [label:] DIV/IDIV register/memory

Division : by 8 bit
• การหารเลข 16 บิต ด้วยเลข 8 บิต
– ตัวตั้งขนาด 16 บิตเก็บไว้ที่รีจิสเตอร์ AX
– ตัวหารขนาด 8 บิตเก็บไว้ที่รีจิสเตอร์/หน่วยความจา – ผลลัพธ์
• จานวนเต็มเก็บไว้ที่ AL • เศษเก็บไว้ที่ AH

Division : by 16 bit
• การหารเลข 32 บิตด้วย 16 บิต
– ตัวตั้งขนาด 32 บิตเก็บในรีจิสเตอร์ DX และ AX
• DX เก็บไบต์สูง • AX เก็บไบต์ต่า

– ตัวหารขนาด 16 บิตเก็บในรีจิสเตอร์/หน่วยความจา – ผลลัพธ์
• จานวนเต็มเก็บไว้ที่ AX • เศษเก็บไว้ที่ DX

Division : Overflow
• ถ้าผลลัพธ์จากการหารได้ค่าจานวนเต็มที่ใหญ่กว่าที่ AL หรือ AX

จะเก็บได้ จะเกิดการ Interrupt ชนิด 0 โดย DOS จะแสดง
ข้อความว่า “Divide Overflow”

DIV & IDIV : Example
• • • • • • • • DIV DIV DIV DIV IDIV IDIV IDIV IDIV CL BX byte word DL CX byte word

DIV : Example
• การหารเลขที่ไม่มีเครื่องหมายขนาด 16 บิตด้วยเลข 8 บิต
– MOV AX, 037D7H – MOV BL, 097H – DIV BL ; 14295 ; 151 ; 14295/151

IDIV : Example
• การหารเลขที่มีเครื่องหมายขนาด 16 บิตด้วยเลข 8 บิต
– MOV AX, 03ABH – MOV BL, 0D3H – IDIV BL ; 939 ; -45 ; 939/-45

CMP (compare)
• เป็นคาสั่งที่ใช้เปรียบเทียบค่า 2 ค่า

• ใช้หลักการลบค่า source ออกจาก destination แต่ไม่ได้ เก็บค่าผลลัพธ์ไว้
• มีผลต่อแฟลก AF, CF, OF, PF, SF และ ZF • ใช้ในการตรวจสอบค่าแฟลก เพื่อตัดสินใจในการย้ายคาสั่งการทางาน ไปยังจุดต่าง ๆ

CMP : Format
[label:] • • • • • [label:] [label:] [label:] [label:] [label:] CMPdestination, source CMPregister, register CMPregister, memory CMPregister, immediate CMPmemory, register CMPmemory, immediate

CMP : Example
• • • • • CMP CMP CMP CMP CMP AX, BX CL, count CX, 0 number, AL empty, 0

CMP : Unsigned

Unsigned Operands Condition Source < Destination Source = Destination Source > Destination

OF x x x

SF x x x

ZF 0 1 0

CF 0 0 1

CMP : Signed

Signed Operands Condition Source < Destination Source = Destination Source > Destination

OF SF 0/1 0 0 0 0/1 1

ZF 0 1 0

CF x x x

INC (increment)
• เพิ่มค่าให้กับรีจิสเตอร์/หน่วยความจา 1 ค่า • รูปแบบ
– [label:] INC register/memory

• Example
– INC – INC – INC – INC CX AL byte word

DEC (decrement)
• ลดค่าในรีจิสเตอร์/หน่วยความจา 1 ค่า • รูปแบบ
– [label:] DEC register/memory

• Example
– DEC – DEC – DEC – DEC CX AL byte word

NEG (negate)
• เป็นคาสั่งในการหาค่า 2’s Complement • รูปแบบ
– [label:] NEG register/memory

• Example
– NEG – NEG – NEG – NEG CL BX byte word

การแปลง operator =
• B=A
– MOV AX, A – MOV B, AX

• var1 = var2
– MOV AX, var2 – MOV var1, AX

การแปลง operator +
• X=Y+Z
– MOV AX, Y – ADD AX, Z – MOV X, AX

การแปลง operator • X=Y-Z
– MOV AX, Y – SUB AX, Z – MOV X, AX

การแปลง operator *
• X=Y*Z
– MOV AL, Y – MUL Z – MOV X, AX

การแปลง operator div (unsigned)
• X = Y div Z
– MOV – MOV – DIV – MOV AX, Y DX, 0 Z X, AX

การแปลง operator div (signed)
• X = Y div Z
– MOV AX, Y – CWD – IDIV Z – MOV X, AX

การแปลง operator mod (unsigned)
• X = Y mod Z
– MOV – MOV – DIV – MOV AX, Y DX, 0 Z X, DX

Example
• Temp1 = A + B • Temp2 = Y + Z • W = Temp1 * Temp2

Assembly Code 1
• • • • • • • • • MOV ADD MOV MOV ADD MOV MOV IMUL MOV
Temp2

AX, A AX, B Temp1, AX AX, Y AX, Z Temp2, AX AX, Temp1 Temp2 W, AX

; Temp1 = A + B

; Temp2 = Y + Z

; W = Temp1 *

Assembly Code 2
• • • • • • MOV ADD MOV ADD IMUL MOV AX, A AX, B BX, Y BX, Z BX W, AX

; AX = A + B
; BX = Y + Z ; AX = AX * BX ; W = AX

ตัวอย่าง EXAMPLE
เขียนโปรแกรมด้วย text editor แล้วตั้งชื่อว่า “ex1.asm”
codeseg segment Assume ORG MOV MOV MOV cs:codeseg,ds:codeseg 100H AX,2F0DH ; 16 bits data transfer AL,55H ; 8 bits data transfer AH,0AAH

MOV ADD
MOV INT ends end

CL,01 AH,CL
AH,4CH 21H

;8 bits addition

codeseg


								
To top