មេរៀន មូលដ្ឋាន Assembly

a. រចនាសម្ព័ន្ធកម្មវិធី
1.Syntax
– គ្មានបែងចែក Lower case or Upper case
– 1 standard ត្រូវសរសេរលើ 1 បន្ទាត់
– Ful name ដែលគេប្រើសំរាប់ដាក់ឈ្មោះអថេរ Proc , label ត្រូវមានប្រវែងចាប់ពី 1 -> 31 character និង លើកលែងសញ្ញា Underscore => សញ្ញាពិសេសផ្សេងទៀតពុំអាចប្រើបានដូចជា (? , @ , # , $ , % ) ។
–     ប្រើ ; សំរាប់ការអធិប្បាយ ( Comment)
2. Constance and Variable; បណ្តាលេខ ក្នុង Assembly យើងអាចប្រើបានតែប្រព័ន្ធលេខ Binary , Hexa , Decimal ។
Binary;

01101B => ត្រូវ

01012B => ខុស

01101 => ជាលេខ Dec ពុំមែនជា Bin ទេ

លេខ Hexa;

01h => ត្រូវ

9h => ត្រូវ

0ABh => ត្រូវ

0Bh =>ត្រូវ

Fh => ខុស

សំរាប់ Hexa ត្រូវនាំមុខដោយលេខ ( 0…9) ទើបត្រូវ

Decimal

-> យើងប្រើ D ខាងក្រោយតំលៃលេខដើម្បីបញ្ជាក់ថាលេខ Dec ក្នុងករណីដែលពុំ បាន បញ្ជាក់ថា B , H , D តាម ក្រោយនោះ => Complier យល់ថាជាលេខ Decimal ។

** យើងអាចប្រកាស់អថេរដោយប្រភេទផ្សេងៗគ្នាដូចជា;

DB : Byte

DW : Word

DD : Double word ; 4 byte

DO : 4 word =8 byte

DT : 10 byte

ឧទាហរណ៏;   X1  DB ?

=> X1 ជាអថេរប្រភេទ Byte និងពុំទាន់មានផ្ទុកតំលៃចាប់ផ្តើម X2  DW  2

=> X2 ជាអថេរប្រភេទ Word ដែលមានតំលៃចាប់ផ្តើម =2

3- Array ដោយ Assemply មាន 5 ប្រភេទទិន្នន័យ => មាន 5 ប្រភេទ array ដែរ ។ ក្នុង Assembly array គ្រាន់តែ ជាស៊េរីនៃ Byte memory ឬ word memory ។ ឧទាហរណ៏ array 5 byte ដែលមានតំលៃចាប់ផ្តើម 10 ,20 , 30
=> យើងទទួលបាន;

Element   Address   Content

X             0200h      10

X+1          0201h       20

X+2          0202h      30

ឬ       X             X  DB     ?  ?  ?

=> ត្រៀម 3 byte សំរាប់ X  , X +1 , X+2
4 Constance យើងដឹងថា Constance -> តំលៃរបស់វាពុំអាចផ្លាស់ប្តូរបានទេ

ឧទាហរណ៏;   X     EOU   10

ពេលនេះ X ជាចំនួនថេរដែលមានតំលៃ = 10
5- Structure  Assembly program រួមមាន 3 srgment ដូចជា code seg , Data seg , Stack seg និង Segement និមួយៗ ត្រូវបាន Compile ដាក់បញ្ជូលទៅ Segment Memory រៀងខ្លួន ។

+ Mode Memory;

គឺជាការកំនត់ mode memory អោយ compiler;

▪ model ប្រភេទ                អត្ថាធិប្បាយ

​​SMAL                          Code program  1 seg

Data                1 seg

MEDIUM                  Code Program ច្រើនជាង 1 seg

Data               1 seg

COMPACT            Code program 1 seg

Data ច្រើនជាង 1 seg

LAGE                       Code  program ច្រើនជាង 1 seg

Data                 ច្រើនជាង 1 seg

គ្មាន array ណាច្រើនជា  64K byte

HUGE                    Code program ច្រើនជាង 1 seg

Data  ច្រើនជាង 1 seg

Array អាចធំជាង  64 K byte

+ Data Segement

DS របស់ program គឺជាកន្លែងផ្ទុកការប្រកាសអថេរចំនួនថេរ ។

­ STACK Value

មុខងារកំនត់ទំហំ memory សំរាប់ Stack segment ទៅតាមតំលៃ Value ។ Ex; value=100h => 100h byte សំរាប់ STACK

+ Code segment

គឺជាកន្លែងផ្ទុក Code របស់កម្មវិធីទាំងមូល

­ CODE

……

……

នៅក្នុង code Seg => ត្រូវតែមាន main proc ព្រោះដូច C ដែរដែលវាជា Function មួយសំរាប់កំនត់ទីតាំង

ចាប់ផ្តើមតំបូងបំផុតនៃតំណើរការណ៏កម្មវិធី ។

ឧទាហរណ៏;   កម្មវិធីខាងក្រោមមានមុខងារបង្ហាញ “ A” លើ screen ;

­ madel  Small

­ stack  100h

­ Code

main proc

MOV  AH , 02h

MOV  DL , ‘A’

INT  21h

Main endp

END  MAIN

. Input/Out put Data and Controll/ Looping

+ ប្រើ Function 01 របស់DOS សំរាប់បញ្ជូន 1 character

+ ប្រើ Function 02 របស់DOS សំរាប់បង្ហាញ 1 character

+ ប្រើ Function 09 របស់DOS សំរាប់ out put string on screen

ឧទាហរណ៏កម្មវិធីខាងក្រោមសរសេរបញ្ជូលទិន្នន័យ 1 character អោយទៅអថេរ  x  បន្ទាប់មកបង្ហាញ

ទិន្នន័យរបស់ X ដែលទើបទទួលបានលើ Screen;

­ model small

­ stack 100h

­ Data

X  DB ?

Msg 1 DB  Input a value ; $

Msg 2 DB char was ; $

­ Code

mov dx , @ data , ចាប់ផ្តើមបញ្ជូល Code ក្នុង DS ចូល

mov ds , dx        , ទៅ memory ដើម្បី Register memory

LEA dx , msg 1

Int 21h                            បង្ហាញ msg 1 លើ screen

Mov ah , 01h

Mov ah , 01h

Int 21h                            បញ្ជូលទិន្នន័យ 1 char -> AL បន្ទាប់មកផ្ទេរពី AL -> X

Mov X , al

LEA  dx , msge

Mov oh , 09h          បង្ហាញ string msgz

Int 21h

Mov  dl , x

Mov  ah , 02h                   ផ្ទេរ X ចូល AL ដើម្បីអនុវត្តន៏ Func 2 <- DOS សមរាប់បង្ហាញ content , DL លើ

Int 21h                                                                                                                  screen

Mov  Ah , 4ch

Int  21h                           បញ្ឍប់កម្មវិធី

Main endp

End main

à LEA dx , msg មានន័យថាគណនា Real address msg ( ដែល msg កំពុងចង្អុរទៅកាន់ក្បាល address នៃ array ) រួចផ្ទុក address នោះក្នុង dx ដើម្បីអនិវត្តន៏ Functiong របស់ DOS ។

1> Condiction;

ការត្រួតពិនិត្យល/ខគឺធ្វើឡើងដោយ CMP និង Jump

+ IF  THEN  ELSE

ឧទាហរណ៏;ប្រសិនបើ DL=’A’ នោះត្រូវបង្ហាញ DL លើ Screen ផ្ទុយទៅវិញត្រូវបានបង្ហា្ញញលើ Screen នូវ ‘X’

+ CASE

Case (n)

N=1 ; ការងារ 1

N=2 ; ការងារ 2

;

n=m ; ការងារ m

End case

ឧទាហរណ៏:   ប្រសិនបើ AX=0 -> Out put screen “A”

AX<0 -> Out put screen “B”

AX>0 -> Out put screen “C”

, CASE  AX

CMP  AX , 0

JL  NE GATIVE

JE  ZERO

JG  POSITIVE

­ NE GATIVE;

MOV  DL , ‘B’

­ ZERO;

MOV  DL , “A”

­ POSITIVE;

MOV  DL , “C”

MOV  AH , 02h

INT  21h

; ENDCase

+ ការប្រើ ប្រមាណវិធី Logic ក្នុងការគណនាល/ខ

ដូចជា    Exp 1  AND  Exp2

Exp 1   OR  Exp2

­ AND;

ឧទាហរណ៏;   យើងប្រៀបធៀកន្សោមរបស់ល/ខ ខាងក្រោម

IF (‘A’ <= ch) AND (ch<= “2”)  Then

Display  ch

END IF

MOV  AL , ch

:        ; IF(‘A’ <= AL) and (AL <= ‘Z’) Then

CMP  AL , ‘A’

JNGE  AL . ‘Z’

JNLE  END IF

; Then  Display  AL

MOV  DL , AL

MOV  AH , 02h

INT  21h

END-IF;

­ OR;

ឧទាហរណ៏;   យើងប្រៀបធៀបកន្សោមរបស់ល/ខខាងក្រោម

IF (‘A’ <= ch) OR (ch <= ‘Z’) Then

Display  ch

END IF

MOV  AL , ch

; IF (‘A’ <= AL) OR (AL <= ’Z’) Then

CMP  AL , ‘A’

JAE  THEN-

CMP  AL , ‘Z’ ប្រៀបធៀបល/ខ

JBE  THEN-

JMP  ELSE-

THEN;

MOV  AH , 2h

MOV  DL , AL

INT  21h       ការងារក្នុង Then

JMP  END-IF

ELSE;

MOV  AH , 4ch

INT  21h       ឬការងារផ្សេង

END-IF;

………….

…………

2> Loop

+ FOR;

For ចំនួនជុំ DO

Standards

END FOR
Syntax;

MOV  CX , 80 , CX ជា Reg ប្រើសំរាប់ផ្ទុកចំនួនជុំ​=> 80 ជុំ

MOV  AH , 2 , Out put screen

MOV  DL , ‘#’ , Char for out putting

TOP;

INT  21h ,

LOOP  TOP

Loop TOP នេះមានតួនាទីលោតទៅរក Label ដែលនៅផ្នែកខាងលើ ។ ពេលលោតទៅ TOP វាថែមទាំង អនិវត្តន៏ការងារ DEC CX ដោយស្វ័យប្រវត្តិរហូតដល់ពេលដែល CX ផ្ទុកតំលៃ 0 ទើប Loop ឈប់លោតទៅរក TOP និង អនិវត្តន៏បន្ត Statement បន្ទាប់ទៀត​។

ក្នុងករណ៏ CX ផ្ទុក 0 -> ពេលជួប Loop នោះ CX ត្រូវបានដក 1 ទៀត => CX ផ្ទុក  FFFFh  ដែលវានឹងត្រូវ Loop​ចំនួន 65535 ជុំទៀត ។