实验一8086汇编语言的编程实践

时间:2024.4.27

实验一 8086汇编语言的编程实践

【实验目的】

1.掌握8086汇编语言编程以及调试的过程。

2. 学会使用masm.exe、debug.exe、td.exe等软件。

【实验内容】

1.、编写计算费波那契数列的前20项值,显示在屏幕上。

DATA    SEGMENT

DATA1   DW      0,1,18  DUP(?)

DATA    ENDS

CODE    SEGMENT

ASSUME  CS:CODE,DS:DATA

START:  MOV     AX,DATA

        MOV     DS,AX

        LEA     BX,DATA1

        MOV     CL,18

NEXT:   MOV     AX,[BX]

        ADD     AX,[BX+2]

        MOV     [BX+4],AX

        INC     BX

        INC     BX

        DEC     CL

        JNZ     NEXT

        MOV     AH,4CH

INT     21H

CODE    ENDS

END     START

2、编写将键盘输入的ASCII码转换为二进制数的程序。

DATA    SEGMENT

BUFFER  DB 100 DUP(?)

DATA    ENDS

CODE    SEGMENT

ASSUME  CS:CODE,DE:DATA

START:  MOV AX,DATA

MOV DS,AX

LEA SI,BUFFER

NEXT:   MOV AH,1

INT 21H

AND AL,7FH

CMP AL,’0’

JL STO

CMP AL,’9’

JG ASCB2

ASCB1:  CMP AL,’A’

JL STO

CMP AL,’F’

JG STO

SUB AL,37H

ASCB2:   MOV [SL],AL

INC SI

STO:     CMP AL,’$’

JNE NEXT

HLT

CODE     ENDS

END      START

【实验步骤】

1.在ms.exe中编辑源程序

2.在ms中调试程序

3.在td.exe中观察程序执行过程中各个寄存器的变化情况。

【实验结果】

1.计算费波那契数列的前20项值的实验结果:

在td.exe中观察程序执行过程中各个寄存器的变化情况

2编写将键盘输入的ASCII码转换为二进制数的程序。

在td.exe中观察程序执行过程中各个寄存器的变化情况

【实验心得和体会】

实践是检验真理的唯一标准!

通过一节课的实验,我发现一本书的知识如果通过一步一步的实验就能真正更快的掌握,虽然一节课只有短短的两个小时但是却比理论课收获的要多的多。虽然实验的代码自己编的时候出现很多问题但是通过最终的努力成功还是一件十分有意义的事情!以后一定要多多实践,这样才能学的更快更好!


第二篇:8086汇编语言程序设计实验指导书x


8086汇编语言程序设计

计算机科学与技术学院计算机科学与技术系

二〇一一年九月

-1-

目 录

第一部分 实验方法 ............................................................................. - 1 -

1.1 实验目的与要求 ...................................................................... - 1 -

1.2 实验方法 .................................................................................. - 2 - 第二部分 实验内容 ............................................................................. - 7 - 实验1 简单汇编语言程序设计 .................................................. - 7 - 实验2 分支循环及程序设计 ...................................................... - 8 - 实验3 子程序程序设计 .............................................................. - 9 - 实验4 综合程序设计 ................................................................ - 10 - 附 录 .................................................................................................. - 11 - 附录1 常用DOS命令 ................................................................ - 11 - 附录2 DEBUG主要命令 ............................................................. - 13 - 附录3 汇编程序出错信息 .......................................................... - 16 - 附录4 常用字符ASCII码值 ...................................................... - 20 - 附录5 8088/8086指令系统 ...................................................... - 21 - 附录6 IBM PC/AT中断功能表 ................................................ - 25 - 附录7 常用DOS功能调用(INT 21H) .................................. - 27 - 附录8 BIOS功能调用 ................................................................. - 30 -

-2-

第一部分 实验方法

1.1 实验目的与要求

一、实验目的

学习汇编语言程序设计的基本方法和技能,进一步加深对8086汇编语言程序设计的理解,熟练掌握用汇编语言设计、编写、调试和运行程序的方法,为后继课程——接口技术打下坚实的程序设计基础。

二、实验要求

1. 上机前要做好充分的准备,包括程序框图、源程序清单、调试步骤、测试方法、对运行结果的分析等。

2. 上机时要遵守实验室的规章制度,爱护实验设备。要熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)的使用方法及实验仪器。在程序的调试过程中,有意识地学习及掌握DEBUG程序的各种操作命令,以便掌握程序的调试方法及技巧。

为了更好地进行上机管理,要求用硬盘储存程序,并建立和使用子目录,以避免文件被别人删除。有关目录及文件操作的DOS命令见附录1。此外,为了便于统一管理硬盘中的文件,要求实验者按以下形式命名实验文件: 字母学号_序号.ASM

其中,字母取a~z中的一个字母,按实验项目序号从a至z排列,序号是指每次实验中所编写的程序的序号。例如:学号为850431学生的第二次实验中的第1个程序所对应的文件名应为b850431_1.ASM。

3.每个实验完成后,应写出实验报告。实验报告的要求如下:

① 设计说明:用来说明设计的内容。它包括:程序名、功能、原理及算法说明、程序及数据结构、主要符号名的说明等。

② 调试说明:便于学生总结经验提高编程及调试能力。它包括:调试情况,如上机时遇到的问题及解决办法,观察到的现象及其分析,对程序设计技巧的总结及分析等;程序的输出结果及对结果的分析;实验的心得体会等。

-- 1 --

③ 程序框图。

④ 程序清单。

1.2 实验方法

一、用编辑程序建立ASM文件

用文字处理软件编辑源程序。常用编辑软件有:EDIT.EXE、记事本、WORD等。无论采用何种编辑工具,生成的文件必须是纯文本文件,且文件扩展名为.ASM。

下列程序完成两个字节数相加,并将和存于SUM变量中。用编辑软件建立以ABC.ASM为文件名的源程序文件。

DATA SEGMENT

BUF DB 47H,6AH SUM DB ? ;数据定义

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

MOV AL,BUF

ADD AL,BUF+1

MOV SUM,AL

MOV AH,4CH

INT 21H

CODE ENDS

END START ;返回DOS ;段寄存器定义 ;数据处理部分从此开始,直到返回DOS

二、用汇编程序汇编源文件,生成目标文件(.OBJ)

当源程序建立以后,用汇编程序MASM对ABC.ASM源程序文件进行汇编,操作步骤如下:(以下划线部分为用户键盘输入,“↙”代表回车,未划线部分为屏幕显示,小字部分为说明)。

C:\MASM> MASM ABC.ASM↙

-- 2 --

Microsoft (R) Macro Assembler Version 5.00

Copyright (C) Microsoft Crop 1981-1985,1987,All rights reserved

Object filename [ABC.OBJ] 输入目标文件名,若采用括号[ ]中的名字,按↙

Source listing[NUL.LST] 若需要列表文件,输入文件名,按↙;如果不需要,直接按↙

Cross-reference[NUL.CRF] 若需要交叉索引文件,输入文件名;如不需要,直接按↙

49758 + 451602 Bytes symbol space free

0 Warning Errors

0 Severe Errors

