汇编实验四--DOS功能调用

合集下载

dos功能调用演示

dos功能调用演示

功能:与1号功能相似。但不屏显。 3、不带显示的键盘字符输入(7号功能) 功能:与1号功能相似。但不屏显,且不响应CTRL+ C和TAB。 4、字符串输入(0AH号功能) 功能:可接受一串字符,用CTRL+C中断。
使用前,须在内存中建立一缓冲区,第一个字节存 放它保存的最大字符数(1~255,不能为0),该值由用 户程序事先设置;第2个字节存放实际调用的字符数(回 车除外),此数由DOS自动填入。用户输入的字符串从 第3个字节开始存放,直至回车结束(自动将回车符的 ASC码0DH加在末尾),如输入的字符超过缓冲区容量, 则多余字符不能存入。调用时须将DS、DX寄存器指向 缓冲区的段基址和偏移量。
补充: DOS功能子程序调用 DOS有许多功能子程序(84个),分为磁盘读写控 制、文件管理、目录管理、内存管理、基本输入/输出管 理等几类。 调用方法:
(1)送入口参数给指定寄存器
(2)AH←功能号
(3)INT 21H
1、带显示的键盘输入(1号功能) 功能:等待键盘输入一个字符,将其ASC码送AL,并 屏显。按CTRL+BREAK(CTRL+C)终止。 2、不带显示的键盘输入(8号功能)
2、组合型加法校正指令DAA
功能:在执行DAA前,已用过ADD或ADC指令,且加法 运算结果已在AL中,执行DAA即对AL中的数据进行校 正,校正结果仍在AL中,向高位的进位仅在CF中。
(1)若AL中低4位的数>9或AF=1,则AL=(AL)+6,AF←1 (2)若AL中高4位的数>9或CF=1,则AL=(AL)+60H,CF←1 3、非组合型减法校正指令AAS 功能:在执行AAS前,已用过SUB或SBB指令,且减法运 算结果已在AL中,执行AAS即对AL中的数据进行校正, 校正结果仍在AL中,向高位的借位放在AH和CF中。 若AL中低4位>9或AF=1,则AL=(AL)-6,AH =(AH)-1,且把AL中高4位清0,CF、AF置1。 4、组合型减法校正指令DAS 功能:在执行DAS前,已用过SUB或SBB指令,且减法运 算结果已在AL中,执行DAS即对AL中的数据进行校正, 校正结果仍在AL中,向高位的借位仅在CF中。 (1)若AL中低4位的数>9或AF=1,则AL=(AL)-6,AF←1 (2)若AL中高4位的数>9或CF=1,则AL=(AL)-60H,CF←1

DOS功能的调用

DOS功能的调用

