《微型计算机原理与接口技术》第6章-2013

上传人:考试不挂****2941... 文档编号:242939780 上传时间:2024-09-12 格式:PPT 页数:81 大小:820KB
返回 下载 相关 举报
《微型计算机原理与接口技术》第6章-2013_第1页
第1页 / 共81页
《微型计算机原理与接口技术》第6章-2013_第2页
第2页 / 共81页
《微型计算机原理与接口技术》第6章-2013_第3页
第3页 / 共81页
点击查看更多>>
资源描述
,微型计算机原理与接口技术,6.1,汇编源程序的编程格式,6.2,系统功能调用,6.3,程序设计举例,6.4 Windows,汇编语言编程初步,第,6,章 汇编语言程序设计,汇编源程序有两种编程格式,:,EXE,文件的编程格式:,只能生成扩展为,EXE,的可执行文件;,COM,文件的编程格式:,可以生成扩展为,COM,的可执行文件。,COM,文件的执行级别高于,EXE,文件,同名的,BAT(,批处理,),文件执行级别最低。,6.1,源程序的编程格式,EXE,文件的编程格式,此格式允许源程序使用多个逻辑段(包括据段、堆栈段、代码段及其它逻辑段);,在实模式下,每个逻辑段的目标块不超过,64K,;,适合编写大型程序。,.486,DATA SEGMENT USE16,;定义数据段,MESG DB,I AM A STUDENT!,$,DATA ENDS,CODE SEGMENT USE16,;定义代码段,ASSUME CS:CODE,DS:DATA,BEG: MOV AX,DATA,MOV DS,AX,LAST: MOV AH,9,MOV DX,OFFSET MESG,INT 21H,MOV AH,4CH,INT 21H,;返回,DOS,CODE ENDS,END BEG,COM,文件的编程格式,汇编语言要求此格式必须符合以下规定,:,源程序只允许使用一个逻辑段,即,代码段,不允许设置堆栈段,;,程序使用的数据,可以集中设置在代码段的开始或未尾,;,在代码段偏移地址,(,有效地址,),为,100H,的单元,必须是程序的启动指令,;,代码段目标块小于,64K,。,COM,文件的编程格式适合于编写中小型程序。,.486,CODE SEGMENT USE16,ASSUME CS:CODE,ORG 100H,BEG: JMP,START,MESG DB,HELLO,0DH,0AH,$,;,用户程序数据区,START:,MOV CX,10 ;,设置循环次数,LAST: MOV AH,9,MOV DX,OFFSET MESG,INT 21H ;,显示一行,HELLO,LOOP LAST ;,循环计数,MOV AH,4CH,INT 21H ;,返回,DOS,CODE ENDS,END BEG,6.2,系统功能调用,DOS,的,4,个组成部分中,IBMBIO.COM,和,IBMDOS.COM,是,DOS,系统的核心模块,IBMBIO.COM,为基本,I/O,设备处理程序,与,BIOS,一起完成数据输入和数据输出的基本操作,IBMDOS.COM,是磁盘文件管理程序;,一片大容量的,EPROM,或,FLASH,存储器,这两个模块均有若干子功能可以被用户程序调用,称为“,DOS,功能调用”和“,BIOS,功能调用”,(,系统功能调用,),高端,中断向量表,系统数据区,IBMBIO.COM,IBMDOS.COM,COMMAND.COM,低端,实地,址模,式,1MB,空间,键盘缓冲区,显示缓冲区等,用户程序通过,INT 21H,软中断指令调用,DOS,系统功能,调用模式如下,:,MOV AH,功能号,设置入口参数,INT 21H,分析出口参数,功能号:,代表一个不同功能的子程序,DOS,功能调用,调用模式:,MOV AH,功能号,设置入口参数,INT 21H,分析出口参数,DOS,功能调用,AH=?,执行,1,#,子程序,执行,2,#,子程序,IRET,21H,型中断服务程序,=1,=2,【,功能号,01H】,等待键入一个字符,有回显,响应,Ctrl_C,。,入口参数,:,无。,出口参数,:,AL,按键的,ASCII,码。若,AL,0,表明按键是功能键,光标键,需再次调用本功能,才能返回按键的扩展码。,调用方式:,MOV AH,,,1,INT 21H,DOS,功能调用,【,功能号,02H】,显示一个字符,响应,Ctrl_C,。,入口参数,:,DL,待显字符的,ASCII,码。,出口参数,:,无。,本功能在屏幕的当前位置显示一个字符,光标右移一格,如,果是在一行末尾显示字符,则光标返回下一行的开始格。,如果是在屏幕的右下角显示字符,光标返回时屏幕要上滚一行。,注意:,该功能要破坏,AL,寄存器的内容,。,DOS,功能调用,Eg,:,MOVDL , A,MOVAH , 2,INT21H,屏幕上显示一个字符,A,【,功能号,07H】,等待键入一个字符,无回显,不响应,Ctrl_C,。,入口参数,:,无。,出口参数,:,AL,按键的,ASCII,码,若,AL,0,需再次调用该项功能才能在,AL,中得到按键的扩展码。,【,功能号,08H】,等待键入一个字符,无回显,响应,Ctrl_C,。,入口参数,:,无。,出口参数,:,AL,按键的,ASCII,码,若,AL,0,需再次调用该项功能才能在,AL,中得到按键的扩展码。,【,功能号,09H】,显示字符串,响应,Ctrl_C,。,入口参数,:,DS:DX,字符串首地址,字符串必须以,$(,即,ASCII,码,24H),为结束标志,出口参数,:,无。,该项功能从屏幕当前位置开始,显示字符串,遇到结束标志,$,时停止,$,字符并不显示,注意:,9,号功能破坏,AL,寄存器的内容,DOS,功能调用,【,功能号,0AH】,等待键入一串字符送用户程序数据缓冲区。,入口参数:,DS:DX,指向放键入字符的缓冲区,缓冲区定义形式规定为:,缓冲区能容纳的字符个数,实际接收的字符个数,接收的字符,1,DOS,功能调用,程序员预置可容纳的字符个数,(,包括回车键,),0AH,功能写入,实际接收,的字符个数,(,不包括回车键,),数据缓冲区,BUF+0,+1,+2,.,+n,键入字符串的,实际存储区域,100,EG,:,BUF DB 100,DB,?,DB 100 DUP(?),DOS,功能调用,出口参数:,存放于缓冲区的字符串,以回车键结尾,调用方式,:,MOV AH,0AH,INT 21H,注意:,缓冲区定义的第二个字节由系统设置,其余,由用户定义;,若输入的字节数少于定义的字节数,缓冲区,其余字节补零;,若输入的字节数大于定义的字节数,后来输入,的字符丢弃且响铃警告。,DOS,功能调用,主板,EPROM,中固化有基本,I/O,系统程序,BIOS,它是最接近硬件的驱动程序,BIOS,中的许多子程序可被用户程序调用,调用这些子程序称为,BIOS,功能调用。,键盘接口电路,完成串,并,键盘电路,键盘中断处理程序,内存键盘,缓冲区,主板机,串行扫描码,并行,扫描码,键代码,用户程序执行,INT 16H,可访问键盘缓冲区,#,#,BIOS,功能调用,BIOS,功能调用模式,:,MOV AH,功能号,设置入口参数,INT,n,分析出口参数,其中,INT n,为软中断指令,n,为中断类型码,不同,n,的代表不同的设备驱动程序,BIOS,功能调用,【,功能号,00H】,读取键入的一个字符,无回显,响应,Ctrl_C,无,键入则等待。,入口参数,:,无。,出口参数,:,AL,键入字符的,ASCII,码。若,AL,0,则,AH,输入键,的扩展码。,【,功能号,01H】,查询键盘缓冲区。,入口参数,:,无。,出口参数,:, Z,标志,0,表示有键入,键代码仍留在键盘缓冲区中,此时,AL,键入字符的,ASCII,码,AH,键入字符的扩展码。,Z,标志,1,表示无键入,。,BIOS,功能调用,CRT(Cathode,Ray Tube,阴极射线管,),显示器是微机系统的输出设备。,PC,系列机可以配置单色显示器,或彩色显示器,显示适配器是显示器和系统总线之间的接口电路。适配器在主机箱的扩展槽中通过,9,芯插座和,CRT,显示器相连,显示适配器有,CRT,控制器、定时器、字符发生器、显示存储器等功能,BIOS,文本显示功能调用,80,列,25,行,40,列,25,行,1.,显示器工作方式,黑白,/,彩色,文本方式,黑白,/,彩色图形方式,文本方式,:,显示数字,字符,图形方式,:,显示点,由点(像点)组成图形,BIOS,文本显示功能调用,2.,显示存储区与显示屏,单显,8025,文本方式,彩显,8025,文本方式,0,页,1,页,2,页,3,页,B000,B800,B900,BA00,BB00,系统,RAM,(内存)部分空间被指定作为显示存储区,:0F9E,:0F9F,ASC,码,属性,.,ASC,码,属性,:0000,:0001,偶地址单元,奇地址单元,079,列,024,行,8025,文本方式,BIOS,文本显示功能调用,D7 D6 D5 D4 D3 D2 D1 D0,0,:,正常显示,1,:,闪烁显示,(,背景闪烁,),背景色,前景色,共,8,种背景色,16,种前景色,颜色的编码,请见教材,如,:,蓝底白字,属性字为,1FH,黑底红字,属性字,04H,3.,文本方式属性字,彩显属性字,:,BIOS,文本显示功能调用,4.,屏显的编程方法,DOS,功能调用,(,如,:2,#,9,#,),BIOS,功能调用,(0EH,#,13H,#,),直接对显示存储区进行写操作,5. BIOS,屏显功能调用的调用模式,MOV AH,功能号,预置入口参数,INT 10H,分析出口参数,BIOS,文本显示功能调用,【,功能号,00H】,设置屏幕显示方式,入口参数,:,AL,0 4025,黑白文本方式,AL,1 4025,彩色文本方式,AL,2 8025,黑白文本方式,AL,3 8025,彩色文本方式,出口参数,:,无。,【,功能号,02H】,预置光标位置,。,入口参数,:,BH,显示页号,DH,行号,DL,列号。,出口参数,:,无。,【,功能号,03H】,读取光标的当前位置,。,入口参数,:,BH,显示页号。,出口参数,:,CH,、,CL,光标顶部扫描线、低部扫描,线的行号。,DH,、,DL,光标在屏幕上的行、列号。,BIOS,文本显示功能调用,【,功能号,13H】,显示字符串,入口参数,:,AL,0,3,BH,显示页号,BL,属性字,(AL,0,、,1,时有效,),CX,串长度,DH,、,DL,字符串显示的起始行、列号,ES:BP,待显字符串首地址。,出口参数,:,无,BIOS,文本显示功能调用,注意:,13H,功能是唯一能显示彩色字符的子功能,例,:,在屏幕左上角显示,HELLO,黑底灰白字符,在屏幕中央显示,I AM A STUDENT,红底白字,思路,:,显示,HELLO,用,DOS,功能,#,要求待显字符串放在数据段,串尾用,$,作结束符,显示,I AM A STUDENT,用,BIOS 13H,功能,它要求待显字符串在附加段,这意味着源程序至少要有三个逻辑段,我们令数据,段与附加段“重叠”,这样源程序仅设置两个逻辑段,即可。,BIOS,文本显示功能调用,. 486,DATA SEGMENT USE16,MESG1 DB HELLO $,MESG2 DB I AM A STUDENT,LL = $,MESG2,DATA ENDS,CODE SEGMENT USE16,ASSUME CS:CODE,ASSUME DS:DATA,ASSUME ES:DATA,BEG: MOV AX, DATA,MOV DS, AX,MOV ES, AX,MOV AX, 0003H,INT 10H,MOV AH, 9,MOV DX,OFFSET MESG1,INT 21H,MOV AX, 1301H,MOV BH, 0,MOV BL, 01001111B,MOV CX, LL,MOV DH,12,MOV DL, (80-LL)/2,MOV,BP, OFFSET MESG2,INT 10H,MOV AH, 4CH,INT 21H,CODE ENDS,END BEG,源程序清单:,6.3,程序设计举例,用汇编语言编程属结构化程序设计,分析题意,确定算法,根据算法画出程序框图,根据框图编写程序,上机调试程序,执行程序,按照自上而下的设计方法,设计一个汇编程序的步骤:,在程序设计中,程序的,效率,是程序设计好坏的重要指标,特别是在汇编程序设计中,其特点要求我们对程序运行的效率加以重点关注。对于汇编语言程序我们可以考虑以下几方面作为程序运行效率的衡量标准:,程序的执行时间。每一条语句都有自己的执行时间,在,80X86,指令手册中每条指令的运行时间都有明确的定义。根据这些时间,我们可,算出程序的运行时间。,程序所占有的字节数。有一些计算机系统,可能应用于工业控制或工,业过程检测,不需要过多的硬件资源,比如存储单元,所以就要求我,们的程序有尽可能少的字节数,以满足缩减硬件资源的要求。,程序的语句行数。,顺序程序,分支程序,循环程序,从结构上来讲,一般的汇编程序可分为:,子程序,宏指令,Eg,:,从键盘输入一个字符并存储到字节变量,BUF,单元中,.,分析:,用,DOS,功能调用完成键入,输入的字符保存在,AL,寄存器中,将,AL,中的内容存到定义在数据段的变量,BUF,所指单元中,顺序程序设计,顺序程序设计是程序设计中最简单的设计方法,它是将确定好的算法或逻辑关系以正确的语句和正确的逻辑关系有序地编写出来,形成程序。,.486,DATA SEGMENT USE16,BUF DB,?,DATA ENDS,源程序清单:,CODE SEGMENT USE16,ASSUME CS : CODE , DS : DATA,BEG:,MOV AX , DATA,MOV DS , AX,MOV AH , 1,INT 21H,;AL=,键入字符的,MOV BUF , AL,ASIIC,码,MOV AH , 4CH,INT 21H,CODE ENDS,END BEG,在很多实际问题中,通常要根据不同的情况,执行不同的程序块或语句,这就需要在设计程序时使用运算后的结果,依据一定的条件进行相应的判断,根据判断结果的真或假,去运行相应的程序或语句。,例 :有一数学函数如下:,1 x0,y=,f(x,)= 0 x=0,-1 x0,Y=0,Y=1,Y= -1,Y,Y,N,N,框图如下,开始,分支程序设计,转移指令可用来实现分支程序设计,分支程序分三种:,简单分支,复合分支,多分支,分支程序设计,简单分支,即两路分支,该分支程序结构为:,条件满足否?,程序段,1,程序段,2,Y,N,复合分支,判断的条件是复合条件,称复合判断,。 复合分支程序结构为:,条件,1,和条件,2.,满足否?,程序段,1,程序段,2,Y,N,Eg,:,某科室,9,人,统计月收入在,800900,间的人数,并用十进制数显示,分析:月收入是无符号数,对一批数处理应该用间址。,数轴,:,N1 (800) N2 (900),复合分支,多分支,判断条件后有多个出口,判断一次只能选择一个分支。,多,分支程序结构为:,1,条件属哪种,情况?,程序段,1,程序段,n+m,.,.,程序段,n,n,n+m,循环程序的组成:,循环准备,循环体,循环控制,循环程序设计,1.,循环准备,:,用于设置开始循环时,循环体所处的初始状态,如循环变量初值,循环体中用到的数据和地址指针等。,2.,循环体,:,重复运行的部分,其中还包含了工作部分和循环控制部分。工作部分进行相应的操作,而循环控制部分则保证在不满足循环条件时,跳出循环。,3.,循环结束条件,:,在循环体中包括了循环结束条件运算部分。每循环一次除了工作部分进行相应的操作外,循环条件部分还要通过运算,得出当前循环的状态,以便在适当的条件下结束循环。,1.,循环程序的结构,Y,预置循环次数,其他准备工作,循环体,循环减,1,计数,退出循环,结果为,0?,N,(a),单循环结构,(b),双循环结构,结果为,0?,循环体,内循环减,1,计数,结果为,0?,外循环减,1,计数,退出循环,预置外循环次数,其他准备工作,预置内循环次数,其他准备工作,N,N,Y,Y,循环程序设计,.486,DATA SEGMENT USE16,SUM DW ?,DATA ENDS,CODE SEGMENT,ASSUME CS:CODE, DS:DATA,BEGIN:,MOVAX,DATA,MOV DS,AX,MOV CX, 10,MOV AX, 0,该程序是一个以计数器为循环条件的循环结构,是循环中常见的结构之一。,例:求,1-10,的累加和,AGAIN: ADD AX, CX,LOOP AGAIN,MOV SUM, AX,MOV AH,4CH,INT 21H,CODE ENDS,END BEGIN,循环程序设计,DELAY: PUSH AX,PUSH DX,MOV DX, 3FFH,TIME1: MOV AX, 0FFFFH,TIME2: NOP,DEC AX,JNE TIME2,DEC DX,JNE TIME1,POP DX,POP AX,RET,在循环中,多重循环也是程序设计中常用的结构之一,多重循环通常有多个循环变量。在多重循环中,各自的循环变量要明确,否则将导致循环体的混乱。以两重循环为例,外层循环的循环次数为,N,,内层循环次数为,M,,则内层体被运行了,NM,次。,多重循环的程序设计,例,:,延时子程序,子程序,:,相对独立的程序,当程序中要多次完成某一操作时,为了简化整体程序,增强程序可读性,常常把,“,完成某一操作,”,设计成一个子程序,供调用。, 子程序用,PROC/ENDP,定界, 子程序分为:段内子程序、段间子程序、无参数子程序、有参数子程序, 在子程序设计中,要明确地定义出这个子程序的,入口参数,和,出口参数,,使调用者能方便地使 用子程序。,在子程序中在合理地,保存主程序和子程序都用到的寄存器和存储单元,,以使主程序能正确地运行。,子程序及其调用,入口和出口参数传送主要有两种方式:, 利用寄存器传送参数, 利用堆栈传送参数, 利用某个内存单元传送参数,无参数宏指令,有参数宏指令,宏指令与宏调用,无参数宏指令的定义语句格式,:,宏指令名称,MACRO,宏体,ENDM,宏指令的定义,有参数宏指令的定义语句格式,:,宏指令名称,MACRO,哑元表,宏体,ENDM,MACRO/ENDM,是宏体的定界语句,宏体经过定义之后,宏指令的名称就是一条,宏指令,可以像,CPU,指令那样去使用,在代码段中放置一条宏指令就是,宏调用,编译时汇编程序用宏体替换宏指令,宏指令的定义与调用,一串用逗号间隔的形式参数表,哑元是没有值的符号,用它,(,们,),代表宏体中出现的操作码助记符、操作数,(,立即数、寄存器操作数、内存操作数,),调用时,宏指令行,要有和哑元一一对应的实元表,实元可以是立即数、寄存器操作数以及没有,PTR,运算符的内存操作数,有参宏指令的哑元表,无参数宏指令的定义,:,宏指令名,MACRO,宏体,ENDM,有参数宏指令的定义,:,宏指令名,MACRO,哑元表,带哑元的,宏体,ENDM,宏指令与宏调用,上述宏体的功能:令光标返回到下一行的开始格,CRLF,是宏指令的名称。宏体经过定义之后,宏指令的名称,CRLF,就是一条宏指令,在代码段中放置一条,CRLF,就是宏调用。,例如,: CRLF MACRO,MOV AH,0EH,MOV AL,0DH,INT 10H,MOV AL,0AH,INT 10H,ENDM,例如,: MOV AH,2,MOV DL,A,INT 21H,CRLF,编译时汇编程序用宏体替换宏指令,因此执行,CRLF,后,光标返回下一行始格。,宏指令与宏调用,解决方法:,LOCAL,伪指令,格 式,:,LOCAL,标号名表,问题:,如果宏体中有分支、循环,必然有标号,两次以上调用这样的宏指令必然出现标号重复定义的错误。,怎么解决?,宏指令与宏调用,说明,:,LOCAL,伪指令要放在宏定义之中,是,MACRO,定界语句以下的第一条语句,标号名表,是用逗号间隔的一串标号名,它们是宏体中出现的,所有标号的集合,宏体中出现的标号称为,局部标号,使用,LOCAL,伪指令后的局部标号允许和源程序中的其它标号、变量重名,宏指令中的,LOCAL,伪指令,.486,CMPDISP MACRO NN,LOCAL LAST,NEXT,MOV DL,0,;DL,清,0,LAST: CMP BEN,NN,;,比较,JC NEXT,;BEN,NN,转,INC DL,;DL,加,1,SUB BEN,NN,;BEN-NNBEN,JMP LAST,NEXT: ADD DL,30H,MOV AH,2,INT 21H,;,显示,ENDM,宏指令中的,LOCAL,伪指令,. 486,CMPDISP MACRO NN,LOCAL LAST, NEXT,MOV DL,0,;DL,清,0,LAST: CMP BEN, NN,;,比较,JC NEXT,;BEN,NN,转,INC DL,;DL,加,1,SUB BEN, NN,JMP LAST,NEXT: ADD DL, 30H,MOV AH,2,INT 21H,;,显示,ENDM,CODE SEGMENT USE16,ASSUME CS:CODE,BEN DB 10101110B,;=174,BEG: CMPDISP 100,CMPDISP 10,CMPDISP 1,MOV AH,4CH,INT 21H,CODE ENDS,END BEG,共同点:,宏指令与子程序都可以简化程序设计,增强程序的可读性,不同点:,子程序调用是由,CPU,完成的,宏指令调用是在汇编过程中由汇编程序完成的,子程序调用可以减小目标程序的体积,宏指令则不能,计算机内存很大,调用有参数的宏指令比调用有参数的子程序方便的多,因此在设计大型程序时,宏指令的使用非常广泛,宏指令与子程序的异同,汇编程序设计举例,代 码 转 换,代码转换,常见的代码转换有:,二进制数显示,二进制数十进制数显示,二进制数十六进制数显示,BCD,码数二进制数,代码转换,代码转换,A,二进制数显示,例,.,把键盘输入的一位数,(0,9),转换成等值二进数显示,显示的格式要求如下:,Please Enter,:,ERROR!,Please Enter,:,9,=00001001B,思路:,键盘缓冲区中是键入字符的,ASC,码。,0,9,的,ASC,码为,30H,39H,。,二进制数每一位代码的判断:,本程序采用两种格式设计源程序:,一种是,EXE,文件编程格式,,另一种是,COM,文件编程格式。,RCL,0,SAL,ROL,CF,CF,CF,代码转换,程序框图:,AL-30HBL,=,屏幕,8CX,0,屏幕,1,屏幕,CX-1 CX,B,屏幕,返回,DOS,N,N,给出操作提示,键盘输入,AL,AL=,0,9,?,CF=?,CX=0?,BL,左移一位,Y,显示错误信息,Y,0,1,. 486,DATA SEGMENT USE16,MESG1 DB Please Enter ! ,0DH,0AH,$,MESG2 DB -Error ! $ ,DATA ENDS,CODE SEGMENT USE16,ASSUME CS:CODE,DS:DATA,BEG: MOV AX,DATA,MOV DS,AX,MOV AH,9,MOV DX,OFFSET MESG1,INT 21H,;,显示操作提示,MOV AH,1,INT 21H,;,等待键入,CMP AL,3AH,J,NC,ERROR,;,9,转,CMP AL,30H,EXE,格式程序清单,J,C,ERROR,;,0,转,SUB AL,30H,MOV BL,AL,;BL=0,9,的二进制数,MOV AH,2,MOV DL,=,INT 21H,CALL DISP,MOV AH,2,MOV DL,B,INT 21H,JMP EXIT,ERROR: MOV AH,9,LEA DX, MESG2,INT 21H,;,显示错误信息,EXIT:MOV AH,4CH,INT 21H,;-,DISP PROC,;,显示,BL,中的二进制数,MOV CX,8,LAST: MOV DL,0,RCL BL,1,JNC NEXT,MOV DL,1,NEXT: MOV AH,2,INT 21H,LOOP LAST,RET,DISP ENDP,CODE ENDS,END BEG,EXE,格式程序清单,. 486,CODE SEGMENT USE16,ASSUME CS:CODE,ORG 100H,START: JMP BEG,MESG1 DB Please Enter ! ,0DH,0AH,$,MESG2 DB -Error ! $ ,BEG: MOV AH,9,MOV DX,OFFSET MESG1,INT 21H,;,显示操作提示,MOV AH,1,INT 21H,;,等待键入,CMP AL,3AH,JNC ERROR,;,9,转,CMP AL,30H,JC ERROR,;,0,转,SUB AL,30H,MOV BL,AL,;BL=0,9,的二进制数,MOV AH,2,MOV DL,=,INT 21H,CALL DISP,MOV AH,2,MOV DL,B,INT 21H,JMP EXIT,ERROR: MOV AH,9,LEA DX, MESG2,INT 21H,;,显示错误信息,EXIT: MOV AH,4CH,INT 21H,CODE ENDS,END BEG,COM,格式程序清单,;-,DISP PROC,;,显示,BL,中的二进制数,MOV CX,8,LAST: MOV DL,0,RCL BL,1,JNC NEXT,MOV DL,1,NEXT: MOV AH,2,INT 21H,LOOP LAST,RET,DISP ENDP,CODE ENDS,END START,COM,格式程序清单,二,.,二进制数十六进制数显示,算法:,四位二进制数,等值的十六进制数,十六进制数,ASC,码,算法,00001001,10101111,09,AF,30H39H,41H46H,四位二进制数,+30H,=,等值的十六进制,数,ASC,码,四位二进制数,+37H,=,等值的十六进,制数,ASC,码,代码转换,编程技巧:,8,位二进制数,截取高,4,位,显示,显示,截取低,4,位,XXXX,XXXX,XXXX,0 0 0 0,XXXX,0 0 0 0,16,进制数,ASC,码,16,进制数,ASC,码,代码转换,例,.,设从,BNUM,单元开始,有,4,个,16,位的二进制数,要求,把它们转换成,16,进制数,并送屏幕显示。,程序清单,. 486,DATA SEGMENT USE16,BNUM DW 0001001000110100B,;1234H,DW 0101011001111000B,;5678H,DW 0001101000101011B,;1A2BH,DW 0011110001001101B,;3C4DH,BUF DB 4 DUP(?), H $,;,输出缓冲区,COUNT DB 4,DATA ENDS,CODE SEGMENT USE16,ASSUME CS:CODE, DS:DATA,代码转换,BEG: MOV AX,DATA,MOV DS,AX,MOV CX,4,MOV BX,OFFSET BNUM,AGA: MOV,DX,BX,SAL EDX,16,CALL N2_16ASC,MOV AH,9,MOV DX,OFFSET BUF,INT 21H,;,显示一个,16,进数,ADD BX,2,;,地址加,2,LOOP AGA,MOV AH,4CH,INT 21H,;,二进数十六进数,ACSII,码,N2_16ASC PROC,MOV SI,OFFSET BUF,;,输出缓冲区地址,SI,MOV COUNT,4,LAST:,ROL EDX,4,AND DL,0FH,CMP DL,10,JC NEXT,ADD DL,7,NEXT: ADD DL,30H,MOV SI,DL,INC SI,;,地址加,1,DEC COUNT,;,计数,JNZ LAST,RET,N2_16ASC ENDP,CODE ENDS,END BEG,EXE,格式程序清单,三,.BCD,码二进制数,算法:设,4,位,BCD,码数列为,:,N3 N2 N1 N0,,,等值二进制数,=N31000+N2100+N110+N0,=(010+N3)10+N2)10+N1)10+N0,编程考虑:,4,位,BCD,码最大为,9999H,等值的二进制数最大为,16,位,(,超过,8,位,),,而且,D,15,位肯定为,0,分离出,BCD,千位,N3,百位,N2,,十位,N1,个位,N0,设计一个,AX,10+BX AX,的子程序供调用,首次调用时,令,AX=0,BX=N3,共调用,4,次,则,AX,中即为等值的二进制数。,例,.4,位,BCD,码数二进制数显示,代码转换, 486,CODE SEGMENT USE16,ASSUME CS:CODE,NUM DW 4567,H,;BCD,码表示,BEG: MOV CX,4,;4,次调用,MOV AX,0,AGA: R,O,L NUM, 4,MOV BX,NUM,AND BX,000FH,IMUL,AX,10,ADD AX,BX,LOOP AGA,显示,AX,中的二进制数,返回,DOS,CODE ENDS,END BEG,本例数据放在代码段!,本例:,因为,AX,的,D,15,=0,是正的有符号数,所以可用,IMUL,指令,EXE,格式程序清单,AX10+BXAX,四,.,二进制数十进制数,方法,:,比较法,恢复余数法,除,除权值求商法,8,位二进制数最大为,11111111,,等值的,十,进制数为,255,,,比较法的关键:,判断某二进制数,(,假设为,BEN,单元的内容,),包含几个,100,,几个,10,,几个,1,8,位二进制数十进制数,比较法:,DL+1DL,(BEN)-10BEN,(BEN)=100?,N,Y,(BEN)=10?,N,Y,0 DL,DL+1DL,(BEN)-100BEN,DL+30H,屏幕,0DL,DL+30H,屏幕,(BEN)+30H,屏幕,返回,DOS,代码转换,. 486,CMPDISP MACRO NN,LOCAL LAST, NEXT,MOV DL,0,;DL,清,0,LAST: CMP BEN, NN,;,比较,JC NEXT,;BEN,NN,转,INC DL,;DL,加,1,SUB BEN, NN,JMP LAST,NEXT: ADD DL, 30H,MOV AH,2,INT 21H,;,显示,ENDM,CODE SEGMENT USE16,ASSUME CS:CODE,BEN DB 10101110B,;=174,BEG: CMPDISP 100,CMPDISP 10,CMPDISP 1,MOV AH,4CH,INT 21H,CODE ENDS,END BEG,EXE,格式程序清单,2.,8,位二进制数十进制数,恢复余数法(请自学),3.,8,位二进制数十进制数,,“,除权值求商,”,的算法分析,把,11110101,B,十进制数,245,算法:,依次用权值,100,10,1,去除上次的余数,直到余数为,0,时停止。,每次除法所得的商数顺序排列,即为十进制数。,1 1 1 1 0 1 0 1,1100100,1 1 0 0 1 0 0,1 0 1 1 0 1,1 02,权值,(100),10,1 0 1 5,1 0 1,1 0 1,0,余数为,0,时止,1,权值,(1),1 0 0 4,1 0 1 1 0 1,1 0 1 0,1 0 1,1010,权值,(10),10,代码转换,例,.,将,NUM,单元中的,16,位二进制数,转换成十进制数显示。,思路:,16,位二进制数:最大为,1,1,,其等值的十进制数为,65535,,故应判断,NUM,单元的数包含几个,10000,,几个,1000,,几个,100,,几个,10,,几个,1,设计一个,XX,YY,并显示商值的宏指令供调用,,XX,为,32,位,,YY,为,16,为二进制数。,DX,AX,为被除数, 486,DIVIDE MACRO XX,YY,MOV AX,XX,MOV DX,0,MOV CX,YY,;CX,为除数,DIV CX,;AX=,商,且,1010B,DX=,余数,MOV AH,0EH,ADD AL,30H,INT 10H,ENDM,CODE SEGMENT USE16,ASSUME CS:CODE,NUM DW 65530,;,汇编后为二进制数,BEG: DIVIDE NUM, 10000,DIVIDE DX, 1000,本题在代码段中设置数据,这是,COM,格式?,EXE,格式?,如果改为:,BEG: MOV BX,OFFSET NUM,DIVIDE BX,10000,是错误的,为什么?,DIVIDE DX, 100,DIVIDE DX, 10,DIVIDE DX, 1,MOV AH, 4CH,INT 21H,CODE ENDS,END BEG,显示一位商值,不能,颠倒,分析:,应写成,:,DIVIDE CS:BX,10000,EXE,格式程序清单,4. 8,位二进制数十进制数,,“,除十取余,”,的算法分析,把,11110101,十进制数,245,算法:,N,被,(10),10,除,商再被,(10),10,除,,直到商数为,0,时止。,每次所得的余数按倒序方式排列显示。,编程技巧:,每次除法的余数栈,,除法结束后,再从堆栈中依次弹出余数,+30H,屏。,1 1 0 0 0,1 1 1 1 0 1 0 1,1 0 1 0,1 0 1 0,1 0 1 0,1 0 1,5,1010,即,(10),10,1 0,1 1 0 0 0,1 0 1 0,1 0 0,4,1010,0,商为,0,时止,1 0,0 0,1 0,2,1010,8,位,32,位二进制数转换成十进制数,通用的除法求余框图,:,(,书程序,自学,),设,N,为待转换的,8,位,32,位二进制数,EAX=,商,,EDX=,余数,,且余数肯定,1010B,统计除法的次数,CX=0?,弹出余数,+30H ,显示,CX-1 CX,N EAX,除数,1010B EBX,0 CX,计数器,0 EDX,(EDX,EAX),EBX,余数堆栈,CX+1 CX,商为,0,?,转换完毕,Y,Y,N,N,. 486,CMPDISP MACRO NN,LOCAL LAST, NEXT,MOV DL,0,;DL,清,0,LAST: CMP BEN, NN,;,比较,JC NEXT,;BEN,NN,转,INC DL,;DL,加,1,SUB BEN, NN,JMP LAST,NEXT: ADD DL, 30H,MOV AH,2,INT 21H,;,显示,ENDM,CODE SEGMENT USE16,ASSUME CS:CODE,BEN DB 10101110B,;=174,BEG: CMPDISP 100,CMPDISP 10,CMPDISP 1,MOV AH,4CH,INT 21H,CODE ENDS,END BEG,EXE,格式程序清单,.486,CODE SEGMENT USE16,ASSUME CS:CODE,BEN DB 10101110B,;=174,BEG: MOV BL,100,CALL CMPDISP,MOV BL,10,CALL CMPDISP,MOV BL,1,CALL CMPDISP,MOV AH,4CH,INT 21H,CMPDISP PROC,MOV DL,0,;DL,清,0,LAST: CMP BEN,BL ;,比较,JC NEXT,;BEN,BX,转,INC DL,;DL,加,1,SUB BEN,BL,;BEN-BXBEN,JMP LAST,NEXT: ADD DL,30H,MOV AH,2,INT 21H,;,显示,RET,CMPDISP ENDP,CODE ENDS,END BEG,EXE,格式程序清单,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!