回答上述问题后,汇编程序就对源程序进行汇编。若汇编中发现源程序有语法错误,则列出错误语句所在行、错误代码及错误性质说明。错误分为:警告错误(Warning Errors)和严重错误(Severe Errors)两种。警告错误指汇编程序认为的一般性错误;严重错误指汇编程序认为无法进行正确汇编的错误,给出其错误个数,错误性质。这时,就要对错误进行分析,找出问题和原因,然后再调用编辑程序对源程序进行修改。修改后重新汇编,直到无错误为止。

除了用上述方法分步回答问题外,还可以用命令行的形式按顺序对相应提示予以回答,其格式是:

MASM 源文件名,目标文件名,列表文件名,交叉引用文件名;

其中文件名都不必给出扩展名,汇编程序会按照缺省情况使用或产生。若只想对部分提示给出回答,则在相应位置用逗号隔开,若不想对剩余部分作答,则用分号结束。

例如以下命令经汇编后在当前目录下产生ABC.OBJ文件,不产生LST文件和CRF文件。

C:\MASM> MASM ABC;↙

三、用连接程序LINK目标文件,生成执行文件EXE

C:\MASM> LINK ABC↙

Microsoft (R) 8086 Object Linker Version 5.00

Copyright (C) Microsoft Crop 1981-1985,1987,All rights reserved

Run File [ABC.EXE] 输入可执行文件名,若采用括号[ ]中的名字,按↙

List File[NUL.MAP] 若需要映象文件,输入文件名,按↙;如果不需要,按↙

-- 3 --

Libraries[NUL.LIB] 若需要库文件,输入文件名,按↙;如果不需要库文件,按↙ Warning: no stack segment

上述给出的警告信息,表示用户程序没有定义堆栈段。该警告不影响可执行程序的生成和正常运行,因为运行时会自动使用系统提供的缺省堆栈。

回答上述问题后,连接程序开始连接,若连接过程中有错,则显示错误信息。此时,按错误提示,修改源程序,然后,回到第二步。直至汇编无错误,连接无错误(错误No Stack Segment 除外),在当前目录下产生可执行文件(.EXE),进入第四步。

同样也可以用命令行的形式按顺序对相应提示予以回答,其格式是: LINK 目标文件名,可执行文件名,内存映象文件名,库文件名;

其中不必给出扩展名,连接程序会按照缺省情况使用。若只想对部分提示给出回答,则在相应位置用逗号隔开,若不想对剩余部分作答,则用分号结束。

例如以下命令行对ABC.OBJ文件连接后在当前目录下产生ABC.EXE文件,其余文件均不需要。

C:\MASM> LINK ABC;↙

从6.0版以后,Microsoft公司把MASM和LINK的功能由一个ML.EXE程序完成,只需一个命令就可以把源程序汇编并连接生成.EXE文件。而不再需要分两步操作。

ML.EXE常用格式为:

ML [/F1][/Fm][/Fr][/c] 源文件

其中,源文件名的扩展名(.asm)不能省,[]中的F必须大写,l,m,r,c必须小写,各可选项含义如下:

/F1:产生.lst列表文件,缺省时不产生。

/Fm:产生.map内存映象文件,缺省时不产生。

/Fr:产生.sbr交叉参考文件,缺省时不产生。

/c:只产生,obj目标文件,不产生.exe可执行文件。缺省时只产生.exe文件。

例:ML /Fl ABC.ASM

以上命令会对已存在的ABC.ASM文件汇编且连接,并在当前目录下生成一个列表文件ABC.LST和一个可执行文件ABC.EXE.

四、运行程序

设连接生成的执行文件为ABC.EXE,运行程序只需在DOS提示符下键入文件名即可,如:

-- 4 --

C:\MASM>ABC↙

若程序能够运行但不能得到预期结果,则需要静态或动态查错。静态查错即检查源程序,并对源程序进行修改,然后再汇编、连接、运行。如果静态检查无法发现错误,则需动态查错。

五、程序调试及结果查看

这里使用DEBUG程序进行调试,DEBUG是一种使用广泛的强有力的汇编语言程序或二进制文件的调试工具。

设ABC.ASM经汇编及连接后,产生ABC.EXE文件,对它的调试操作如下:

1.把程序装入内存,并显示程序清单

C:\MASM>DEBUG ABC.EXE↙

-

此时,DEBUG已将执行程序装入内存,可键入DEBUG的有关命令调试程序。 -U↙ 用反汇编命令U列出程序清单

13E3:0000 B8E213 MOV AX,13E2

13E3:0003 8ED8 MOV DS,AX

13E3:0005 A00000 MOV AL,[0000]

13E3:0008 02060100 ADD AL,[0001]

13E3:000C A20200 MOV [0002],AL

13E3:000F B44C MOV AH,4CH

13E3:0011 CD21 INT 21

??

2.查看数据段内容或查看寄存器内容

-D DS:0000↙ 查看数据段内容

13E2:0000 47 6A 00 00 00 00 00 00-00 00 00 00 00 00 00 00 Gj..............

??

可见0000、0001单元内容为数据段定义的内容,分别为47H、6AH。DEBUG状态下,缺省数制为十六进制数。

-R↙ 查看寄存器内容

AX=13E2 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=13D2 ES=13D2 SS=13E2 CS=13E3 IP=0003 NV UP EI PL NZ NA PO NC 若查看指定寄存器内容,在R命令后跟上寄存器名,例:

-R AX↙ 查看寄存器AX的内容

-- 5 --

AX 13E2 :↙ 若需修改AX的值,则键入新值;若无需更改,按回车。

3.连续运行程序,查看结果

-G ↙ 或 -G =0 0013 ↙ 运行程序,0为运行起始地址,0013为断点地址

-D DS:0000↙ 查看内存结果

13E2:0000 47 6A B1 00 00 00 00 00 00 00 00 00 00 00 00 00 Gj..............

??

可见0002单元中内容已变为0000和0001两单元内容之和。

4.如果连续得不到正确结果,需分步跟踪运行

-T=0000↙ 0000这所需要运行指令的地址

AX=13E2 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=13D2 ES=13D2 SS=13E2 CS=13E3 IP=0003 NV UP EI PL NZ NA PO NC 13E3:0003 8ED8 MOV DS,AX

显示单步执行后寄存器和标志状态之后,停在下一条指令开始处。 -T↙ 顺序运行下一条指令

??

5.退出DEBUG

-Q↙

-- 6 --

第二部分 实验内容

实验1 简单汇编语言程序设计

一、实验目的与要求

1.熟悉汇编语言运行、调试环境及方法。

2.掌握简单汇编语言程序的设计方法。

3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。

二、实验内容

根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。

1. 若X、Y、R、W是存放8位带符号数字节单元的地址,Z是16位字单元的地址。试编写汇编程序,完成Z?((W?X)?5?Y)?(R?2)错误!未找到引用源。 。

2.试编写一个程序,测试某数是否是奇数。如该数是奇数,则把DL的第0位置1,否则将该位置0。

三、实验报告要求

1.程序算法流程图。

2.源程序清单。

3.程序运行结果。

4.调试过程中遇到的问题和解决的方法。

-- 7 --

实验2 分支及循环程序设计

一、实验目的与要求

1.熟悉汇编语言运行、调试环境及方法。

2.掌握分支程序和循环程序的设计方法。

3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。

二、实验内容

根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。

1.键入一数,判断该数是否在3< X < 15范围内,是输出标志0,不是输出-1。

2.试编程统计数据区中正数、零和负数的个数。

