ca888会员登录系统功效调用Windows操作系统原理实

2019-03-23 11:03栏目:IT操作系统

  r.h.ah=2; /*子功用号*/

程序框图:

ca888会员登录 1

程序框图

; Attempt to detect SVGA  Systems

     mov cx,0000h

贰 、在显示器的制订区域内画框,在框内呈现字符串。(升高题)

内容:

1.荧屏出现打字演习菜单(格式自定,字体、字号、颜色)

2.菜单项目为4项:照打,覆盖打,排行,退出

0Fh         图形        单色      640* 350                         X                     X

 

制表符   ASCII码

目的:

编排英文打字演练软件,综合复习字符输入和出示,置光标、开窗口、颜色设置等显示器成效;驾驭分支程序中字符比较及计算的程序设计,循环及排序程序设计方法;加入中断调用的计时作用。通过上述综合性训练,进一步深化对汇编语言的领悟和增进程序设计技术。

ASCII码07),c汉兰达(ASCII码13)和LF(ASCII码10)字符;全数其余的“控制”字符就会显

   int 21h

  r.h.al=0;   

代码达成

```

data segment

menu  db 0ah,0dh,' Input number to chose your function'

db 0ah,0dh,'       1.Follow Typing'

db 0ah,0dh,'       2.Cover Typing'

; db 0ah,0dh,'       3.Ranking'

db 0ah,0dh,'       3.Exit'

db 0ah,0dh,'Please input your select:$'

mess1 db 0ah,0dh,' This is the Follow Typing page.'

db 0ah,0dh,'     Please input accordance with those word!$'

mess2 db 0ah,0dh,' This is the Cover Typing page.'

db 0ah,0dh,'     Please input accordance with those word!'

db 0ah,0dh,' (Yellow is right, Red is wrong!)$'

mess3 db 0ah,0dh,'This is third select$'

mess4 db 0ah,0dh,' Thank you for your use!$'

mess5 db 0ah,0dh,'Your right number is:$'

endline db 0ah,0dh,'$'

mess  db 255,?,255 dup(?)

text  db 'New strides have been taken in strengthening national defense and army building.$'

right db '0$'

sum  db '/80$'

num  db 0

data ends

code segment

assume cs:code,ds:data

start:

mov ax,data

mov ds,ax

let0:

mov ax,0

mov dx,offset menu ;显示菜单

mov ah,9

int 21h

mov ah,1 ;输入选用

int 21h

cmp al,'1' ;输入为1,跳转到照打界面

jz prog1

cmp al,'2' ;输入为2,跳转到覆盖打界面

jz prog2

cmp al,'3' ;输入为3,跳转到排名界面

jz prog3

jmp prog4 ;输入不为1或2或3,退出程序

prog1:

jmp real_prog1

prog2:

jmp real_prog2

prog3:

jmp real_prog3

prog4:

jmp real_prog4

real_prog1: ;照打界面

mov ax,0003h ;清屏

int 10h

mov dx,offset mess1 ;显示提醒音讯

mov ah,9

int 21h

mov dx,offset endline ;换行

int 21h

mov dx,offset endline ;换行

int 21h

mov dx,offset text ;展现小说

mov ah,9

int 21h

mov dx,offset endline ;换行

int 21h

mov dx,offset mess ;输入串

mov ah,10

int 21h

;输入达成,初叶开始展览巡回相比较

mov ax,0

mov di,0 ;存款和储蓄正确个数

mov cl,mess 1 ;输入的字母个数,即循环的次数

mov bx,2 ;第一个字符的单元地方

let1:

mov dl,text[bx-2]

cmp mess[bx],dl ;判断是不是输入正确

jz let2 ;输入正确 跳到let2

jmp out1 ;跳到集体出口 out1

let2: ;正确数 1

add ax,1

add di,1

out1:

dec cl ;循环次数-1

inc bx

cmp cl,0

jnz let1

jz out2

out2: ;检查得了,输出结果

mov dx,offset mess5

mov ah,9

int 21h

;输出正确个数

mov ax,di

mov bl,10

div bl

add ah,'0'

mov right,ah

add al,'0'

mov dl,al

mov ah,2

int 21h

mov dl,right

mov ah,2

int 21h

mov right,0 ;重置right为0

mov di,0

mov dx,offset sum

mov ah,9

int 21h

jmp let0 ;再次来到选取菜单

real_prog2: ;覆盖打界面

mov dx,offset mess2

mov ah,9

int 21h

mov ax,0003h ;清屏

int 10h

;置展现光标

mov ah,2

mov dh,4

mov dl,0

mov bh,0

int 10h

;显示串

mov dx,offset mess2

mov ah,9

int 21h

mov dx,offset endline ;换行

int 21h

mov dx,offset endline ;换行

int 21h

mov dx,offset text

mov ah,9

int 21h

;置输入光标

mov ah,2

mov dh,9

mov dl,0

int 10h

mov si,80 ;循环次数

mov bx,0 ;第一个字符的单元地方

mov di,0 ;正确个数

mov num,0 ;展现列的岗位

prog2_let1:

;输入字符

mov ah,1

int 21h

mov dl,text[bx]

cmp al,0DH ;判断是还是不是输入回车

jz prog2_out2

cmp al,dl ;判断是或不是输入正确

jz prog2_let2 ;输入正确 跳到let2

cmp al,dl

jnz prog2_let3 ;输入错误,跳到let3

jmp prog2_out1 ;跳到集体出口out1

prog2_let2:

add di,1 ;正确数 1

;输入正确,改变为香艳

mov ah,06h

mov al,0

mov bh,0eh

mov ch,8

mov cl,num

mov dh,9

mov dl,num

int 10h

;置显示光标

mov ah,2

mov dh,9

mov dl,num

mov bh,0

int 10h

mov dl,text[bx]

mov ah,2

int 21h

jmp prog2_out1 ;跳到集体出口out1

prog2_let3:

;输入错误,响铃

mov ah,2

mov dl,7

int 21h

;输入错误,改变为革命

mov ah,06h

mov al,0

mov bh,04h

mov ch,8

mov cl,num

mov dh,9

mov dl,num

int 10h

;置展现光标

mov ah,2

mov dh,9

mov dl,num

mov bh,0

int 10h

mov dl,text[bx]

mov ah,2

int 21h

jmp prog2_out1 ;跳到国有出口out1

prog2_out1:

dec si ;循环次数-1

inc bx

inc num

cmp si,0

jnz jump_prog2_let1 ;si≠0,继续循环

jz prog2_out2

jump_prog2_let1:

jmp prog2_let1

prog2_out2: ;循环截至,输出结果

mov dx,offset mess5

mov ah,9

int 21h

;输出正确个数

mov ax,di

mov bl,10

div bl

add ah,'0'

mov right,ah

;add al,74

add al,'0'

mov dl,al

mov ah,2

int 21h

mov dl,right

mov ah,2

int 21h

mov right,0 ;重置正确个数为0

mov di,0

mov dx,offset sum

mov ah,9

int 21h

jmp let0

real_prog3: ;排行界面

mov dx,offset mess3

mov ah,9

int 21h

jmp let0 ;重临选取菜单

real_prog4: ;退出

mov dx,offset mess4

mov ah,9

int 21h

mov ah,4ch

int 21h

code ends

end start

```