DOS功能的调⽤DOS功能的调⽤:主要包含三⽅⾯的⼦程序:设备驱动(基本I/O),⽂件管理和其他(包括内存管理,⾃取时间,⾃取终端向量,总之程序等)随着DOS版本的升级,这种DOS功能调⽤的⼦程序数量也在不断的增加,功能恶搞更加完备,使⽤也更加⽅便调⽤的⽅法可以按照下⾯⽅法调⽤DOS功能【1】根据需调⽤的功能调⽤准备⼊⼝参数,有部分调⽤是不需要⼊⼝参数的,但是⼤部分的功能调⽤需要⼊⼝参数,在调⽤前应该准备好⼊⼝参数【2】把功能调⽤号送到AH【3】发软中断指令INT 21H基本的I/O的调⽤1:带回响键盘输⼊(1号功能调⽤)功能:从标准输⼊设备上读⼀字符,并将该字符回显在标准输出设备上,通常情况下,输⼊设备就是键盘,输出设备就是屏幕,如果键盘⽆字符可读,则⼀直等待,直到有字符可读⼊⼝参数:⽆出⼝参数:AL = 督导字符的代码(ASCII码)说明:如果独到的字符是ctrl+c或者CTRL+Break,则结束⼯作2:不带回响键盘输⼊的输⼊(8号功能的调⽤)除读到的输⼊字符不在屏幕上显⽰意外,同1好功能调⽤相似3:直接键盘输⼊(7号调⽤功能)功能:从标准输⼊上读取⼀个字符,通常情况下,标准输⼊就是键盘,如果键盘⽆字符可读,则⼀直等待到有字符可读⼊⼝参数:⽆出⼝参数:AL= 读到字符的代码说明:不检查读到的字符是否是CTRL +C或者是CTRL+break 不回显读到的字符4:显⽰输出(2号功能嗲⽤)功能:向标准输⼊设备写⼀字符,通常情况下,标准输出设备就是屏幕⼊⼝参数:DL = 要输出的字符(ASCII码)出⼝参数:⽆说明:在显⽰输出时检查是否按照CTRL+C或者CTRL+Break5:直接控制台输⼊输出功能:字节控制台输⼊输出,通常情况下,控制台输⼊就是键盘输⼊,控制台输出就是屏幕输出⼊⼝参数:若DL = 0FFH,表⽰输⼊,否则表⽰输出出⼝参数:输⼊时:ZF =1 ,表⽰⽆字符可读,ZF= 0表⽰读到字符,AL= 输⼊字符代码;输出时:⽆说明:【1】:在输⼊时,如果⽆字符可读,并不等待【2】:不检查CTRL+C或者CTRL+Break【3】在读到字符时也不回显【4】再输⼊时,如果AL = 0,表⽰⽤户曾按下过⼀个扩展键,在下⼀次调⽤该功能是,返回该扩展按键的扫描码【5】在输出时,不解释表符等特殊控制符6:显⽰字符串(9号功能调⽤)功能:在标准输出上显⽰⼀个祝福穿,通常标准输出就是屏幕⼊⼝参数:DS:DS= 需要输出字符串的⾸地址,字符串字符‘$’为结束标志出⼝参数:⽆说明:在现实输出时检查是否按下:CTRL +C或者是CTRL+BREAK,如果是则结束程序输⼊字符串(0AH功能的调⽤)功能:从输⼊上读⼀个字符串,通常情况下,标准输⼊就是键盘⼊⼝参数:DS:DX = 缓冲区⾸地址出⼝参数:接收到的输⼊字符串在缓冲区中说明:(1)缓冲区第⼀字节置为缓冲区的最⼤容量,可以认为是⼊⼝参数,缓冲区第⼆字节存放实际读⼊的字符数,可认为是出⼝参数的⼀部分,第三字节开始存放接受的字符串(2)字符串以回车符结束,回车符是字符串接收到的最后⼀个字符(3)如果输⼊的字符串超过缓冲区所能容纳的最⼤字符数,则随后的输⼊字符被丢弃并且响铃,直到遇到回车符为⽌(4)如果在输⼊时按下CTRL+C或者CTRL+break,则程序结束(8)去键盘输⼊状态(0BH号功能的调⽤)功能:判别在标准输⼊设备上是否有字符可读⼊⼝参数:⽆出⼝参数:AL= 0 表⽰⽆字符可读 AL = 0FFH表⽰有字符可读(9)清楚缓冲区后再输⼊(0CH功能调⽤)功能:清除输⼊缓冲区要执⾏的功能号出⼝参数:决定于清除输⼊缓冲区后执⾏的功能说明:清除缓冲区后执⾏的功能室01h,06h,07h或者0Ah,如果不是这样,则不输⼊打印输出:(5号功能调⽤)功能:向链接在第⼀个并⾏⼝上的打印机输出⼀字符⼊⼝参数DL = 要打印字符的ASCII码出⼝参数:⽆说明:打印机可能不⽴即打印指定的字符⽰例代码:1 ;程序功能,写⼀个程序,他接受⼀个字符串,然后显⽰其中数字符的个数,英⽂字母的个数和字符串的个数23 MLENGTH = 1284 DSEG SEGMENT5 BUFF DB MLENGTH6 DB ?7 DB MLENGTH DUP(0)8 MESS0 DB 'Please input :$'9 MESS1 DB 'Length = $'10 MESS2 DB 'X = $'11 MESS3 DB 'Y = $'12 DSEG ENDS13 ;14 CSEG SEGMENT15 ASSUME CS:CSEG,DS:DSEG16 START: MOV AX,DSEG17 MOV DS,AX18 MOV DX,OFFSET MESS019 CALL DISPMESS20 MOV DX,OFFSET BUFF21 MOV AH,1022 INT 21H23 CALL NEWLINE24 MOV BH,025 MOV BL,026 MOV CL,BUFF+127 MOV CH,028 JCXZ COK29 MOV SI,OFFSET BUFF+23031 AGAIN:MOV AL,[SI]32 INC SI33 CMP AL,'0'34 JB NEXT35 CMP AL,'9'36 JA NODEC37 INC BH38 JMP SHORT NEXT39 NODEC: OR AL,20H40 CMP AL,'a'41 JB NEXT42 CMP AL,'z'43 JA NEXT44 INC BL45 NEXT: LOOP AGAIN46 ;47 COK: MOV DX,OFFSET MESS148 CALL DISPMESS49 MOV AL,BUFF+150 XOR AH,AH51 CALL DISPAL52 CALL NEWLINE53 ;54 MOV DX,OFFSET MESS255 CALL DISPMESS56 MOV AL,BH57 XOR AH,AH58 CALL DISPAL59 CALL NEWLINE60 ;61 MOV DX,OFFSET MESS362 CALL DISPMESS63 MOV AL,BL64 XOR AH,AH65 CALL DISPAL66 CALL NEWLINE67 ;68 ;暂停,任意键关闭69 mov ah,170int 21h71 mov ah,4ch ;结束,可以修改al设置返回码 72int 21h73 ;74 ;⼦程序名称:DISPAL75 ;功能:⽤⼗进制数的形式显⽰8位⼆进制数76 ;⼊⼝参数:AL =8位⼆进制数77 ;出⼝参数:⽆78 DISPAL PROC79 MOV CX,380 MOV DL,1081 DISP1:DIV DL82 XCHG AH,AL83 ADD AL,'0'84 PUSH AX85 XCHG AH,AL86 MOV AH,087 LOOP DISP188 MOV CX,389 DISP2: POP DX90 CALL ECHOCH91 LOOP DISP292 RET93 DISPAL ENDP94 ;95 ;显⽰dx所指的提⽰内容,其他⼦程序说明略96 ;97 DISPMESS PROC98 MOV AH,999 INT 21H100 RET101 DISPMESS ENDP102 ;103 ;104 ;显⽰dx所指的字符,其他⼦程序说明略105 ECHOCH PROC106 MOV AH,2107 INT 21H108 RET109 ECHOCH ENDP110 ;111 ;略去⼦程序NEWLINW,该⼦程序列于源程序ASM中112 NEWLINE PROC113 PUSH AX114 PUSH DX115 MOV DL,0DH116 MOV AH,2117 INT 21H118 MOV DL,0AH119 MOV AH,2120 INT 21H121 POP DX122 POP AX123 RET124 NEWLINE ENDP125126 CSEG ENDS127 END STARTView Code代码解析:DSEG中定义了缓冲区以及要提⽰的信息的字符常量DISPMESS PROCMOV AH,9INT 21HRETDISPMESS ENDP在主函数中调⽤DOS功能9显⽰提⽰字符变量;显⽰变量信息之后调⽤DOS功能10,获取字符变量,字符的参数⼊⼝地址是DX,之后调⽤NEWLINE在显⽰功能中调⽤的是DOS功能2,其中回车符的ASCII是0DH,换⾏符的ASCII的是0AH 最后的DOS调⽤时是使⽤1这个使得DOS暂停⼀下,看输出结果之后⽤BH数字符计数器和BL字母符计数器之后⽤变址寄存器SI指向字符串的⾸地址。

DOS功能调用

DOS功能调用

缓冲区第一个字节是可输入的最大字符数+1;第二个 字节是系统在调用该功能时,自动填入的本次调用时实际输 入的字符个数;从第三个字节开始存放输入字符的ASCII码。
当用户输入回车键时,结束输入,并将回车键的ASCII 码(0DH)作为最后一个字符送入缓冲区。但它不计入实际 输入字符个数。 调用入口参量: DS:DX寄存器指向输入缓冲区的段基值:偏移量 CHAR_BUF DB 31H ;缓冲区的最大长度 DB 0 ;存实际输入字符数 DB 31H DUP(0);输入缓冲区 ...... MOV DX,SEG CHAR_BUF;如果DS已经指向CHAR_BUF所在 MOV DS,DX ;数据段,则可以省去这两条指令 MOV DX,OFFSET CHAR_BUF MOV AH,0AH INT 21H
10、设置系统日期(2BH号功能) 该功能用来改变计算机CMOS中的系统日期。入口参数: CX<=年号(1980—2099) DH<= 月号(1—12) DL<= 日(1—31) 返回参数在AL中,成功设置,则返回(AL)=0,否则(AL)=0FFH 例如: MOV CX,2008 MOV DH,4 MOV DL,15 MOV AH,2BH INT 21H CMP AL,0 JNE ERROR ;转出错处)
执行该功能将获得系统的当前时间。返回的时 间参数存放在指定的寄存器中:
CH:小时(0—23) CL:分(0—59) DH:秒(0—59) DL:百分秒(0—99) 例如: HOUR DB ? MINUTES DB ? SECOND DB ? ...... MOV AH,2CH INT 21H MOV HOUR,CH MOV MINUTES,CL MOV SECOND,DH
1、带显示的键盘输入(1号功能) 调用该功能子程序将等待键盘输入,直到按下一个键。将 字符的ASCII码送入AL寄存器,并在屏幕上显示该字符。如果 是Ctrl-C组合键,则停止程序运行。如果是TAB键,屏幕上光 标自动扩展到紧接着的8个字符位置后面,该功能调用无入口 参量。 MOV AH,01H INT 21H

汇编实验四--DOS功能调用

汇编实验四--DOS功能调用

福建农林大学金山学院实验报告系:专业:计算机科学与技术年级: 08 姓名:学号:实验课程:汇编语言实验室号:_______ 实验设备号:实验时间:指导教师签字:成绩:实验四 DOS功能调用1.实验目的和要求1.学会DOS中关于显示功能调用指令的用法。