3. 编程求无符号数字节序列中最大值和最小值。

4.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。

6.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。参考加密方法是:每个数乘以2。(说明:本题的加密方法,同学们可以自己拟定)

三、实验报告要求

1.程序算法流程图。

2.源程序清单。

3.程序运行结果。

4.调试过程中遇到的问题和解决的方法。

-- 8 --

实验3 子程序程序设计

一、实验目的与要求

1.熟悉汇编语言运行、调试环境及方法。

2.掌握子程序的设计方法。

3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。

二、实验内容

根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。

1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。

2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。请编程完成此功能。数据缓冲区参考数据定义如下:

EXAMSCORE DB 01

;学号 DB 89,76,54,77,99 ;单科成绩

DW ? ;该学生的总分

DB 02

;学号 DB 79,88,64,97,92 ;单科成绩

DW ? ;该学生的总分

三、实验报告要求

1.程序算法流程图。

2.源程序清单。

3.程序运行结果。

4.调试过程中遇到的问题和解决的方法。

-- 9 --

实验4 综合程序设计

一、实验目的与要求

1.熟悉汇编语言运行、调试环境及方法。

2.掌握汇编语言程序的设计方法。

3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。

二、实验内容

根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。

1. 编写汇编程序接收用户从键盘键入的月份数,在终端上显示该月的英文缩写名。当用户按下ESC键时,程序退出,返回DOS。

参考程序执行过程如下:

month?

5↙ MAY

month?

9↙ SEP

month?

2. 按15行×16列的表格形式显示ASCII码为10H~FFH的所有字符。每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII码为0)分隔。

3.在第2题程序的基础上进行修改。将显示表格的行、列数由固定的15行16列改为由用户从键盘输入。然后,按用户输入的行列值进行显示。

4.编写汇编程序将内存数据区保存的若干个带符号16位数据按从大到小的顺序排列后,以十进制真值的形式在屏幕上显示。

三、实验报告要求

1.程序算法流程图。

2.源程序清单。

3.程序运行结果。

4.调试过程中遇到的问题和解决的方法。

-- 10 --

附 录

附录1 常用DOS命令

1. 显示目录命令DIR

该命令用来列出指定盘、指定目录或指定文件的目录。命令格式有一下三种: DIR [<盘符>][/P][/W]

DIR [<目录路径名>][/P][/W]

DIR [<文件路径名>][/P][/W]

其中/P表示分页显示;/W表示紧缩格式显示,即一行显示多个文件。[ ]中内容为任选项;< >中内容必须输入。

文件路径名为:[<盘符>][<路径>]<文件名>

目录路径名为:[<盘符>]<路径>

文件名中可用通配符“*”和“?”,“*”代表任意一串字符,“?”代表任意一个字符。例如:若要显示D盘MASM目录下的所有扩展名为ASM文件的DOS命令为:

DIR D:\MASM\*.ASM

2. 文件改名命令REN

该命令用来更改文件名,格式为:

REN <旧文件路径名> <新文件名>

旧文件路径名定义同第一点中的文件路径名,文件名中可用通配符“*”和“?”。例如:若要将D盘MASM目录下的test.lst文件改名为test.asm,其DOS命令为:

REN D:\MASM\TEST.LST TEST.ASM

3. 文件复制命令COPY

该命令将一个或多个文件复制成副本,格式为:

COPY <文件路径名> <文件路径名>

文件路径名定义同第一点中的文件路径名,文件名中可用通配符“*”和“?”。例如:若要将D盘MASM目录下的所有扩展名为ASM的文件复制到C盘的EXAMPLE目录下,其DOS命令为: COPY D:\MASM\*.ASM C:\EXAMPLE

若要将当前目录下的TEST.ASM文件复制成TEST1.ASM,其DOS命令为:

COPY TEST.ASM TEST1.ASM

4. 文件删除命令DEL

该命令将一个或多个文件删除,格式为:

DEL <文件路径名>

文件路径名定义同第一点中的文件路径名,文件名中可用通配符“*”和“?”。例如:若要将D盘MASM目录下的所有扩展名为ASM的文件删除,其DOS命令为:

DEL D:\MASM\*.ASM

5. 建立子目录命令MD

该命令用于建立子目录,格式为:

MD <目录路径名>

目录路径名定义同第一点中的目录路径名。

例如: MD SUBDIR1

MD \SUBDIR1\SUBDIR2

-- 11 --

MD \USER1

其中第一条命令在当前目录下建一个名为SUBDIR1的子目录;第二条命令在子目录SUBDIR1中建立SUBDIR2子目录;第三条命令表示在根目录中建立USER1子目录。

6. 删除子目录命令RD

该命令用于删除一个空目录,但不允许删除根目录和当前目录,格式为:

RD <目录路径名>

目录路径名定义同第一点中的目录路径名。例如:若要删除根目录下的USER1子目录,其DOS命令为: RD \USER1

在删除USER1子目录前,子目录USER1必须为空,且USER1不是当前目录。

7. 改变当前目录命令CD

该命令用于显示或改变当前目录,格式为:

CD [<目录路径名>]

目录路径名定义同第一点中的目录路径名。

例如:

CD \USER1

CD \

CD ..

CD

其中第一条命令是将根目录下的USER1子目录设为当前目录;第二条命令是将根目录设为当前目录;

第三条命令是将当前目录的上一级目录设为当前目录(即退回到上一级目录)。第四条命令为显示当前目录。

8. 设置可执行文件的搜索路径命令PATH

用户在当前目录中工作时,时常会运行其它目录下的可执行文件(即扩展名为EXE或COM的文件),PATH命令可满足这一要求。PATH命令用来指出,假如在当前目录中找不到可执行文件时应进一步去查找的目录。格式为:

PATH [<目录路径名>][;<目录路径名>?]

若命令不带参数,将显示当前设置的搜索路径。例如将搜索路径设置为C盘的DOS目录以及D盘的MASM目录的DOS命令为:

PATH C:\DOS;D:\MASM

-- 12 --

8086汇编语言程序设计实验指导书x

附录2 DEBUG主要命令

DEBUG是为汇编语言设计的一种调试工具,它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。

1. DEBUG程序的调用

在DOS的提示符下,可键入命令:

C:>DEBUG [d:][path][文件名][参数1][参数2]

其中文件名是被调试文件的名字,它必须是可执行文件(EXE),两个参数是运行被调试文件所需要的命令参数,在DEBUG程序调入后,出现提示符“-”,此时,可键入所需的DEBUG命令。

2. DEBUG的主要命令

⑴ 显示内存单元内容的命令D,格式为: -D [地址] 或 -D [范围]

例如,显示指定范围内存单元内容的方法为: -D 100 1FF

18E4:0100 47 06 04 02 38 01 47 06 - 06 02 00 02 47 06 08 02 G...8.G.....G... 18E4:0110 02 02 3B 04 02 68 02 00 - 4D 20 50 51 56 57 8B 37 ..;..h..M PQVW.7 其中左边为十六进制表示形式,右边为ASCII码表示形式,“.”表示不可显示字符。这里没有指定段地址,D命令自动显示DS段的内容。

⑵ 修改内存单元内容的命令E,它有两种格式 1) 用给定内容代替指定范围的单元内容,格式为: -E 地址 内容表

例如: -E DS:100 F358595A8D,即用F3,58,59,5A,8D五个字节代替内存单元DS:100到DS:104的内容。