xor ah,ah ; Clear byte

班级:  计算机14-1  姓名:  许恺    学号:  2014011329日期: 2016.4.29          

r.h.bh=0;

 

   call output

{ union REGS r;

      int 29h

要求:

一 、在显示屏的内定区域内显示字符串。(必做题)

db UNKNOWN ADAPTER OR UNKNOWN_MONITOR

l3:  mov bx,000ah

{ union REGS r;

ror al , cl

   mov ah,0

}

HGA               图形

   output proc near

r.h.ch=0; /*左上角坐标*/

列表5.1

   mov dl,0dh

  r.h.ah=6; /*子功用号*/

表5.2点数的形式0Eh的分辨率为640*200,即宽6四十二个象素,深200个扫描行(象素)。

 s1 db 'please input an integer between 0 to 8:$'

┛ 217

or word ptr [bx] ,HEADLAND OR SVGA

一 、编写程序

定位子程序:

          ;For use with Microsoft C/C

   mov ah,01h

 }

void savewin(lr,lc,rr,rc)

   mov bx,ax

一 、实验目标

VSYNC :

   sub al,30h

  int86(0x10,&r,&r); /*系统功用调用*/

且,效用0Eh不能够适用于全体BIOS ROM的有着页。全体测试的非IBM的ROM中,该功

     ret

  r.h.dh=24; /*右下角坐标*/

