Tuesday, September 29, 2009

Та үүнийг мэдэх үү? 16bit assembler-н ердийн командууд

Япон оронд суурьлагдсан систем нийлээн өндөр хөгжилд хүрчээ.
Бидний өгхийг дурлаад хичээгээд бэлдээд байдаг IT-н суурь шалгалтыг Монголд зөвхөн C++ , JAVA хэл дээр авдаг бол. Харин Японд үүн дээр нэгмэгдээд COBOL , Assembler дээр өгч болдог юм байна.
Заримдаа диск болон файлтай ажиллахад JAVA хэл нь аюулгүй байдлын үүднээс энэ талын асуудыг C дээр бичигдсэн бэлэн функцууд дуудан орлуулж ажиллуулдаг. Програм зохиогч хөгжүүлэгч нар файлтай ажиллах системын функцууд руу нэвтэрхэд нилээдгүй саад бэрхшээл учирдаг дутагдалтай байдаг билээ.
   Аа харин WINDOWS -н үйлдлийн систем дээр ажиллаж байх  явцад зарим нэг яв цав баригдсан зарим С хэлний функц процедурууд нь анхлан суралцагч миний хувьд нилээн барьцадмал юм шиг санагдсан.
Энэхүү алдааг өөрийхөөрөө заримдаа орлуулан нэмэн дэлгэрүүлэх шаардлага гардаг нь мэдээж хэрэг тиймээс энэ талаар сонирхдог С хэлний кодерууддаа зориулж жаахан ч гэсэн хэрэг болох болвуу гээд өөрийн туршиж хэрэглэж үзсэн хэдэн коде сийрүүлье.


16bit Assembler’s compiler with source files name length must be 8 character.
Addressing
1)      Регистрээр     Ex: xor al,ah
2)      Утгаар                        Sub al,30
3)      Шууд              Mov count,4                Шилжлэг хаяг =16 бит хаяг
4)      регистрээр дамжуулан шууд бусаар
mov bx,[si]      шилжлэг хаяг = [si/di/bx]
5)      индекс            mov cx,row[di]           шилжлэг хаяг = [si/di]+8/16 бит хаяг
6)      base addressing mov dx,6[bp]                        шилжлэг хаяг = [bx/bp]+8/16 бит хаяг
7)      base indexed addressing         шилжлэг хаяг = [bx/bp] +[si/di]+8/16 бит хаяг
8)      I/O port addressing                  al,40h
Memory type
·         Tiny – near үсрэлт дуудалтууд хэрэглэгдэнэ. Бүх санах ой 64k эзэлдэг.
·         Small – near үсрэлт дуудалтууд хэрэглэгдэнэ. Коде сегмент, өгөгдлийн болон стек сегментүүд мөн 64k эзлэх боломжтой.
·         Medium – коде сегмент 1М өгөгдлийн болон стек сегментүүд 64к байт санах ойг хэрэглэх боломжтой. Кодонд far, өгөгдөл болон стек сегментүүдтэй харцахдаа near үсрэлт дуудалт ашиглана.
·         Compact – medium-эсрэг
·         Large – коде болон стек сегментэд 1М, far үсрэлт дуудалтууд хэрэглэх боломжтой.
·         Huge – far үсрэлт дуудалтыг өгөгдөл болон кодод хэргэлэнэ.
(near үсрэлт гэдэг нь нэг сегмент дотор буюу 64k)
Data declaretion
DB DEFINE BYTE                           - 1b
DW DEFINE WORD                                    - 2b
DD DEFINE DOUBLE WORD       - 4b
DQ DEFINE QUAD WORD                        - 8b
DT DEFINE TEN BYTES                 - 10b
EQU equal                                          - none
  • Hexadecimal – ends with H
  • Binary – ends with B
  • Octal – ends with Q
  • Decimal – ends with D or none