2) 逐个单元相继地修改,格式为: -E 地址

例如: -E DS:100 18E4:0100 89.78

此命令是将0100单元内容89改为78。78是程序员从键盘输入的。程序员在修改完一个单元后,可按“空格”键继续修改下一单元内容,直至按“回车”键结束该命令。 ⑶ 检查和修改寄存器内容的命令R,它有三种方式

1) 显示CPU内部所有寄存器内容和标志寄存器中的各标志位状态 -R

该命令可显示AX,BX,CX,DX,SP,BP,SI,DI,DS,ES,SS,CS,IP及标志寄存器内容。 R命令显示中标志位状态的含义如下所示:

2) 显示和修改某个指定寄存器内容,格式为:

-R 寄存器名

例如: -R AX

系统响应如下:

AX F130

表示AX当前内容为F130,此时若不对其作修改,可按“回车”键,否则,键入修改内容。

3) 显示和修改标志寄存器内容

-RF

系统将给出响应,例如:

OV DN EI NG ZR AC PE CY-

这时若不作修改可按“回车”,否则在“-”之后键入修改值,键入顺序任意,各标志位的取值如上表所示。

⑷ 运行命令G,格式为:

-G [=地址1][地址2[地址3?]]

其中,地址1指定了运行的起始地址,后面的均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容和下一条要执行的指令。

⑸ 跟踪命令T,它有两种格式:

1) 逐条指令跟踪,格式为:

-T[=地址]

该命令从指定地址起执行一条指令后停下来,显示所有寄存器及标志位的内容,如未指定地址从当前的CS:IP开始执行。

2) 多条指令跟踪,格式为:

-T[=地址][值]

该命令从指定地址起执行n条指令后停下来,n由[值]确定。

⑹ 汇编命令A,格式为:

-A [地址]

该命令允许输入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。必须注意:输入的数字均默认为十六进制数。

⑺ 反汇编命令A,它有两种格式:

1) 从指定地址开始,反汇编32个字节,其格式为:

-U [地址]

2) 对指定范围内的存储单元进行反汇编,其格式为:

-U [范围]

⑻ 命名命令N,格式为:

-N 文件标识符 [文件标识符]

该命令将两个文件标识符格式化在CS:5CH和CS:6CH的两个文件控制块内,以便使用L或W命令把文件装入或者存盘。文件标识符格式为:[d:][path] 文件名[.扩展名]

⑼ 装入命令L,它有两种功能:

1) 将磁盘上指定扇区的内容装入到内存指定地址起始的单元中,其格式为:

-L 地址 驱动器 扇区号 扇区数

2) 装入指定文件,其格式为:

-L [地址]

-- 14 --

此命令装入已在CS:5CH中格式化的文件控制块所指定的文件。如未指定地址,则装入CS:0100开始的存储区中。

⑽ 写命令W,它有两种功能:

1) 将数据写入磁盘的指定扇区,其格式为:

-W 地址 驱动器 扇区号 扇区数

2) 将数据写入指定文件中,其格式为:

-W [地址]

此命令把指定内存区域中的数据写入由CS:5CH处的文件控制块所指定的文件中。如未指定地址,则数据从CS:0100开始。要写入文件的字节数应先放入BX和CX中。

⑾ 退出DEBUG命令Q,格式为:

-Q

该命令退出DEBUG程序,返回DOS。

-- 15 --

附录3 汇编程序出错信息

编 码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19 Block nesting error 嵌套过程、段、结构、宏指令等不是正确结束。 Extra character on line 当一行上已接受了定义指令的足够信息,而又出现了多余的字符。 Register already defined 汇编内部出现逻辑错误。 Unknown symbol type 在符号语句的类型字段中,有些不能识别的东西。 Redefinition of symbol 在第二遍扫视时,接着又定义一个符号。 Symbol is multi-defined 重复定义一个符号。 Phase error between passes 程序中有模棱两可的指令,以至于在汇编程序的两次扫视中, 程序标号的位置在数值上改变了。 Already had ELSE clause 在ELSE从句子试图再定义ELSE从句。 Not in conditional block 在没有提供条件汇编指令的情况下,指定了ENDIF或ELSE。 Symbol not defined 符号没有定义。 Syntax error 语句的语法与任何可识别的语法不匹配。 Type illegal in context 指定的类型在长度上不可接收。 Should have been group name 给出的组合不符合要求。 Must be declared in pass 1 得到的不是汇编程序所要求的常数值。例如,向前引用的向量长度。 Symbol type usage illegal PUBLIC符号的使用不合法。 Symbol already different kind 企图定义与以前定义不同的符号。 Symbol is reserved word 企图非法使用一个汇编程序的保留定(例如,宣布MOV为一个变量)。 Forward reference is illegal 向前引用必须是在第一遍扫视中定义过的。 Must be register 希望寄存器作为操作数,但用户提供的是符号而不是寄存器。 Wrong type of register

-- 16 --

说 明

20

21

22

23

24

25

26

27

编 码

28

29

30

31

32

33

34

35

36

37

38

39

40

指定的寄存器类型并不是指令中或伪操作中所要求的。例如ASSUME AX。 Must be segment or group 希望给出段或组,而不是其它。 Symbol has no segment 想使用带有SEG的变量,而这个变量不能识别段。 Must be symbol type 必须是WORD、DW、QW、BYTE或TB,但接收的是其它内容。 Already defined locally 试图定义一个符号作为EXTERNAL,但这个符号已经在局部定义过了。 Segment parameters are changed SEGMENT的自变量与第一次使用这个段的情况不一样。 Not proper align/combine type SEGMENT参数不正确。 Reference to mult defined 指令引用的内容已是多次定义过的。 Operand was expected 汇编程序需要的是操作数,但得到的却是其它内容。 说 明 Operator was expected 汇编程序需要的是操作符,但得到的却是其它内容。 Division by 0 or overflow 给出一个用0作除数的表达式。 Shift count is negative 移位表达式产生的移位计数值为负数。 Operand type must match 在自变量的长度或类型应该一致的情况下,汇编程序得到的并不一样。例如,交换。 Illegal use of external 用非法手段进行外部使用。 Must be record field name 需要的是记录字段名,但得到的是其它东西。 Must be record or field name 需要的是记录名或字段名,但得到的是其它东西。 Operand must have size 需要的是操作数的长度,但得到的是其它内容。 Must be var,label or constant 需要的是变量、标号或常数,但得到的是其它内容。 Must be structure field name 需要的是结构字段名,但得到的是其它内容。 Left operand must have segment 操作数的右边要求它的左边必须是某个段。 One operand must be const 这是加法指令的非法使用。 Operands must be same or 1 abs 这是减法指令的非法使用。

-- 17 --

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

编 码

58

59

60

61