jmp short not_circus_chip

1.从键盘输入3个不超越8的个位数,总计该数的阶乘,并以十进制制式输出。

r.h.bl=attr

13h         图形        256          320*200                           X                   X

data segment

┓ 191

    的数目。

其实感觉堆栈段不用编写,因为事先不写也行,开首已经写好了,后来知道要有提示语句,又加输出字符串时就出错了,在压栈的时候出现了死循环,是用dx输出字符串的时候出了难题,最后是重新把dx赋0才消除,此次更是清楚了储藏室的行使,以往会用的尤其的随手和高频。

清屏子程序:

适配卡是做不到那一个的。类似地,差别的开发商用来辨别各种高级VGA适配卡的章程是

   lea dx,s2

┏ 218

    最终,那个经过就探测到了七个录制硬件系统并分别哪些是移动的,哪个是非活动

stack segment stack

void writech(int x , int y, char ch ,int attr)

/* Function: border() */

     push dx

  r.h.bh=7; /*7代表浅米灰*/

cmp al , 1

   int 21h

  locate(x ,y);

    page 55,132

(5)输出格式要入眼,要有适用的唤起。

② 、实验内容

和EGA 用于计算机的PC种类,MCGA和VGA则用来Personal System/2类别。HGA 的

   output endp

r.h.dl=y;

cmp ax,MDA ; Is secondary system MDA?

stack ends

  r.h.cl=0;

; what iS the primary System?

(3)以十进制方式出口结果的功用用子程序达成,子程序的名字为:output;

┃ 179

; Wasn't AHEAD. Test for ATI

(2)总结阶乘的效用用子程序完毕,子程序的名字为:fac;

  r.h.bh=0;

只有超越7的值才能积存在前景之中,除非象刚才描述的那样触发了闪烁位。

 main proc far

③ 、在显示屏上钦点区域内画框并以动画格局显得字符串。(选做题)

                int r,c;

   int 21h

1、纯熟操作系统的系统机能调用。

    位数=log(16)/log(2)=1.20412/0.301003=4位

   mov dx,0

int86(0x10,&r,&r);

}

     cmp ax,0

③ 、明白运用10H号功能调用(BIOS的展现I/O功效调用)来落到实处对荧屏的操作与操纵。

cmp al , 050h

   mov ax,data

━ 196

·····000            铁锈色前景(符合规律)

(1)程序清单:

┗ 192

db UNKNOWN_ADAPTER OR UNKNOWN_MONITOR

   mov al,dh

贰 、驾驭用C语言实现系统作用调用的章程和步子。

jmp short Herc_exit

   mov ax,bx

  r.h.dl=79;

    直到钦命数量的秒数过去。

     inc cl

r.x.cx=1;

void cls(void);

     mov cl,al

  r.h.dh=x; /*定位点坐标*/

          clearwin(5,5,12,40);

   mov ah,09h

{ union REGS r;

          void gotoxy(r,c)

     dec cl

  r.h.al=ch;

    直接的单色监视器,能显得高分辨率文本和字符水平的图片。MDA能使得那些监视

② 、编制程序体会

}

pop cx

   mov dl,0ah

int86(0x10,&r,&r);

(即CGA的MDPRADO地址)。对于HGA或MDA,执行同一的操作,但将结果输送到端口

 s2 db 'its factorial=$'

显示屏画框能够用制表符来画。其关键方法是时时刻刻调用writech函数,在钦定区域周围展现制表符,从而勾勒出一个窗口的大致。

CRTC_detect proc

     add dx,0030h

void cls(void)

mov si,offset SecondarySystem

   call fac

void locate(int x, int y)

动。它们能显得CGA图形,但不是色彩缤纷的。当中一些监视器能借助阴影来表示颜色的差

 main endp

  r.h.ah=9;

regs.h.dh=r;

   mov ds,ax

在钦赐地方写参数:

push cx

   mov ah,02h