2.领会修改显存方法显示字符。

2.实验环境实验的硬件环境是:IBM—PC机及其兼容机实验的软件环境是:操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。

3.实验内容及实验数据记录1、输入一个字符,显示出来2、输入一个字符串,显示出来3、buf开始的3个的16位二进制数用十六进制数的形式显示出来(1)理解程序(2)输入程序,汇编,运行(在DOS状态下输入:文件名.EXE),观察结果。

(3)如果要分行显示,程序要如何修改?DATA SEGMENTBUF DW 4F59H, 56A8H, 0FF90HDATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DA TASTART: MOV AX, DA TAMOV DS, AXMOV SI, 0P: MOV BX, BUF[SI]MOV CH, 4L: MOV CL, 4ROL BX, CLMOV DL, BLAND DL, 0FHCMP DL, 10JB NEXTADD DL, 7NEXT: ADD DL, 30HMOV AH, 2INT 21HDEC CHJNZ LINC SIINC SICMP SI, 4JNA PMOV AH, 4CHINT 21HCODE ENDSEND START4、运行下列程序,在屏幕的第1行,会显示一个字符X,理解程序段STACK SEGMENTDB 128 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACKSTART: MOV AX,STACKMOV SS,AXMOV SP,128MOV AX,0B800HMOV ES,AXMOV AH,0 ;BIOS 10H的0号功能,设置80X25的彩色字符模式 MOV AL,03HINT 10HMOV AH,'X'MOV ES:[160*1+40*2],AHMOV AL,0MOV AH,4CHINT 21HCODE ENDSEND START5、显示*************************6、编写程序,统计字缓冲区中的20个数据的正数、负数、0的个数,并将统计结果以16进制形式显示出来。

DOS功能调用

DOS功能调用

AGAINF:MOVAX, 0601H; 向上滚动一行 MOVBH, 3CH; MOVCX, 1400H; 20 行 0 列 MOVDX, 174FH; 23 行 79 列 INT10H; MOVAH, 01; 读键盘 INT16H; JNEDOWN; 有键被按动则结束 MOVAL, C1; 否则继续
AGAIND:MOVCX, 28000#; DLOOP:LOOPDLOOP#; DECBX#; CMPBX, 0#; JNEAGAIND#; CMPAL, ′Z′; 修改C1 中的内容( ′A′→ ′Z′)#; JED1#; INCC1#;
JMPAGAINF#; D1:MOVC1, ′A′#; JMPAGAINF#; DOWN:MOVAX, 03H#; INT10H#; MOVAH, 4CH#; INT21H#; CODEENDS#; ENDSTART
INT21H; LEADX, BUFIN; MOVAH, 0AH; 读一字符串送入BUFIN INT21H; MOVAL, BUFIN+1; 取实际输入的字符个数 CBW; LEASI, BUFIN+2; ADD SI, AX; MOVBYTE PTR [ SI ] , ′$′; ′$′ 送 到 输 入 字 符 串 的 末 尾 LEADX, CRLF;
CRLFDB 0DH, 0AH, ′$′; STRING2DB ′PLEASE INPUT STRING.′, 0DH, 0AH, ′$′; BUFINDB 20H; DB ?; BUFIN1DB 20H DUP(?); DATAENDS; CODESEGMENT; ASSUMECS:CODE, DS:DATA, SS:STACK; START:MOVAX, DATA;
例 4.3.19 从键盘上输入一字符串, 将其送入输入缓冲 区, 并显示这组字符串. 程序如下: STACK SEGMENT DW 40 DUP(?); TOPLABEL[KG*2] WORD; STACKENDS; DATASEGMENT; STRING1DB ′DO YOU WANT TO INPUT STRING? (Y/N):$′; STACK;

DOS系统功能调用

DOS系统功能调用
微机与接口技术
4.3 DOS和BIOS功能调用 4.3.1 概述
系统功能调用——由OS提供的一组实现特殊功能的子程 序供程序员在程序中调用,以减轻编程工作量。 系统功能调用有两种,一种称为DOS功能调用,另一种 称为BIOS功能调用。 用户程序在调用这些系统服务程序时,不是用CALL命 令,而是采用软中断指令INT n来实现。 在DOS系统中,功能调用都是用软中断指令INT 21H来 实现的。
3.源程序的基本结构:顺序、分支、循环、过程
14
微机与接口技术
4.4.2 循环程序设计 循环程序的结构形式
循环初始状态 循环初始状态 循环体 循环控制条件
Y
循环体 循环控制条件
N
N DO_WHILE
Y DO_UNTIL
15
微机与接口技术
例1.试编制一个程序把BX寄存器内的二进制数用十六进制数 的形式在屏幕上显示出来。(单重循环)
10
微机与接口技术
例:键入一字符串,把它存放内存中并在屏幕上显示。
DATA SEGMENT BUFSIZE DB 50 ACTCHAR DB ? CHARTEXT DB 50 DUP(20H) DB ‘ $’ DATA ENDS CODE SEGMENT MOV DX ,OFFSET BUFSIZE MOV AH,0AH INT 21H MOV DX, OFFSET CHARTEXT MOV AH,09H INT 21H
9、 INT 28H~3FH
4
微机与接口技术
2. DOS系统功能调用(INT 21H)
INT 21H 是一个具有近90个子功能的中断服务程序。这些子 功能的编号称为功能号。 INT 21H的功能: 设备管理:键盘输入、显示器输出、打印机输出等。 目录管理:查找目录项、查找文件、文件改名等。 文件管理:打开、关闭、读/写、删除文件等。 其它 使用方法: 置功能号AH 设置 入口参数 执行 INT n 分析 出口参数

汇编语言---dos和bios功能调用

汇编语言---dos和bios功能调用

下面介绍一下其他功能: 下面介绍一下其他功能: (1)AH=25H:设置中断向量 ) : 入口参数: 中断号。 入口参数:AL=中断号。 中断号 DS:DX=中断向量。 中断向量。 : 中断向量 功能: 所指中断号的中断向量设置为DS: 。 功能:将AL所指中断号的中断向量设置为 :DX。 所指中断号的中断向量设置为 (2)AH=35H:获取中断向量 ) : 入口参数: 中断号。 入口参数:AL=中断号。 中断号 出口参数: : 中断向量。 出口参数:ES:BX=中断向量。 中断向量 功能: 的指中断号的中断向量由ES: 返回 返回。 功能:将AL的指中断号的中断向量由 :BX返回。 的指中断号的中断向量由 (3)AH=31H:程序终止并驻留内存 ) : 入口参数: 返回码。 入口参数:AL=返回码。 返回码 DX=驻留内存的节数(1字=16字节)。 驻留内存的节数( 字 字节)。 驻留内存的节数 字节 功能:终止程序执行,全由DX所确定的一部分代码工 功能:终止程序执行,全由 所确定的一部分代码工 数据仍留在内存中。 数据仍留在内存中。
• ③ 应用BIOS提供的功能程序来控制硬件。这是低层次 控制,要求编程者对硬件有相当深入的了解。当BIOS 与DOS提供的功能相同时,应首先选用DOS。BIOS固 化在ROM中,不依赖于DOS操作系统,使用BIOS软中 断调用子程序可直接控制系统硬件。BIOS调用速度快, 适用于高速运行的场合。中断调用可用软件中断指令 “INT n”来实现,n为中断类型码。使用BIOS调用的汇 编语言和C语言的程序可移植性比较差。 • • ④ 直接使用汇编语言编程进行控制。要求编程者对I/O 设备的地址、功能比较熟悉。
习 题 1.假设 假设VAR1和VAR2为字变量,LAB为标号,试指出下 为字变量, 为标号, 假设 和 为字变量 为标号 列指令的错误之处: 列指令的错误之处: (1)ADD VAR1,VAR2 ) , (2)SUB AL,VAR1 ) , (3)JMP LAB[SI] ) (4)JNZ VAR1 ) (5数据 画图说明下列语句所分配的存储空间及初始化的数据 值。 ,-12H,3 DUP (1)BYTE_VAR DB ‘BYTE’,12,- ) , ,- , ,?,2 (0,?, DUP(1,2),?) ,?, ( , ),?) ,?,-5, (2)WORD_VAR DW 5 DUP(0,1,2),?,- , ) , , ,?,- ‘BY’,‘TE’,256H , ,