62 Normal type operand expected 当需要变量、标号时,得到的却是STRUCT、FIELDS、NAMES、BYTE、WORD或DW。 Constant was expected 需要的是一个常量,得到的却是另外一个内容。 Operand must have segment SEG伪操作使用不合法。 Must be associated with data 有关项用的是代码,而这里需要的是数据,例如一个过程的DS取代。 Must be associated with code 有关项用的是数据,而这里需要的是代码。 Already have base register 试图重复基地址。 Already have index register 试图重复变址地址。 Must be index or base register 指令需要基址或变址寄存器,而指定的是其它寄存器。 Illegal use of register 在指令中使用了8088指令中没有的寄存器。 Value is out of range 数值大于需要使用的,例如将DW传送到寄存器中。 Operand not in IP segment 由于操作数不在当前IP段中,因此不能存取。 Improper operand type 使用的操作数不能产生操作码。 Relative jump out of range 指定的转移超出了允许的范围(-128~+127字节)。 Index disp.must be constant 试图使用脱胎换骨离变址寄存器的变量位移量。位移量必须是常数。 Illegal register value 拽定的寄存器值不能放入“reg”字段中。(即“reg”字段大于7) No immediate mode 指定的立即方式或操作码都不能接收立即数。例如:PUSH。 Illegal size for item 引用的项的长度是非法的。例如:双字移位。 说 明 Byte register is illegal 在上下文中,使用一个字节寄存器是非法的。例如:PUSH AL。 CS register illegal usage 试图非法使用CS寄存器。例如:XCHG CS,AX Must be AX or AL 某些指令只能用AX或AL。例如:IN指令。 Improper use of segment reg. 段寄存器使用不合法。例如:1立即数传送到寄存器。 No or unreachable CS

-- 18 --

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84 试图转移到不可到达的标号。 Operand combination illegal 在双操作数指令中,两个操作数的组合不合法。 Near JMP/CALL to different CS 企图在不同的代码段内执行NEAR转移或调用。 Label can’t have seg override 非法使用段取代。 Must have opcode after prefix 使用前缀指令之后,没有正确的操作码说明。 Can’t override ES segment 企图非法地在一条指令中取代ES寄存器。例如:存储字符串。 Can’t reach with segment reg. 没有使变量可达到的ASSUME语句。 Must be in segment block 企图在段外产生代码。 Can’t use EVEN on BYTE segment 被提出的是一个字节段,但试图使用EVEN。 Forward needs override 目前不使用这个信息。 Illegal value for DUP count DUP计数必须是常数,不能是0或负数。 Symbol already external 企图定义一个局部符号,但此符号已经是外部符号了。 DUP is too large for linker DUP嵌套太长,以至于从连接程序不能得到所要的记录。 Usage of ? ( indeterminate ) bad “?”使用不合适。例如:?+5。 More values than defined with Only initialize list legal Directive illegal in STRUC Override with DUP is illegal Field cannot be overridden Override is of wrong type Register can’t be farward ref Circular chain of EQU aliases Feature not supported by Small Assembler (ASM)

-- 19 --

附录4 常用字符ASCII码值

8086汇编语言程序设计实验指导书x

NUL 空 BS 退格 LF 换行 CR 回车 ESC 退出 SP 空格

-- 20 --

附录5 8088/8086指令系统

附表5.1 指令符号说明

符 号 r8 r16 reg seg m8 m16 mem i8 i16 imm dest src label

说 明

任意一个8位通用寄存器AH、AL、BH、BL、CH、CL、DH、DL 任意一个16位通用寄存器AX、BX、CX、DX、SI、DI、BP、SP 代表r8、r16

段寄存器CS、DS、ES、SS 一个8位存储器单元 一个16位存储器单元 代表m8、m16 一个8位立即数 一个16位立即数 代表i8、i16 目的操作数 源操作数 标号

附表5.2 指令汇编格式

指令类型 传送指令 交换指令 转换指令 堆栈指令 标志传送 地址传送

指令汇编格式 MOV reg/mem,imm MOV reg/mem/seg,reg MOV reg/seg,mem MOV reg/mem,seg XCHG reg, XCHG reg/mem,reg XLAT label XLAT

PUSH r16/m16/seg POP r16/m16/seg CLC STC CMC CLD STD CLI STI LAHF SAHF PUSHF POPF LEA r16,mem LDS r16,mem LES r16,mem

指令功能简介 dest←src

reg←→reg/mem

AL←[BX+AL] 入栈 出栈 CF←0 CF←1 CF←CF DF←0 DF←1 IF←0 IF←1

AH←标志寄存器低字节 标志寄存器低字节←AH 标志寄存器入栈 出栈到标志寄存器 r16←16位有效地址 DS:r16←32位远指针 ES:r16←32位远指针 -- 21 --

备 注 CS除外 CS除外 CS除外

输入 输出 加法运算 减法运算 指令类型 乘法运算 除法运算 符号扩展

十进制调整 逻辑运算 移位

IN AL/AX,i8/DX OUT i8/DX ,AL/AX ADD reg,imm/reg/mem ADD mem,imm/reg ADC reg,imm/reg/mem ADC mem,imm/reg INC reg/mem SUB reg,imm/reg/mem SUB mem,imm/reg SBB reg,imm/reg/mem SBB mem,imm/reg DEC reg/mem NEG reg/mem CMP reg,imm/reg/mem CMP mem,imm/reg 指令汇编格式 MUL reg/mem IMUL reg/mem DIV reg/mem IDIV reg/mem CBW CWD DAA DAS AAA AAS AAM AAD

AND reg,imm/reg/mem AND mem,imm/reg OR reg,imm/reg/mem OR mem,imm/reg XOR reg,imm/reg/mem XOR mem,imm/reg TEST reg,imm/reg/mem TEST mem,imm/reg NOT reg/mem SAL reg/mem,1/CL

AL/AX←I/O端口i8/DX I/O端口i8/DX←AL/AX dest←dest+src

dest←dest+src+CF

reg/mem←reg/mem+1 dest←dest-src

dest←dest-src-CF

reg/mem←reg/mem-1 reg/mem←reg/mem+1 dest-src

指令功能简介 无符号数乘法 有符号数乘法 无符号数除法 有符号数除法 将AL符号扩展为AX 将AX符号扩展为DX.AX 将AL中的加和调整为压缩BCD码

将AL中的减差调整为压缩BCD码

将AL中的加和调整为非压缩BCD码

将AL中的减差调整为非压缩BCD码

将AX中的乘积调整为非压缩BCD码

将AX中的非压缩BCD码转成二进制

dest←dest AND src

dest←dest OR src

dest←dest XOR src

dest AND src

reg/mem←reg/mem

备 注

算术左移1位/CL指定的位数 -- 22 --

串操作 控制转移

SAR reg/mem,1/CL SHL reg/mem,1/CL SHR reg/mem,1/CL ROL reg/mem,1/CL ROR reg/mem,1/CL RCL reg/mem,1/CL RCR reg/mem,1/CL MOVS[B/W] LODS[B/W] STOS[B/W] CMPS[B/W] SCAS[B/W] REP REPZ/REPE REPNZ/REPNE JMP label JMP r16/m16 Jcc label

算术右移1位/CL指定的位数 逻辑左移1位/CL指定的位数 逻辑右移1位/CL指定的位数 循环左移1位/CL指定的位数 循环右移1位/CL指定的位数 带进位循环左移1位/CL指定的位数

带进位循环右移1位/CL指定的位数 串传送 串读取 串存储 串比较 串扫描 重复前缀 相等重复前缀 不等重复前缀 无条件直接转移 无条件间接转移 条件转移

cc可为

C/NC/Z/NZ/S/NS/O/NO/B/NB/BE/NBE/L/NL/LE/NLE

循环 子程序 指令类型 中断

处理器控制