cet

     jmp l3

      mov al,es:65h     ; get last value sent to mode control

     mov ah,02h

        /* Testpage.C

   fac endp

out dx,al

   mov dh,al

jne not_paradise

   lea dx,s1

          sleep(5);

l1:  mul cx

    近日,大家已经明白了荧屏展现的工作办法,那么就足以试一试简单的效果,来探视

(2)运维结果(截图):

jne is_HGC

(1)输入数据在主程序中达成;

; Start of simplified directives

start:

    为用来界定显示器的数据能够比这几个多少显明地少占空间,所以有的显得适配卡能说了算

     int 21h

cld

     mov dx,0000h

mov Si , Offset GENOA_BIOS_Sig

   mov ah,02h

          putwin()      把数据放进有些窗口

     loop l2

repe cmpsb

code segment

jz no_secondary

   int 21h

not_ati_bios:

l2:  pop dx

101页

(4)各子程序通过寄存器传递参数;

SecondarySystem dw 0000 ; Secondary video system

end start

0101         5              品红色

   mov ah,09h

and ax , ADAPTER_SYSTEM_MASK ; What adapter?

 assume cs:code,ds:data,ss:stack

            Setpage(1,TRUE);

data ends

and al,080h ; Save VSYNC bit

 dw 30 dup(?)

              Listing 5.5 of DOS Programmer's Reference*/

   int 21h

jne no_vga_present

     div bx

#define VIDEO 0x10

   int 21h

and ax , ADAPTER_SYSTEM_MASK

     jbe l2

          #define VIDEO 0x10

     loop l1

push ds ;save caller's DS

code ends

   位数=log(颜色数)/log(2)

 ca888会员登录 2

    VGA                   equ 005h

     ret

    在这一节,读者能够组织一些不难的窗口功效,以便看看BIOS和DOS功效的行使

   fac proc near

那个大概用来体现支持音讯的窗口。因为它从不利用比BIOS效率更低的事物,所以它与

   mov ah,4ch

jmp test_vesa

 

no_vga_present :

je MDA_Primary

                regs.h.dh=25;

    读者可能会问何故一级VGA(SVGA)没有当做PC机上的图片标准而被提到。那

; Test for VESA BIOS

除总内部存款和储蓄器数的结果。再结合每行八十个文本字符,那么正是2*80*25,等于4000字节,或

          void gotoxy(int i,int j);

82页

UNKNOWN_CHIP equ 000h SHL 10

      EGA和VGA卡的缓冲区大小会变卦,是因为它们能在64K到1M的内存中占有任

 and word ptp [ bx] ,NOT ADAPTER_SYSTEM_MASK

not everex_bios:

                                     显示卡

常这是规定二个适配卡是VGA或是SVGA的正式),但达到此目标却是以独家不一致的、

or PrimarySystem , MDA OR MDA_MONITOR

  表5.2录制格局

仅在那些内部存款和储蓄器地点上改变了多少,而且执行了不利安装录制方式所必须的别的操作。

    统,但不要任何系列都与该办法兼容。借助此类调用,用户能够动用DOS级不可能

union REGS regs;

    MONITOR_MASK             equ 007h SHL 3

    口内的办事。

    BIOS服务对于不直接存取摄像内部存款和储蓄器的重中之重编制程序,它们经常是被挑选的功用。它们不

xlat

0040h:0065h职位上的值,0DFh的字节使闪烁位变明晰,并将结果输出到端口03D8h

                  int86(VIDEO,®s,®s);

    {

/* Function:setpage()*/

detect_SVGA: call SVGA_detect

                int86(VIDEO,&regs,&regs);

和cls()函数)。注意cls()只是clearwin(),它在荧屏的左上角和右下角设置数值,以对应

A000h               变化                变化

and dx,0FFF0h ; Get board number

      差别。使用那种情势的程序平日与被观看的PC包容的具有系统不兼容。该情势

mov ah,al   ; Save what we read

B800h                     32K                     8

二进制      十进制        颜色

ATI18800REV1 equ 001h SHL 10

jae vid_exit

cmp bx,'7'

    范围。依照一些用来分析BIOS和DOS成效选拔的简练的窗口突显效果,可以检查显示屏

                regs.h.dl=80;

上这么举行的)。

jmp short test_vesa_isle

      screen.c函数对于全数荧屏展现是大局的(见列表5.4)。它们在3个显示器宽度的基本功

 

    UNKNOWN_BIOS             equ 000h SHL 6

jne svga_exit