Intterrupt
Intterrupt                     sys/num           address
Counter/timer (8253)  8                      20-23               high maskable
Keyboard                    9                      24-27               |
Extra                           a                      28-2b               |
Serial port1                  b                      2c-2f                |
Serial port2                  c                      30-33               |
Hard disk                    d                      34-37               |
Floppy disk                 e                      37-3b               |
Printer                         f                       3c-3f                low maskable
-system interrupt: техникийн (гар, дэлгэц г.м), программын (BIOS 10-1F),DOS 20-3F
-users interrupt: none definition (60-6f)
void clrscr()
{
     asm{
            mov ah,6
            mov al,0
            mov bh,70h
            mov bl,0
            mov cx,0
            mov dx,184fh
            int 10h
     }
}

void print(char *msg)
{
    asm{
            mov ah,9
            mov dx,msg
            int 21h
    }
}
void gotoxy(int x,int y)
{
    asm{
            mov bh,0
            mov dx,y
            mov ax,x
            mov dh,al
            mov ax,200h
            int 10h
    }
}
Гартай ажиллах
char advencedKeyFlag()
{
 char a=0;
 asm{
                        mov ah,2
                        //get keyboard flag address 0417h
                        int 16h //bios
                        //return al
                        mov a,al
 }
 /*switch(a)
             {
                         case 2^7: insert
                         case 2^6: caps lock
                         case 2^5: numberic lock
                         case 2^4: scroll lock
                         case 2^3: alt/shift
                         case 2^2: ctrl/shift
                         case 2^1: left shift
                         case 2^0: rigth shift
             }
 */
 return a;
}
int getKey()
{
 //tovch darhiig huleene
 int a;
 asm{
            mov ah,0
            int 16h
            mov a,ax
            //return al,ASCII
            //       ah,SCAN
            // nemelt uuregtei tovch daragdsan bol al,0
 }
 return a;
}
int getKey1()
{
 //tovch darhiig huleehgui
 int a;
 asm{
            mov ah,1
            int 16h
            mov a,ax
            //return al,ASCII
            //       ah,SCAN
            // nemelt uuregtei tovch daragdsan bol al,0
 }
 return a;
}
void printl(char *msg,int len)
{
            asm{
            mov ah,40h//output display extended type
            mov bx,01 //out display type mode
            mov cx,len //max length
            mov dx,msg//disarea
            int 21h
            }
}
void insertl(char *area,int max)
{
            asm{
            mov ah,3fh
            mov bx,01h
            mov cx,max
            mov dx,area
            int 21h
            }
}
Desplay type
Monochrom – хар цагаан дэлгэц 4к дэлгэцийн буфертэй. Start Address: b0000h
            2к 25*80 тэмдэгт
            2к анивчилт, урвуу видео горим, анивчилт, нарийвчлал, доогуур зураас заах аттрибут зэрэг орно.