LOOP label LOOPZ/LOOPE label LOOPNZ/LOOPNE label JCXZ label CALL label CALL r16/m16 RET RET i16 指令汇编格式 INT i8 INTO IRET NOP seg: HLT LOCK WAIT ESC mem

CX←CX-1;若CX≠0,则循环 CX←CX-1;若CX≠0且ZF=1, 则循环

CX←CX-1;若CX≠0且ZF=0, 则循环

若CX=0,则循环 直接调用 间接调用 无参数返回 有参数返回 指令功能简介 中断调用 溢出中断调用 中断返回 空操作指令 段跨越前缀 停机指令 封锁前缀 等待指令 换码指令

-- 23 --

备 注 除CS

附表5.3 状态符号说明

符 号

-

1

x

#

u 说 明 标志位不受影响 标志位清0 标志位置1 标志位按定义功能设置 标志位按指令的特定说明设置 标志位不确定

附表5.4 指令对状态标志的影响(未列出的指令不影响标志)

指 令

SAHF POPF/IRET

ADD/ADC/SUB/CMP/NEG/CMPS/SCAS

INC/DEC

MUL/IMUL

DIV/IDIV

DAA/DAS

AAA/AAS

AAM/AAD

AND/OR/XOR/TEST

SAL/SAR/SHL/SHR

ROL/ROR/RCL/RCR

CLC/STC/CMC OF SF ZF AF PF CF - # # # # # # # # # # # x x x x x x x x x x x - # u u u u # u u u u u u u x x x x x u u u x u x u x x u x u 0 x x u x 0 # x x u x # # - - - - # - - - - - #

-- 24 --

附录6 IBM PC/AT中断功能表

向量号 00H 01H 02H 03H 04H 05H 06H、07H 08H 09H OAH OBH OCH ODH OEH OFH 10H llH 12H 13H 14H 15H 16H 17H 18H 19H 1AH 1BH 1CH 1DH 1EH 1FH 20H 21H 22H 23H 24H 25H 26H 27H 28H~3FH

中 断 功 能 除法错中断 单步中断 NMI中断 断点中断 溢出中断 屏幕打印 保留

定时器时钟中断(IRQ0) 键盘中断(IRQ1) 供IRQ8~IRQ15串接(IRQ2) 异步通信COM2中断(IRQ3) 异步通信COM1中断(IRQ4) 并行打印机LPT2中断(IRQ5) 软盘中断(IRQ6)

并行打印机LPT1中断(IRQ7) 显示I/O功能程序 设备配置检测 存储器容量检测 磁盘I/O功能程序 串行通信I/O功能程序 盒式磁带机I/O功能程序 键盘I/O功能程序 打印机I/O功能程序 ROM BASIC入口 引导程序入口 日时钟I/O功能程序 键盘中止控制 定时器定时 显示器初始化参数 磁盘参数 图形字符集 程序结束 DOS功能调用 结束地址

中止(Ctrl+Break)处理 关键性错误处理 绝对磁盘读 绝对磁盘写 程序驻留结束 DOS内部使用或保留

-- 25 --

注 释

其中0~4为CPU专用内部中断

08H~OFH为外部可屏蔽中断

PC和PC/XT机为保留

PC/XT为硬盘中断

10H~1FH为ROM BIOS中断

PC/XT机不使用

20H~3FH为DOS中断

40H 4lH 42H~6FH 70H 71H 72H 73H 74H 75H 76H 77H 78H~FFH

硬盘I/O功能程序 硬盘参数

保留,用户使用或未使用 实时时钟中断(IRQ0)

软件使其重新指向IRQ2(IRQ9) 保留(IRQ10) 保留(IRQ11) 保留(IRQ12) 协处理机中断(IRQ13) 硬盘中断(IRQ14) 保留(IRQ15)

未使用或保留给BASIC使用

PC机不使用 PC机不使用

70H~77H为外部可屏蔽中断 PC和PC/XT机无法使用

-- 26 --

附录7 常用DOS功能调用(INT 21H)

AH

功 能

00H 程序终止 01H 键盘输入并回显 02H 显示输出 03H 串行通信输入 04H 串行通信输出 05H 打印机输出 06H 直接控制台I/O 07H 键盘输入无回显 08H 键盘输入无回显

检测Ctrl-Break 或Ctrl-C 09H 显示字符串 OAH 键盘输入到缓冲区 OBH 检验键盘状态 OCH 清输入缓冲区并执行指

定的输入功能 0DH 磁盘复位 OEH 选择磁盘驱动器 0FH 打开文件 10H 关闭文件

11H 查找第一个目录项 12H 查找下一个目录项 13H 删除文件 14H 顺序读文件

15H 顺序写文件 16H 创建文件 17H 文件改名

19H 取当前磁盘驱动器 1AH 设置DTA地址 1BH 取默认驱动器FAT信息

入 口 参 数

CS=程序段前缀的段地址

DL=输出字符

DL=发送字符 DL=打印字符

DL=FFH(输入),DL=字符(输出)

DS:DX=字符串地址,字符串以‘$’结尾 DS:DX=缓冲区首址

AL=输入功能号(1、6、7、8、0AH)

DL=驱动器号(0=A,1=B,?) DS:DX=FCB首地址 DS:DX=FCB首地址 DS:DX=FCB首地址

DS:DX=FCB首地址,文件名中可带*或? DS:DX=FCB首地址 Ds:DX=FCB首地址

DS:DX=FCB首地址 DS:DX=FCB首地址 DS:DX=FCB首地址 (DS:DX+1)=旧文件名(DS:DX+17)=新文件名

DS:DX=DTA地址

-- 27 --

出 口 参 数

AL=输入字符

AL=接收字符

AL=输入字符 AL=输入字符 AL=输入字符

(DS:DX)=缓冲区最大字符数 (DS:DX+1)=实际输入的字符数 AL=00H有输入,AL=FFH无输入

清除文件缓冲区 AL=系统中驱动器数

AL=00H文件找到,AL=FFH文件未找到AL=00H目录修改成功,AL=FFH未找到AL=00H找到,AL=FFH未找到 AL=00H文件找到,AL=FFH未找到 AL=00H删除成功,AL=FFH未找到 AL=00H读成功

AL=01H文件结束,记录无数据 AL=02H DTA空间不够

AL=03H文件结束,记录不完整

AL=00H写成功

AL=01H磁盘满或只读文件 AL=02H DTA空间不够

AL=00H创建成功,AL=FFH无磁盘空间AL=00H改名成功,AL=FFH不成功

AL=当前驱动器号(0=A,1=B,?)

AL=每簇的扇区数 DS:BX=FAT标识字符 CX=物理扇区的大小 DX=驱动器的簇数

21H 随机读文件 DS:DX=FCB首地址 AL=00H读成功 AL=01H文件结束 AL=02H缓冲区溢出 AL=03H缓冲区不满

22H 随机写文件 DS:DX=FCB首地址 AL=00H写成功 AL=01H盘满 AL=02H缓冲区溢出

23H 测定文件长度 24H 设置随机记录号 25H 设置中断向量 26H 建立程序前缀PSP 27H 随机分块读

DS:DX=FCB首地址 DS:DX=FCB首地址

DS:DX=中断向量,AL=中断类型号 DX=新的PSP DS:DX=FCB首地址 CX=记录数

AL=0成功,文件长度填入FCB AL=FFH未找到