汇编 第七章DOS的功能调用

汇编 第七章DOS的功能调用

三、6号系统功能调用——直接控制台输入输出 号系统功能调用 直接控制台输入输出
功能:从键盘输入一个字符,或输出一个字符到屏幕。 功能:从键盘输入一个字符,或输出一个字符到屏幕。 入口参数:如果DL=0FFH 表示是从键盘输入字符; 入口参数:如果DL=0FFH,表示是从键盘输入字符; DL 否则表示输出,DL=输出字符的代码。 否则表示输出,DL=输出字符的代码。 出口参数:输入时,ZF=0表有键按下,AL=字符的ASCII码 出口参数:输入时,ZF=0表有键按下,AL=字符的ASCII码; ASCII ZF=1 ZF=1时,表示无键按下。 表示无键按下。 输出时,无出口参数。 输出时,无出口参数。
六、4CH号系统功能调用 CH号系统功能调用——返回操作系统 号系统功能调用 返回操作系统
功能:结束当前正在执行的程序,并返回操作系统, 功能:结束当前正在执行的程序,并返回操作系统,屏幕显 示操作系统提示符( 为当前使用的驱动器名)。 示操作系统提示符(N:\>,N为当前使用的驱动器名)。 入口参数: 入口参数:无 出口参数: 出口参数:无
在屏幕上显示字符串: you”。 例7.1 在屏幕上显示字符串:“How are you 。
DATA SEGMENT BUF DB ‘How are you $’ ;定义缓冲区字符串 How DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA , MOV DS,AX , MOV DX,OFFSET BUF , MOV AH,9 , INT 21H MOV AH,4CH INT 21H CODE ENDS END START
MOV DL,0DH MOV AH,2 INT 21H ;回车 MOV DL,0AH MOV AH,2 INT 21H ;换行 MOV DX, OFFSET BUF1+2 MOV AH, 9 INT 21H ;显示排序后的字符串 MOV AH, 4CH INT 21H CODE ENDS END START

微机原理实验四串操作指令

微机原理实验四串操作指令

实验四串操作指令程序实验一、实验目的1. 熟悉五种串操作指令的功能,会编写常用的串操作应用程序。

2. 会使用DEBUG 命令查看串操作运行的结果。

二、实验环境1. 硬件:PC 微机2. 软件:Masm for Windows 汇编集成开发环境三、实验讲义串指连续存放在存储器中的一些数据字节、字或者双字。

串操作允许对程序连续存放的数据块进行操作。

这是唯一一种可以从存储器到存储器的指令。

源串一般存放在数据段,偏移地址由SI 指定;目标串必须在附加段,偏移地址由DI 指定。

在每次进行串操作后,SI 和DI 两个指针会自动修改。

修改的是增量方向还是减量方向由标志位DF 决定,DF=0 为增量操作,DF=1 为减量操作。

CX 中存放的是数据块的长度,可在CX 前加重复前缀标志,对串进行连续操作。

执行串指令之前,一般先进行如下操作:源串首地址(末地址)→ SI目的串首地址(末地址)→ DI串长度→ CX建立方向标志DF1. 重复前缀标志助记符判断条件说明REP CX 0 CX=CX-1,若CX 0 则重复REPE 或REPZ CX 0 且ZF=1 CX=CX-1,若CX 0 且ZF=1 则重复REPNE 或REPNZ CX=0 且ZF=0 EX=CX-1,若CX 0 且ZF=0 则重复2. 方向标志指令方向标志由标志位DF 决定,有CLD 和STD 两种指令。

CLD 将DF 置0,地址为增量操作。

STD 将DF 置1,地址为减量操作。

3. 串传送指令格式: [REP] MOVS DESTS, SRCS[REP] MOVSB/ MOVSW / MOVSD功能:将DS:SI 中的源串数据传送到ES:DI 规定的目的串单元中。

加重复前缀REP 可实现连续存放的数据块的传送。

例1:将源串中前三个字节的数据传送到目的串。

源串在数据段(DATAS)中,存放在SRC 单元中;目的串在附加数据段(EDATAS)中,存放在DEST 单元中。

汇编语言实验报告

汇编语言实验报告

实验一汇编程序的汇编及运行1.实验目的和要求1、熟悉汇编程序的汇编、连接、执行过程2、生成LST文件,查看LST文件3、生成OBJ文件,修改语法错误4、生成EXE文件5、执行2.实验环境IBM—PC机及其兼容机实验的软件环境是:操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。

3.实验内容及实验数据记录1、将数据段输入,取名1.txt,保存在MASM文件夹下。

生成LST文件,(不必连接、运行)用EDIT查看1.LST文件。

试回答:DA1,DA2的偏移量分别是多少?COUNT的值为多少?DATA SEGMENTORG 20HNUM1=8NUM2=NUM1+10HDA1 DB ‘IBM PC’DA2 DB 0AH, 0DHCOUNT EQU $-DA1DATA ENDSEND2、输入有错误的文件,修改错误语句。

(MASM没有出现错误即可。

不必连接、运行。

)DATA SEGMENTVAR1 DB 0, 25, ODH, 300VAR2 DB 12H, A4H, 6BHVAR3 DB ’ABCDEF’VAR4 DW 1234H, 5678HVAR5 DW 10H DUP(?)DATA ENDSCODE SEGMENTASSUME CS: CODE, DE: DATA BEING MOV AX, DATAMOV DS, AXLEA SI, VAR5MOV BX, OFFSET VAR2MOV [SI], 0ABHMOV AX, VAR1+2MOV [BX], [SI]MOV VAR5+4, VAR4MOV AH, 4CHINT 21HCODE ENDSEND START3、输入正确的程序,汇编、连接、运行STACKS SEGMENT STACKDW 128 DUP(?)STACKS ENDSDATAS SEGMENTSTRING DB ‘WELCOME!’, 13, 10, ‘$’DATAS ENDSCODES SEGMENTASSUME CS: CODES, DS: DATASSTART:MOV AX, DATASMOV DS, AXLEA DX, STRINGMOV AH, 9INT 21HMOV AH, 4CHINT 21HCODES ENDSEND START4.算法描述及实验步骤(1)编写源程序。