Hercules_detect proc

    与MDA兼容的(单色)

cmp al,01Ah ; Successful call?

test_trident:

            Listing 5.6 of DOS programmer'S Reference*/

and ax ,ADAPTER_SYSTEM MASK

    PC机显示系统原本是以OPPO 6845 阴极射线管理控制制器(C奥迪Q3TC)芯片为根基的。

and word ptr [bX] ,NOT ADAPTER_SYSTEM_MASK

0110         6            棕色

push dx ; Save registers

jne test_vesa

          savewin()     将窗口当前多太守存起来

mov bh,al ; Save it

cli ; Disable interrupts

mov dx,003BAh ; Get status port

; May need to swap primany/secondary systems

          /*    Wait 5 seconds and then scroll the screen again.

mov bx,offset adapter_table ; Get lookup table

inc dx

mov cx , 4

mov di,00031h ; ATI signature at C000:0031

83页

jmp short vid_exit

·000····           黑背景(正常)

gotoxy(rr,lc); wch(LOWERLEFT, 7);

and ax , MONITOR_MASK

显示函数去改变这些职位(见列表5.5)。

    VGA COLOR              equ 005h SHL 3

; on entry, DX is the alleged CRTC port

0100         4            红色

      PC机突显系统已从简单的初始方式衍生和变化成如下所示的后天应用的两样的标准:

96页

      列表5.6

mov cx , 2

    /* Prototypes*/

            }

     添加显示器——页控制的一条路径是改变路径,使之包涵多个当下荧屏页号以及安装

PUSh di

not_cti82c452 :

cmp al,021h ; Version  B?

jmp short swap_systems

同一的话,那么他的显示器就会是徒有其表的。

          /*   Save the data in the rectangle(5,5)  tO (12,40), and

pop ax

    操作。

    . 假若妥贴地使用了标准调用,这么些调用还是能使程序与UNIX或XENIX系统合作。

B800h                    64K                     1

cmp al,020h ; Version A?

          void putwin( int lr, int lc, int rr,int rc);

                              表5.1来得适配卡的内部存款和储蓄器配置

and word ptr [bx] , NOT ADAPTER_SYSTEM_MASK

in  al , dx

}

db VGA OR VGA_COLOR

/*Function:pgprint()*/

          printf("DOS Programmer's Reference            ");

0Ah         图形        4           640* 200                                                         X

mov al,01Fh , Get iD register

pop es

    表5.4单色字符属性

cmp ax,UNKNOWN_ADAPTER

db EGA OR MDA_MONITOR

    UNKNOWN MONITOR       equ 000h shl 3

    ; video_id.asm

xlat

          void border( int lr,int lc, int rr,int rc);

mov SecondarySystem,0

Call MDA_detect ; and MDA

;-----Program Code - - - - -

和pgprint()函数(见列表5.8)。