Colorr/Graphics monitor adapter – Start Address: b8000h
16к өнгөт дэлгэцийн санах ой, 8к тэмдэгтүүд, 8к тэмдэгтүүдийн аттрибутад хэрэглэгдэнэ.
80*25 өнгөт дэлгэцийн адаптер нь 4к хэмжээтэй 4хуудас хадгална.
40*25 баганатай форматтай ажиллах адаптер нь 2к хэмжээтэй 8хуудас хадгална.
Enhanced graphics adapter – 320*200, 640*200,640*350 гэсэн 3 горимтой. өнгөт дэлгэцийн горим нь текст ба график 2 горимтой.
Graphic mode
CGA:  1. 160pixel(picture elements) 100row. 1pixel –г 4bite-р 16 өнгө харуулна.
2. 320 pixel 200row. 1pixel –г 2bite-р харуулна.
3. 640 pixel 200row. 1pixel –г 1bite –р харуулна. Хар цагаан 16к санах ой.
Дэлгэций аттрибутыг 10h тасалдал ашиглан өөрчилж болно. Горит тогтоох, тэмдэгтийн аттрибут унших, дэлгэцэнд тэмдэгт мөр хэвлэх үйлдлүүд орно. DOS-21h тасалдал ашиглаж болно. Санах ойд тэмдэгтийн код тэгш хаяг дээр түүнд харгалзах код нь сондгой хаяг дээр байрлана.
Горим тогтоох үед курсор алга болдог тул 10h тасалдлын 2-р функцаар байрлуулдаг.
void graphic(char a)
{
            asm{
                        mov ah,0         //delgetsiin gorim togtooh
                        mov al,a
                        /*
                        switch(al)
                        {
                                    case 00:  40*25 har tsagaan text
                                    case 01:  40*25 16 ongotoi text
                                    case 02:  80*25 har tsagaan text
                                    case 03:  80*25 16 ongotoi text
                                    case 04:  320*200 4ongotoi graphic
                                    case 05:  320*200 har tsagaan graphic
                                    case 06:  640*200 har tsagaan graphic
                                    case 07:  80*25 har tsagaan standart
                                    case 0dh: 320*200 16 ongotei EGA graphic
                                    case 0eh: 640*200 16 ongotei EGA graphic
                                    case 0fh: 640*350 har tsagaan EGA graphic
                                    case 10h: 640*350 64 Ongotoi EGA graphic
                        }
                        */
                        int 10h //bios
            }
}
void putchar(char *a,int len)
{
            asm{
                        mov ah,13h
                        mov al,3
                        /*
                                    switch(al)
                                    {
                                                case 0:atribut hereglene kursor shiljuulehgui
                                                case 1:atribut hereglene kursor daraagiin bairlald shiljuulne
                                                case 2:ehleed temdegt daraa ni attribut kusor shiljuulehgui
                                                case 3:ehleed temdegt daraa ni attribut kusor shiljuulene
                                    }
                        */
                        mov bh,0//choise page number
                        lea bp,a//es:bp temdegtiin hayag
                        mov cx,len//repeat type
                        mov dx,0//start point
                        int 10h
            }//sain oilgoogui!
}
void putchar1(char cc)
{
            asm{
            mov ah,0ah//cursoriin bairlald temdegtiig attributgui hevlene
            mov al,cc //character
            mov bh,00//choise page#
            mov cx,1         //repeat
            int 10h//bios
            }
}
void putchar2(char cc)
{
            asm{
            mov ah,09h//cursoriin bairlald temdegtiig attributgui hevlene
            mov al,cc //character
            mov bh,00//choise page#
            mov bl,01000011b      //attribut iRGBiRGB
            mov cx,1         //repeat
            int 10h//bios
            }
}
long getcursor()
{
            long a;
            asm{
            mov ah,03
            mov bh,0//page#
            int 10h
            //return row dh
            //return col dl
            //return ch cursor start point
            //return cl cursor start point
            mov word ptr a,dx
            mov word ptr+2 a,cx
            }
            return a;
}
void setCursorSize(short int tp,short int tl)
{
            asm{
             mov ah,1 //engiin cursor '|' or '_' helbertei baidag
             mov ch,tp       //baga 5bited deed tal
             mov cl,tl         //baga 5bited dood tal
                                                                                    //if monochrom then max_size(0,13)
                                                                                    //else max_size(0,7)
             int 10h
            }
}
int readchar()
{
 int a;
 asm{
             mov ah,8 //cursoriin bairlaldah attribut temdegt unshina
             mov bh,0        //page#
             int 10h
             //return al character
             //return ah attribut
             mov a,ax
 }
 return a;
}
void setFontColor(char color,boolean t)
{
            asm{  //delgetsiin huree bolon ar fonii ongo bl registriin utgaar togtoono
            mov ah,0bh
            mov bh,t
            /*if bh then pale togtoono
                        else delgetsiin huree bolon ar fonii ongo tavina*/
            mov bl,color //0<=bl<=0fh
            int 10h
            }//gehdee ajilaagui
}

No comments:

Post a Comment