第4章 汇编语言语法和DOS功能调用

第4章 汇编语言语法和DOS功能调用
第4章 汇编语言语法和DOS功能调用
教学内容 4.1 数据类型及其存储规则
4.2 汇编语言程序的格式
4.3 伪指令语句 4.4 汇编语言中的表达式 4.5 指令语句 4.7 DOS系统功能调用 教学目标 1 理解汇编语言中的基本数据。 2 掌握汇编语言中的常用伪指令。
3 理解DOS系统功能调用。
重点内容
6、 方式定义伪指令语句 格式: .8086 .386 7、 结构定义伪指令语句 有三条语句:结构定义伪指令,结构存储分配和预置伪指令及 结构使用伪指令。 (1)结构定义伪指令语句 格式:结构名 STRUC 数据变量序列 结构名 ENDS
例4.10
定义一个数据表格TAB的结构 TAB STRUC DA1 DB ‘ABCD’ DA2 DW ? DA3 DW SEG LIS DA4 DW 2 DUP(0) DA5 DW 1234H, 4321H TAB ENDS
4、过程定义伪指令语句 指令格式: 过程名 PROC 属性 过程内容 RET 过程名 ENDP 功能:定义一个由主程序可以用CALL指令调用的过程。 说明: 1)过程名是过程的名字,也是子程序的入口地址,不可缺少。 如同标号一样,也有三种属性: 段地址:过程的段基址。 偏移地址:过程的第一个字节与段首址之间相距的字节数。 距离类型:NEAR和FAR类型。NEAR允许在段内调用,FAR允许在 段间调用,若缺省则为NEAR。
(4)别名定义伪指令语句
格式:别名 LABEL 类型属性
LABEL:伪指令助记符,不可缺省。 功能:为一个已经定义过的标识符另取一个名称,以获得一个 新的类型属性。
例4.7 定义变量的别名
DATAB DATAW LABEL DW MOV BYTE 1234H,5678H AX,[SI]

汇编语言语法和DOS功能调用

汇编语言语法和DOS功能调用

可编辑ppt
7
示例程序(续)
ROTATE :
DISPLAY:
MOV CL, 4 ;CL中放移位位数
MOV DL, AL ;显示16进制数
ROL BX,CL
MOV AH,2
MOV AL,BL
INT 21H
AND AL,0FH ;AL中为一位16进制数 DEC CH
ADD AL,30H ;转换为ASCII码值
1
三种语言的比较
可编辑ppt
2
为什么还要学习和使用汇编语言呢?
主要有三点原因: 1) 程序设计人员能更充分地利用机器硬件的全部功能,发
挥机器长处。 2) 底层的一些功能仍然靠汇编语言程序来实现。 3) 汇编语言程序比高级语言程序的目标代码短且运行速度
快。在要求节省内存空间和提高程序运行速度的重要场 合(如实时控制等)常用汇编语言来编制。
注释字段:是一个任选字段,用于说明程序片段或指令的功能,汇编过程中 不处理这样的字段,它只是用于提高源程序的可读性.注释必须使用分号作 为开始。
例子:教材P138 例4-1
可编辑ppt
12
伪指令语句格式
•伪指令语句:这种语句用于指示汇编程序(翻译程序)如何 汇编源程序.和指令语句不同,汇编程序处理它时不会产生 机器指令代码,只对伪指令提出的要求进行解释并立即完成 要求的操作.
DATA ENDS
CODE SEGMENT
;代码段
ASSUME CS:CODE,DS:DATA
BEGIN: MOV AX, DATA
MOV DS,AX
MOV DX,OFFSET NOTES ;显示提示信息
MOV AH,9H
INT 21H
MOV BX,NUM

dos功能调用

dos功能调用

dos功能调用DOS(Disk Operating System)是一种操作系统,最初在20世纪80年代末和90年代初广泛应用于个人计算机中。

它提供了许多功能调用,用于执行各种操作。

1. 文件和目录操作:DOS的功能调用可以用于创建、复制、删除、移动文件和目录。

它允许用户在不同的目录之间切换,并显示当前目录的内容。

用户可以使用这些功能调用来管理计算机上的文件和目录。

2. 磁盘操作:DOS的功能调用允许用户格式化磁盘、验证磁盘的完整性,以及在磁盘上创建新的分区。

用户还可以使用这些功能调用来将文件从一个磁盘复制到另一个磁盘,并执行其他与磁盘相关的操作。

3. 内存管理:DOS的功能调用可以用于分配和释放内存。

它允许用户在程序执行过程中动态分配和释放内存块,以提高可用内存的利用率。

4. 进程控制:DOS的功能调用允许用户启动新的进程,并控制它们的执行。

用户可以使用这些功能调用来运行其他程序、传递命令行参数,并等待其他进程完成执行。

5. 输入和输出:DOS的功能调用可以用于读取用户输入和向用户输出信息。

它允许用户在程序执行过程中与用户进行交互,并显示相关的信息,以指导用户的操作。

6. 系统信息获取:DOS的功能调用可以用于获取系统的各种信息,如硬件配置、操作系统版本等。

用户可以使用这些功能调用来了解计算机的当前状态,并根据需要进行相应的操作。

总结起来,DOS的功能调用提供了许多操作系统级别的功能,使用户能够管理文件和目录、执行磁盘操作、分配和释放内存、控制进程、处理输入和输出,并获取系统信息。

这些功能调用为用户提供了一个强大的工具,以在DOS环境中执行各种操作。

电子科技大学_汇编实验报告

电子科技大学_汇编实验报告

电子科技大学计算机工程学院标准实验报告(实验)课程名称电子科技大学教务处制表电子科技大学实验报告实验一学生姓名:穆萨·图拉克学号:2012060090033 指导教师:实验地点:主楼A2-412 实验时间:19:00~一、实验室名称:二、实验项目名称:汇编源程序的上机调试操作基础训练三、实验学时:四、实验原理:(包括知识点,电路图,流程图)DEBUG 的基本调试命令;汇编数据传送和算术运算指令MASM宏汇编开发环境使用调试方法五、实验目的:1. 掌握DEBUG 的基本命令及其功能2. 学习数据传送和算术运算指令的用法3. 熟悉在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程六、实验内容:(介绍自己所选的实验内容)1. DEBUG命令的使用2. 程序的调试与运行3. 编写程序计算以下表达式:Z=(5X+2Y-7)/2设X、Y的值放在字变量V ARX、V ARY中,结果存放在字节单元V ARZ中。

七、实验器材(设备、元器件):WinXP PC机,MASM,50 ,VisulASM软件平台。

八、实验步骤:(编辑调试的过程)1.编辑源程序,建立一个以后缀为.ASM的文件.2.汇编源程序,检查程序有否错误,有错时回到编辑状态,修改程序中错误行。

无错时继续第3步。