cmp al , '2'

          {

je CGA_primary

cmp al , 000h

                regs.h.ch=0;

           void pgprint(str)

jne test_vesa

识别(如果是VGA适配卡)潜在的SuperVGA适配卡。

wch(screen[i][j].ch, screen[i][j].att);

90页

                  regs.h.al=*str;

指令出字符应该怎么呈现。表5.3来得单色文本方式的字符属性位的意义;表5.4则展现

1110           14           黄色

or al , 055h

mov dx,046E8h ; Put chip in setup mode

#define HORIZLINE 205

; Although enhanced video BIOS call succeeded, no VGA was found

104页

                        含义

or word ptr [bx] ,SVGA OR AHEAD

      ·探测光笔信号

的多少转载而来的。 EGA和VGA卡也使程序员能够钦定别的的用户—限定字符设置

mov ax , PrimarySystem

not cti82c451:

db MDA OR MDA_MONITOR

jmp short test_vesa

                  5.1骨干的字符设备

    AHEAD                    equ 001h SHL 6

db (16 - 13) dup (0)

XOP CX , CX

clarify_MDA :

ati_1 :

; Routine tO detect SVGA cards

富含进函数变量之中,那么就足以将函数如gotoxy()用于尚未呈现的页。然后能够组织一

cmp ax,VGA , Did we detect a VGA?

的(固然为啥应该中断阅读并非那么鲜明,但经验却显得它确实是在很多CGA卡

regs.h.al=n;

nop

mov bx,offset SecondarySystem

jmp Short Herc_exit

              /* Sleep.C

jne no_MDA

void gotoxy(r,c)

{

jne svga_exit

push bx

jmp Short test_vesa

Cmp ax , 0004Fh

0000         0            黑色

个一体化的扫视)。在每行的末梢,电子束必须从显示器的右端移到左端,那段日子称作水平回

            setpage(0,FALSE);

服务。

Out dx,al ; Write it out

                  图形

    整个显示屏。

jne not_cirrus_bios

#define  LOWERRIGHT 188

      MDA                                     EGA

器,HGA或EGA卡能够效仿单色适配卡。

{

mov dx,003C4h

repe cmpsb

mov di,00025h ; Signature is at C000:0025

jne test_vesa_isle

mov al,020h ; Get enable value

#define BOOL int

; Try Tseng

 

EGA               单色

int86(VIDEO,®s,®s);

        位

85页

    /* Testscn.c

no_ega_present :

mov ax,PrimarySystem ;How about the primary?

mov ax , PrimarySystem

repe cmpsb

cmp ax , MCGA

HGCPLUS equ 002h SHL 10

                        ret

99页

都检查Ctrl-C,所以它比较快。

1·······         闪烁字符

CIRRUS_610_620 equ 002h SHL 10

                  文本

指令H安德拉I是或不是留存;3位则影响有关VCRUISERI的同一的新闻。当回扫间隔开分离头时,相应的位就

cmp al , 0AAh

{

    间接将次第书写到展示内部存款和储蓄器中去的程序员应该小心一些类型的呈现适配卡的HLANDI

mov si , OffSet PARADISE_BIOS_Sig

jne not_genoa_bios

and al,0F0h ; Check version

          Cls();

1011           11           淡青色

并不一一列举,以下所列只是内部的一有的:

regS.h.Ch=0;

能添加页控制,能够建立在里面使用了窗口和页功用的顺序以保留呈现内容,而只必要变

Out dx,al

该函数(见列表5.6)选取与Microsoft c/c++同样的途径。在前进推动此前,它要等待,

vid_exit:

    因为Int 29h没有公开,所以在今后的DOS版本中得以废除它,但那不太可能,因为

        attribute.*/

mov al,006h , Extension control reg

out dx,al

#include<stdio.h>

                regs.h.dl=C;

regs.h.ah=0x05;

jae vid_exit

je found_8800BR

 

ret

xor cx,cx ; Loop a while

pop es

    就算已高达共识认为:运转杰出的DOS应用程序应该利用BIOS,只怕极端使用DOS

                *ch=regs.h.al;

SVGA_detect proc

          void cls(void);

88页

cmp ax , MDA_MONITOR

B000h               变化                变化

mov PrimarySystem,0

int 10h

        int lr,lc,rr,rc;

 

假诺地址正确,那么就试着向光标地方低寄存器写入值。在短短的耽误后,若是数值能被

    增强型RAV4GB监视器能提供彩色文本和图表,并且输出结果比平日的讴歌ZDXGB监视器产

                regs.h.ah=0x08;

or word ptr [bx] ,SVGA OR PARADISE

    列表5.8

BOOL clrflg;

或XENIX一起工作,有程序代码(它在各类操作系统之下可不加修改地拓展成功的编

jne not_headland

    在程序的最低层,荧屏字符函数使用户能看看单个的显示器地方依旧采取BIOS显示器

push bx

0001         1              蓝色

mov ax , 06F07h

PARADISE_BIOS_Sig db"VGA="

ATI18800REV2 equ 002h SHL 10

}

    CGA_MONITOR         equ 002h SHL 3

not_cirrus_chip:

les di,es:[di] , Dereference it

cmp ax , MDA

xor al,al ; Clear register

mov al,00Fh , Get index of enable register

 

    己的方法来支付高档VGA(Super VGA)。种种适配卡都扶助二个800*600录制格局(通

db EGA OR EGA_MONITOR

mov cl,4

    窗口(见列表5.2)。能够向显示器书写更加多的数据,然后将原来的窗口数量重临并卷起来。

or SecondarySystem,ax ; Set flags

版权声明:本文由ca888发布于IT操作系统,转载请注明出处:ca888会员登录系统功效调用Windows操作系统原理实