AL=00H读成功 AL=01H文件结束 AL=02H缓冲区溢出 AL=03H缓冲区不满 CX=读取的记录数

AH 功 能 入 口 参 数

DS:DX=FCB首地址 CX=记录数

出 口 参 数

AL=00H写成功 AL=01H盘满 AL=02H缓冲区溢出 AL=00H标准文件 AL=01H多义文件 AL=FFH非法盘符 CX:DH:DL=年:月:日 AL=00H成功,AL=FFH无效 CH:CL=时:分,DH:DL=秒:百分秒 AL=00H成功,AL=FFH无效

ES:BX=DTA首地址 AL=版本号,AH=发行号

DL=00H关闭检测,DL=01H打开检测 ES:BX=中断向量

成功:AX=每簇扇区数,BX=有效簇数, CX=每扇区字节数,DX=总簇数 失败:AX=FFFFH BX=国别代码

DS:DX=返回的信息区首地址 AX=错误代码 AX=错误码 AX=错误码

28H 随机分块写

29H 分析文件名 ES:DI=FCB首地址 DS:SI=ASCII串 AL=控制分析标志

2AH 取日期 2BH 设置日期 2CH 取时间 2DH 设置时间

2EH 设置磁盘检验标志 2FH 取DTA地址 30H 取DOS版本号 3lH 程序终止并驻留 33H Ctrl-Break检测 35H 获取中断向量 36H 取可用磁盘空间

CX:DH:DL=年:月:日

CH:CL=时:分,DH:DL=秒:百分秒 AL=00关闭检验,AL=01打开校验

AL=返回码,DX=驻留区大小 AL=00取状态

AL=01置状态(DL=00H关闭,DL=01H打开) AL=中断类型号 DL=驱动器号

0=默认,1=A,2=B,?

38H 置/取国家信息 AL=00取国别信息 AL=FFH国别代码放在BX中 DS:DX=信息区首地址 DX=FFFFH设置国别代码

39H 建立子目录 3AH 删除子目录

DS:DX=ASCII串地址 DS:DX=ASCII串地址

-- 28 --

3BH 改变当前目录 3CH 建立文件 3DH 打开文件 3EH 关闭文件 3FH 读文件或设备

DS:DX=ASCII串地址

DS:DX=ASCII串地址,CX=文件属性 DS:DX=ASCll串地址 AL=0/1/2 读/写/读写 BX=文件号

DS:DX=数据缓冲区地址 BX=文件号 CX=读取的字节数

AX=错误码

成功:AX=文件代号;失败:AX=错误码 成功:AX=文件代号;失败:AX=错误码 失败:AX=错误码

成功:AX=实际读出的字节数, AX=0已到文件尾 出错:AX=错误码

成功:AX=实际写入的字节数 出错:AX=错误码

成功:AX=00;失败:AX=错误码 成功:DX:AX=新指针位置 出错:AX=错误码 成功:CX=文件属性 失败:AX=错误码 失败:AX=错误码

成功:AX=文件号2;出错:AX=错误码 成功:AX=文件号1;出错:AX=错误码 DS:SI=ASCII串地址;失败:AX=错误码 成功:AX=分配内存首址 失败:BX=最大可用空间 失败:AX=错误码 失败:AX=错误码 BX=最大可用空间 失败:AX=错误码

40H 写文件或设备 4lH 删除文件 42H 移动文件指针 43H 读取/设置文件属性 44H 设备I/O控制

DS:DX=数据缓冲区地址, BX=文件号,CX=写入的字节数 DX:DX=ASCII串地址 BX=文件号,CX:DX=位移量 AL=移动方式 DS:DX=ASCII串地址

AL=0/1 取/置文件属性,CX=文件属性 AL=2,4读数据,AL=3,5写数据, AL=6取输入状态,AL=7取输出状态

BX=文件号;AL=0取状态,AL=l置状态, 成功:DX=设备信息

45H 复制文件号 46H 强制复制文件号 47H 取当前目录路径名 48H 分配内存空间 49H 释放内存空间 4AH 调整已分配的内存

空间

4BH 装入/执行程序

BX=文件号1

BX=文件号1,CX=文件号2 DL=驱动器号,DS:SI=ASCII串地址 BX=申请内存容量 ES=内存起始段地址 ES=原内存起始地址 BX=再申请的内存容量 DS:DX=ASCII串地址 ES:BX=参数区首地址 AL=0/3 装入执行/装入不执行

4CH 带返回码终止 4DH 取返回码

4EH 查找第一个匹配文件 4FH 查找下一个匹配文件 54H 读取磁盘写标志 AH

功 能

AL=返回码

DS:DX=ASCII串地址,CX=属性

入 口 参 数

DS:DX=旧ASCII串地址 DS:DX=新ASCII串地址 BX=文件号,AL=0读取 AL=l设置 (DX:CX)=日期:时间

AL=返回码 AX=错误码 AL=当前标志值

出 口 参 数

AX=错误码 DX:CX=日期:时间 失败:AX=错误码

DS:DX=ASCII串地址,文件名中可带*或? AX=错误码

56H 文件改名

57H 设置/读取文件日期和

时间

-- 29 --

附录8 BIOS功能调用

INT AH 10

10 1 10 2 10

3

10

4

10 5 10

6

10

7

10 8 10

9

功 能 设置显示方式

置光标类型 置光标位置 读光标位置

读光笔位置

置当前显示页 屏幕初始化或上卷

屏幕初始化或下卷

读光标位置的字符和属性

在光标位置显示字符和属性

调 用 参 数

AL=00 40×25黑白文本,16级灰度 =01 40×25 16色文本

=02 80×25黑白文本,16级灰度 =03 80×25 16色文本 =04 320×200 4色图形

=05 320×200黑白图形,4级灰度 =06 640×200黑白图形 =07 80×25黑白文本

=08 160×200 16色图形(MCGA) =09 320×200 16色图形(MCGA) =OA 640×200 4色图形(MCGA) =OD 320×200 16色图形(EGA/VGA) =OE 640×200 16色图形(EGA/VGA) =OF 640×350 单色图形(EGA/VGA) =10 640×350 16色图形(EGA/VGA) =11 640×480 黑白图形(VGA) =12 640×480 16色图形(VGA) =13 320×200 256色图形(VGA)

(CH)0-3=光标起始行,(CL)0-3=光标结束行BH=页号,DH/DL=行/列 BH=页号

AL=页号 AL=0初始化窗口

AL=上卷行数,BH=卷入行属性 CH/CL=左上角行/列号 DH/DL=右上角行/列

AL=0初始化窗口

AL=下卷行数,BH=卷入行属性 CH/CL=左上角行/列号 DH/DL=右上角行/列

BH=显示页

BH=显示页

AL/BL=字符/属性,CX=字符重复次数

-- 30 --

返 回 参 数

CH=光标起始行 CL=光标结束行 DH/DL=行/列

AX=0光笔未触发 =1光笔触发 CH/BX=像素行/列 DH/DL=字符行/列

AH/AL=字符/属性

10 10 10 10 10 10 10 10

A B C D E F 10 11

在光标位置显示字符 置彩色调色板 写像素 读像素 取当前显示方式 置调色板寄存器(EGA/VGA) 装入字符发生器(EGA/VGA)

BH=显示页

AL=字符,CX=字符重复次数 BH=彩色调色板ID BL=和ID配套使用的颜色