3.连接目标程序,产生可执行程序。

4.用DEBUG程序调试可执行程序,记录数据段的内容。

九、实验数据及结果分析:(实验运行结果介绍或者截图,对不同的结果进行分析)程序说明:功能:本程序完成Z=(5X+2Y-7)/2这个等式的计算结果求取。

其中X 与Y是已知量,Z是待求量。

结构:首先定义数据段,两个DB变量VARX与VARY(已经初始化),以及结果存放在VARZ,初始化为?。

然后定义堆栈段,然后书写代码段,代码段使用顺序程序设计本程序,重点使用MOV和IMUL以及XOR,IDIV完成程序设计。

详细内容见程序注释。

程序清单:DATA SEGMENTVARX DB10VARY DB10VARZ DB?DATA ENDSSTACK SEGMENT PARA STACKSTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKMAIN:MOV AX,DATAMOV DS,AXMOV AL,VARXMOV AH,VARYSAL AL,1SAL AL,1ADD AL,VARXSAL AH,1ADD AL,AHSUB AL,7SAR AL,1MOV VARZ,ALMOV AH,4CHINT21HCODE ENDSEND MAIN程序框图:结束调试说明:将汇编语言(.asm文件)通过masm命令转换为目标程序(.obj 文件),通过link命令转换为目标程序可执行程序(.exe文件); 这次试验还要用-p参数以及d参数显示结果为:十、实验结论:(联系理论知识进行说明)通过本次实验,我们学习了解掌握了DEBUG 的基本命令及其功能,学习了数据传送和算术运算指令的用法,熟悉了在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程。

微机原理 DOS功能调用

微机原理 DOS功能调用

3. DOS系统功能调用举例
若键入的字符串为“ good morning.” ,包括空格共 13 ( 0DH )个字符,则缓冲区各单元存储的信息如图 4.5 所示。要检查是否已在缓冲器中存入字符串,可 用显示字符的功能调用,将字符串显示在屏幕上。
3. DOS系统功能调用举例
2)显示功能调用 2号功能调用用来显示单个字符,9号功能调用则 显示以$结尾的字符串。
4.2.1 概述 4.2.2 DOS系统功能调用
4.2.3 BIOS中断调用Βιβλιοθήκη 4.2.2 DOS系统功能调用
1.中断处理程序分类
• 8086 CPU可处理256类中断,利用INT n 指令,可直 接调用256个系统已编写好的中断处理程序。INT n 指令中的类型号n=00~FFH;


n=00~04H为专用中断,处理除法错、单步、不可屏 蔽中断NMI、断点、溢出中断; n=10H~1AH 、 2FH 、 31H 、 33H 为 BIOS 中断,即保 存在系统ROM BIOS中的BIOS功能调用。
1)DOS键盘功能调用
3. DOS系统功能调用举例
利用DOS功能调用,可将读入的键值送进AL,并显 示在 CRT 上,或检查是否有键压下等,还可将从键 盘输入的一串字符输入到内存缓冲区中。
例4.18 DOS功能调用1,等待从键盘输入一个字符。
MOV AH,01 H ;AH 功能调用号01H INT 21H ;AL 读入键值,并显示该字符 若有键压下, 读入键值, 并检查是否为 Ctrl-Break键? 若是, 自动调用INT 23H中断, 执行退出命令;否则将 键值送入AL, 并显示该字符。
• •

ROM BIOS中断调用的方法与DOS系统功能调 用法类似,不过每个中断调用可能会包含多个 子功能,用功能号来区分它们。BIOS中断调用 的基本步骤为:

汇编 第七章DOS的功能调用

汇编 第七章DOS的功能调用

例: MOV DL,0FFH , MOV AH,6 , INT 2lH 把键盘输入的一个字符送入AL中 ;把键盘输入的一个字符送入 中 MOV DL,61H , 中的字符“ 送屏幕显示 MOV AH,6 , ;将DL中的字符“a”送屏幕显示 中的字符 INT 21H 注:与1号、2号系统功能调用不同之处在于不检查Ctrl+Break。 号系统功能调用不同之处在于不检查Ctrl+Break。 Ctrl+Break
例7.2:编程,在显示器上显示“WHO ARE YOUR?”, :编程,在显示器上显示“ ? 然后接收你的名字并输出在显示器上。 然后接收你的名字并输出在显示器上。 DATA SEGMENT BUF DB 'WHO ARE YOU?','$' NAM DB 4,0,5 DUP ('$') DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,9 INT 21H MOV DX,OFFSET NAM MOV AH,0AH INT 21H MOV DL,0AH MOV AH,2 ;换行 INT 21H 换行 MOV DX,OFFSET NAM+2 MOV AH,9 INT 21H MOV AH,4CH INT 21H CODE ENDS END START
二、2号系统功能调用——显示输出 号系统功能调用 显示输出
功能:向输出设备输出一个字符。 功能:向输出设备输出一个字符。 入口参数:DL=输出字符的ASCII码 入口参数:DL=输出字符的ASCII码。 ASCII 出口参数: 出口参数:无 例:MOV DL,′A′; “A”为要求输出字符的ASCII码 DL,′A′; 为要求输出字符的ASCII 为要求输出字符的ASCII码 AH, MOV AH,2 INT 21H

第3章汇编语言程序设计-3.4DOS系统功能调用

第3章汇编语言程序设计-3.4DOS系统功能调用

№ 13
3)打印输出类

MOV AH , 5 MOV DL , ’待打印字符’ INT 21H
№ 14
3.4.3 . BIOS调用 (P391 附录5)
和DOS功能调用类似:
也用 INT n 指令,但 n = 5~1FH 也有功能号,取入AH 有的也有入口参数,取入有关寄存器 有的也有出口参数 也有键盘、显示器、打印等管理 其中显示调用INT 10H功能丰富。
DS , (用户程序段基址址) 21H
INT
读出原矢量(DOS功能调用): 出口
MOV MOV INT
AH , 35H AL , (中断类型号) 21H
: BX=原矢量偏移地址 ES =原矢量段基址 再将读出的矢量存入安全的地方保护 。
№ 23
程序结束返回DOS 的非标准方法 在代码段结束之前(即CODE ENDS之前) 增加两句: MOV AH,4CH INT 21H ;4CH号的DOS系统功能调用
…… RET 名字 ENDP № 25


№ 15
P17图1.8 IBM PC 及 PC/XT 系统板功能结构图
№ 16
时间中断

1. 系统时钟构成
(8253芯片)
INT 8 中断服务程序 0046CH~0046FH
加 1 计数(32位) 低16位计满为216 = 1小时
IRQ0信号 55ms定时 18.2次/秒
故0046DH : 0046CH以55mS为单位计数
0AH功能注意事项: ◢ 输入的字符均带回显,且光标随字符移动。当输入回车符结束 时,光标回到了行首。 ◢ 回车符0DH作为一个输入的字符存放在字符串尾,但不计数。 实际最多能输入的字符数 = 限制的最多数-1 (回车符占1个) ◢ 执行完0AH功能后,DS和DX的值不变,仍指向缓冲区首地址。 ◢ 整个缓冲区的大小应为:限制的最多数 +2 №9

DOS功能调用及汇编语言程序设计举例

DOS功能调用及汇编语言程序设计举例

DOS功能调⽤及汇编语⾔程序设计举例DOS功能调⽤及汇编语⾔程序设计举例5.1 DOS功能调⽤DOS-磁盘操作系统,象WINDOS操作系统⼀样是进⾏计算机系统管理的软件,在WINDOS 以前,PC机上主要应⽤的是DOS 操作系统,两者间的最⼤区别是在DOS 操作系统下,⽤户可以利⽤⾃⼰所编的程序直接对外设(硬件端⼝)进⾏操作,如对磁盘进⾏读写,对打印机进⾏控制等,⽽在WINDOS操作系统下,⽤户只能通过特有的驱动程序才能对其进⾏操作,因为所有外设均被WINDOS操作系统统⼀管理,⽤户⽆法在⾃⼰的程序中对他门进⾏操作。

1、DOS功能在PC机的操作系统(DOS)的安装过程中,将⼀些常⽤的⼦程序安装到了内存单元中,⽤户可以在编写⾃⼰的⽤户程序时,进⾏调⽤。

其中有两种:BIOS⼦程序:功能管理与计算机相连接的外部设备(显⽰器、键盘、磁盘驱动)程序,称为基本输⼊输出系统(basic Input/output system)这部分程序是存放在ROM 区所以通常称为:ROM BIOSDOS功能程序:与BIOS程序⼀样,DOS功能程序也是计算机操作系统开发⼈员编写的⼀些常⽤的⽤于磁盘⽂件管理的⼦程序,主要⽤于磁盘⽂件的建⽴、打开、读写、关闭,⽤户同样可以在⾃⼰的程序中对他们进⾏调⽤,简化⽤户程序的开发。

与BIOS不同的是DOS功能程序是存放在硬盘上的,在系统上电时,由操作系统,将其安装到内存中的,称为常驻内存程序。

⽤户调⽤这两种程序⼀般采⽤中断指令进⾏调⽤:DOS功能的调⽤⽅法:1、在AH中写⼊功能调⽤号2、在指定的寄存器中设置⼊⼝参数3、⽤INT 21 指令执⾏调⽤4、根据出⼝参数分析调⽤执⾏情况实际上,所有的DOS 功能⼦程序被组成了⼀个⼤程序存放在内存单元中,从nn1:nn2 开始的单元中,在操作系统上电进⾏系统初始化时,将nn1:nn2 存放到了中断向量表中,0000H:0084H开始的连续4个单元中,当⽤户在⽤户程序中⽤INT 21H 调⽤DOS的某⼀个功能时,即控制程序转移到nn1:nn2 开始的程序,在这段程序中⾸先根据AH中的功能,可以分析出⽤户调⽤的哪⼀个功能从⽽在转到相应地⽅执⾏相应的程序段。

dos 汇编 子程序调用实例

dos 汇编 子程序调用实例

Dos汇编是一种广泛应用于早期计算机系统中的汇编语言。

通过使用汇编语言编写程序,开发者可以利用底层硬件资源,实现更高效的程序运行。

在Dos汇编中,子程序调用是常见的程序设计技巧之一,可以将复杂的任务分解成若干个子任务,分别实现,并通过子程序调用的方式进行组合。

下面我将通过一个实例来展示Dos汇编中的子程序调用。

假设我们需要编写一个程序,实现两个数相加的功能,我们可以通过子程序进行实现。

首先,我们需要定义两个数:num1 db 10num2 db 20接下来,我们需要定义一个子程序,用于将两个数相加并将结果返回:add_numbers procmov ax, [num1]add ax, [num2]retadd_numbers endp在上面的代码中,我们使用mov指令将第一个数加载到寄存器ax中,并使用add指令将第二个数与ax中的值相加。

最后,使用ret指令将结果返回。

接下来,我们需要编写主程序,调用子程序并输出结果:main proccall add_numbersmov ah, 9lea dx, result_msgint 21hmov ah, 2mov dl, aladd dl, 30hint 21hmov dl, ahadd dl, 30hint 21hmov ah, 4Chint 21hmain endp在上面的代码中,通过使用call指令调用子程序add_numbers,并将结果保存在寄存器ax中。

然后,使用mov指令将结果输出到屏幕上。

最后,我们需要定义一个结果消息字符串,并在程序末尾调用dos的退出程序的中断,使程序正常退出:result_msg db "The result is: ", 0Dh, 0Ah, "$"通过编译和运行上述代码,我们可以实现两个数相加并将结果输出到屏幕上。

总结起来,Dos汇编中的子程序调用是一种重要的程序设计技巧,可以将复杂的任务进行分解,并通过子程序的调用进行组合实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

福建农林大学金山学院实验报告系:专业:计算机科学与技术年级: 08 姓名:学号:实验课程:汇编语言实验室号:_______ 实验设备号:实验时间:指导教师签字:成绩:实验四 DOS功能调用1.实验目的和要求1.学会DOS中关于显示功能调用指令的用法。

2.领会修改显存方法显示字符。

2.实验环境实验的硬件环境是:IBM—PC机及其兼容机实验的软件环境是:操作系统:DOS 2.0以上;调试程序:;文本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。

3.实验内容及实验数据记录1、输入一个字符,显示出来2、输入一个字符串,显示出来3、buf开始的3个的16位二进制数用十六进制数的形式显示出来(1)理解程序(2)输入程序,汇编,运行(在DOS状态下输入:文件名.EXE),观察结果。

(3)如果要分行显示,程序要如何修改?DATA SEGMENTBUF DW 4F59H, 56A8H, 0FF90HDATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DA TASTART: MOV AX, DA TAMOV DS, AXMOV SI, 0P: MOV BX, BUF[SI]MOV CH, 4L: MOV CL, 4ROL BX, CLMOV DL, BLAND DL, 0FHCMP DL, 10JB NEXTADD DL, 7NEXT: ADD DL, 30HMOV AH, 2INT 21HDEC CHJNZ LINC SIINC SICMP SI, 4JNA PMOV AH, 4CHINT 21HCODE ENDSEND START4、运行下列程序,在屏幕的第1行,会显示一个字符X,理解程序段STACK SEGMENTDB 128 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACKSTART: MOV AX,STACKMOV SS,AXMOV SP,128MOV AX,0B800HMOV ES,AXMOV AH,0 ;BIOS 10H的0号功能,设置80X25的彩色字符模式 MOV AL,03HINT 10HMOV AH,'X'MOV ES:[160*1+40*2],AHMOV AL,0MOV AH,4CHINT 21HCODE ENDSEND START5、显示*************************6、编写程序,统计字缓冲区中的20个数据的正数、负数、0的个数,并将统计结果以16进制形式显示出来。