AL=颜色值,BH=页号,DX/CX=像素行/列 BX=页号,DX/CX=像素行/列

AL=0,BL=调色板号,BH=颜色值 AL=0~4全部或部分装入字符点阵集 AL=20~24置图形方式显示字符集 AL=30读当前字符集信息

AL=像素的颜色值

BH=页号,AH=字符列数 AL=显示方式

ES:BP=字符集位置

调 用 参 数

BL=10H(子功能)

返 回 参 数 BH=0 单色方式 =1 彩色方式 BL=VRAM容量 (0=64K,1=128K,?) CH=特征位设置 CL=EGA的开关设置

显示字符(光标前移) AL=字符,BH=页号,BL=前景色

INT 10

AH 12

功 能

返回当前适配器设置的信息(EGA/VGA)

10 13 显示字符串 ES:BP=字符串地址

AL=写方式(0~3),CX=字符串长度 DH/DL=起始行/列,BH/BL=页号/属性

11 取设备信息 AX=返回值(位映像) 0=设备未安装 1=设备未安装

12 13 13 13

0 1 2

取内存容量 磁盘复位 读磁盘驱动器状态 读磁盘扇区

DL=驱动器号

(00,01为软盘,80h,81h,?为硬盘)

AL=扇区数

(CL)6,7(CH)0~7=磁道号 (CL)0~5=扇区号 DH/DL=磁头号/驱动器号 ES:BX=数据缓冲区地址

AX=字节数(KB) 失败:AH=错误码 AH=状态字节 读成功:

AH=0,AL=读取的扇区数 读失败: AH=错误码 写成功:

AH=0,AL=写入的扇区数 写失败: AH=错误码

13 3 写磁盘扇区 同上

13 4 检验磁盘扇区 AL=扇区数

(CL)6,7(CH)0~7=磁道号 (CL)0~5=扇区号

-- 31 --

成功:AH=0 AL=检验的扇区数 失败:AH=错误码

DH/DL=磁头号/驱动器号

13

5

格式化盘磁道

AL=扇区数

(CL)6,7(CH)0~7=磁道号,(CL)0~5=扇区号 DH/DL=磁头号/驱动器号 ES:BX=格式化参数表指针

14 14

0 1

初始化串行口 向通信口写字符

AL=初始化参数 DX=串行口号 AL=字符 DX=通信口号

14

2

从通信口读字符

DX=通信口号

AH=通信口状态 AL=调制解调器状态 写成功:(AH)7=0 写失败:(AH)7=1 (AH)0~6=通信口状态 读成功:(AH)7=0

AL=字符

读失败:(AH)7=1

14 15 15 15

3 0 1 2

取通信口状态 启动盒式磁带机 停止盒式磁带机 磁带分块读

DX=通信口号

ES:BX=数据传输区地址 CX=字节数

AH=通信口状态 AL=调制解调器状态

AH=状态字节 =00读成功 =01冗余检验错 =02无数据传输 =04无引导 =80非法命令

15 16 16

3 0 1

磁带分块读 从键盘读字符 取键盘缓冲区状态

DS:BX=数据传输区地址 CX=字节数

AH=状态字节 (同上) AL=字符码 AH=扫描码 ZF=0

AL=字符码,AH=扫描码 ZF=1 键盘缓冲区空

16 INT 17 17 1A 1A 1A 1A

2 AH 1 2 0 1 6 7

取键盘状态字节

功 能 初始化打印机 回送状态字节 取打印机状态字节 读时钟 置时钟 置报警时间 清除报警

DX=打印机号

CH:CL=时:分 DH:DL=秒:1/100秒 CH:CL=时:分(BCD) DH:DL=秒:1/100秒(BCD)

AH=打印机状态字节 CH:CL=时:分 DH:DL=秒:1/100秒

调 用 参 数

DX=打印机号

AL=键盘状态字节

返 回 参 数 AH=打印机状态字节 成功:AH=0 失败:AH=错误码

-- 32 --

更多相关推荐:
汇编语言实验报告

实验一汇编语言的源程序的输入一实验目的1通过实验了解和熟悉微机系统的配置2学习在DEBUG状态下输入汇编源程序的方法3初步掌握调试在DEBUG状态下的过程二实验原理1本实验在DEBUG状态下输入汇编源程序并且用...

汇编语言程序设计实验报告

学生实验报告册20xx20xx学年第1学期实验名称汇编语言程序设计学院信息与电气工程学院班级09级计算机科学与技术2班学号13514031姓名于志佳指导教师徐静实验一DEBUG的使用实验目的1熟悉在计算机上建立...

汇编语言实验报告

汇编语言实验报告姓名专业软件工程班级093班学号099074235STARTMOVAXDATASMOVDSAXmovbxoffsetblockmovcx256againmovbxbyteptr0字节填充0inc...

汇编语言实验报告

HarbinInstituteofTechnologyatWeihai汇编语言实验报告实验一第一部分dubug用法一问题描述上机前预习debug常用命令的用法复习汇编语言基本指令上机时进行debug命令练习二问...

汇编语言实验报告5份整合版

福建农林大学金山学院课程名称姓名系专业年级学号指导教师职称程序设计类课程实验报告汇编语言庄建军信息与机电工程电子信息工程专业20xx级092230069刘永芬助教20xx20xx学年第二学期实验项目列表福建农林...

汇编语言实验报告一

实验1实验学时2实验地点二综实验日期20xx1020一实验目的掌握汇编编程规范熟悉编程环境二实验内容1编程向内存0200023F依次传送数据0633FH2编程编写code段代码用push指令将a段中的word数...

汇编语言实验报告qxf

汇编语言程序设计实验报告学号班级指导老师姓名实验时间学院目录实验一认识Tddebug集成环境实验日志3实验二IO程序设计实验日志4实验三代码转换程序设计实验日志7实验四分支程序设计实验报告11附录源代码14实验...

汇编语言实验报告

汇编语言语言实验报告学院计算机学院班级网111班学号姓名黄飞指导教师实验1汇编语言运行环境及方法简单程序设计源代码PROGRAMTITLEGOESHEREComparestringdatareasegmentd...

合工大汇编语言实验报告

合肥工业大学计算机与信息学院实验报告课程汇编语言程序设计专业班级学号姓名实验一Debug程序的使用一实验目的1熟悉DEBUG程序中的命令学会在DEBUG下调试运行汇编语言源程序2掌握80868088的寻址方式及...

汇编语言实验报告

汇编语言实验报告廖成D0120xx015康峻豪D0120xx011一实验题目第5题二实验目的用汇编语言实现从键盘上输出两个数可以输入负数先判断是否为有符号数再计算计算他们乘积并以十六进制数的形式输出三实验思路从...

汇编语言实验报告

汇编语言实验报告学院计算机学院姓名王强学号129074061班级计122指导老师纪平实验一汇编运行环境及方法简单程序设计1程序说明本程序用来比较两个字符串string1和string2所含的字符是否相同若相同则...

汇编语言实验报告

华北科技学院综合性实验报告课程名称汇编语言实验学期20XX至20XX学年第2学期学生所在院部计算机学院计算机工程系年级二年级专业班级计科B12-学生姓名学号任课教师实验成绩计算机学院制《汇编语言》课程综合性实验…

汇编语言实验报告(30篇)