4.算法描述及实验步骤1)直接调用DOS 1号功能即可,debug环境中a命令直接编辑代码写入内存如下指令MOV AH,01INT 21HMOV AH,4CINT 21H2)字符串的输入和显示,原以为在调用10号功能后需要调用9号显示功能,因此编辑代码如下DATA SEGMENTBUF DB 10DB ?DB 10 DUP(?);DB '$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,OFFSET BUFMOV AH,10INT 21H;MOV DX,OFFSET BUF+2;MOV AH,9;INT 21HMOV AH,4CHINT 21HCODE ENDSEND START3)3.1&3.2我们知道要将数以16进制的形式显示就必须找到其对应的字母ABCDEF的ASCII码,ASCII码48是数字0的开始也就是16进制中的30,而3AH开始至40H为7个常用符号的ASCII码值,从41H开始才是大写字母的ASCII码值,因此将所要转化的四位二进制数与10做比较,若小于10可直接加30H得到其对应的ASCII码,若大于等于10则应多加上7跳过7个符号ASCII 码得到其对应的16进制ASCII码以达到转换的目的即显示时打印其相应的ASCII码对应的字符。

3.3要达到题目要求的分行显示,从程序的跟踪可以看出在在取数时分为了两个情况,一个通过SI定位内存单元一次性取得一个16位二进制数,另一个是处理数据时循环移位取高四位数。

而要使得数据显示时换行只要在完成一个16位数据的转换后取下一个16位数时进行调用DOS 2号功能输出换行符ASCII码为10即0AH便可。

所以在源代码的基础上在两次INC S I前JNZ L间添加指令如下MOV DL,0AHMOV AH,2INT 21H4)可以看到程序首先通过MOV AX,0B800HMOV ES,AX在内存开辟了附加段,段首地址为B800H并通过MOV ES:[160*1+40*2],AH以便于向B80F0H(位于B8000H~BFFFFH彩色字符模式显示缓冲区)执行MOV AH,'X'写入字符‘X’,以达到直接改变显存内容显示。

5)5.1分析图案第1行打印了9列*********第2行打印了7列*******第3行打印了5列*****第4行打印了3列***第5行打印了1列*因此有两种思路,一是通过调用DOS 2号功能配合循环逐一打印字符'*',二是借鉴4)中的方法直接改变内存内容显示'*'。

但两种方法都用到了双重循环,外层循环控制行的打印,内层循环控制列的打印。

结合图案分析和循环数与行序号不然找到如下关系:a、1<=列数<= 2*当前行序号-1而行控制参是外层循环CX的变动,所以有b、6-CX=当前行序号。

5.2这里选择第二种以熟悉并掌握4)中的方法首先按a和b式,就有了偏移地址的计算式:160*(6-CX)+2*Y。

其中1<=Y<=2*CX-1,可通过内层循环实现。

5.3设计流程图开始开始CX<—5DH<—‘*’DL<—6DL<—DL-CLAL<—160AX<—DL*ALBH<—ALAL<—AL+BHES:[AL]<—DHAL<—2AX<—AL*CL CX<—5DH<—‘*’BX<—1 BL<—1 DL<—6DL<—DL-CLAL<—160DI<—DL*AXAX<—DL*ALAL<—2AX<—AL*CLAL<—2AX<—AL*BLAX<—AL*BLSI<—AXAX<—AX-1AL<—2H:H:L: L:N5.4因此有最初代码(错误) STACK S EGMENTDB 128 DUP(0)STACK ENDS CSEG SEGMENTASSUME CS:CSEG ,SS:STACKSTART: MOV AX,STACKMOV SS,AXAL<—AL-1BL<—BL+1 换行 BL<=AL CX<—CX-1 CX==0 结束 AX<—AL*BLES:[AL]<—DHBL<—BL+1BL<=AL换行CX<—CX-1CX==0结束YMOV SP,128MOV AX,0B800HMOV ES,AX ;段装入MOV CL,5 ;循环控制次数为5MOV CH,0 ;高位清零MOV DH,'*' ;初始打印字符MOV AX,0H: ;MOV BL,1 ;从1列开始显示MOV DL,6 ;行控制参数SUB DL,CL ;控制当前行MOV AL,160MUL DLMOV DI,AX ;保存行参数MOV AL,2MUL CLDEC AL(L:) MOV AL,2MUL BL ;控制当前列ADD AX,DI ;显存空间定位MOV ES:[AX],DH ;通过显存显示INC BL ;列打印自加;INC BX(L:) MOV AL,2MUL CLDEC AL;DEC AX;MOV SI,AXCMP BL,AL ;检验打印上限;CMP BX,SIJNA L ;未打印完当前行返回继续打印MOV DL,0AHMOV AH,2INT 21H ;打印完一行则换行LOOP H ;行打印循环MOV AH,4CHINT 21H ;退出到DOS界面CSEG ENDSEND START6)6.1分析题目要求有三,首先定义缓冲区存放20个有符号数据,其次对于正负数和零的统计可通过两次筛选来完成,最后是16进制的转换这在3)中已得以解决,因此有部分流程如下开始SI<—BUF[SI]>=0AX<—AX+1[SI]==0BX<—BX+1……这样在16进制转换时就有了一个取数的麻烦,为此考虑如果多开辟一个缓冲区BUF2来存放三个结果,下一个指针DI ,一来解决了这个问题,二来筛选时通过指针的跳动也同时使得统计结果的代码得以简化,所以就有了如下流程:DX<—DX+116进制转换并显示结果结束开始SI<—BUF1 DI<—BUF2 [SI]>=0 [DI]<—[DI]+1 [SI]==0 DI<—DI+1 DI<—DI+1……16进制转换并显示结果结束6.2按分析结合流程编辑代码如下DATA SEGMENTBUF1 DB 1,-3,5,26,0,6,0,24,-17,-10,-21,-5,33,48,0,32,0,10,44,-1BUF2 DB 3DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV CX,20MOV AL,0;MOV SI,OFFSET BUF1(1);MOV DI,OFFSET BUF2S: CMP [SI],ALJGE N EXTCMPJMP ADDD ;负数的个数NEXTCMP:INC DICMP [SI],ALJZ ADDD ;零的个数INC DIADDD: A DD BYTE PTR [DI],1 ;正数的个数INC SILOOP S ;统计个数MOV DI,OFFSET BUF2P: MOV BX,[DI];以下为16进制的转换并显示注释参考3)见附录MOV CH,4;L:MOV CL,4ROL BX,CL;ROL BL,CLMOV DL,BLAND DL,0FHCMP DL,10JB NEXTADD DL,7NEXT: ADD DL,30HMOV AH,2INT 21HDEC CHJNZ LMOV AH,0AH;MOV AH,2;MOV DL,0AHINT 21HINC DICMP DI,OFFSET BUF2+2JNA PMOV AH,4CHINT 21HCODE ENDSEND START5.调试过程2)按最初想法汇编程序得到了下面可怕的结果由此单步跟踪观察,d定位到输入的字符串所在查看,如图得知10号功能的调用并没出错,所以应该是9号的问题单步到9号功能调用指令,p执行后,发现在debug确实调用,并显示了字符串但在返回DOS界面却显示先前的一大堆乱码,所以认为是结束字符'$'的关系,于是修改字符缓冲区为如下BUF DB 10DB ?DB 10 DUP(?)DB '$'结果出现了如下情况,只要输入的字符少于9个都会缺失掉前面几个不唯一。

相关文档
最新文档