




已阅读5页,还剩94页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6 1汇编源程序的编程格式6 2系统功能调用6 3程序设计举例6 4Windows汇编语言编程初步 第6章汇编语言程序设计 汇编源程序有两种编程格式 EXE文件的编程格式 只能生成扩展为EXE的可执行文件 COM文件的编程格式 可以生成扩展为COM的可执行文件 COM文件的执行级别高于EXE文件 同名的BAT 批处理 文件执行级别最低 6 1源程序的编程格式 EXE文件的编程格式 此格式允许源程序使用多个逻辑段 包括据段 堆栈段 代码段及其它逻辑段 在实模式下 每个逻辑段的目标块不超过64K 适合编写大型程序 486DATASEGMENTUSE16 定义数据段MESGDB IAMASTUDENT DATAENDSCODESEGMENTUSE16 定义代码段ASSUMECS CODE DS DATABEG MOVAX DATAMOVDS AXLAST MOVAH 9MOVDX OFFSETMESGINT21HMOVAH 4CHINT21H 返回DOSCODEENDSENDBEG EXE文件的内存映象 磁盘上的EXE文件包括两部分 装入模块和重定位信息DOS装载EXE文件时 根据重定位信息完成装入模块的重定位 同时 重定位信息被丢弃 DOS在同一内存块的用户程序上方 低地址处 偏移地址为00H FFH的单元处自动生成一个256字节的数据块 称为程序段前缀 PSP DOS自动使DS ES 存放PSP的段基址 使CS IP指向用户程序的启动地址 INT20H 数据段 代码段 堆栈段 DS ES CS IP SS SP 注 DOS把EXE文件调入内存后 自动给SS SP赋初值 程序中给SS SP赋初值的指令可省略 PSP 256字节 用户程序 COM文件的编程格式 汇编语言要求此格式必须符合以下规定 源程序只允许使用一个逻辑段 即代码段 不允许设置堆栈段 程序使用的数据 可以集中设置在代码段的开始或未尾 在代码段偏移地址 有效地址 为100H的单元 必须是程序的启动指令 代码段目标块小于64K COM文件的编程格式适合于编写中小型程序 486CODESEGMENTUSE16ASSUMECS CODEORG100HBEG JMPSTARTMESGDB HELLO 0DH 0AH 用户程序数据区START MOVCX 10 设置循环次数LAST MOVAH 9MOVDX OFFSETMESGINT21H 显示一行HELLOLOOPLAST 循环计数MOVAH 4CHINT21H 返回DOSCODEENDSENDBEG COM文件的内存映象 磁盘上的COM文件没有重定位信息 体积比EXE文件小 DOS装载COM文件时 在同一内存块的用户程序上方 低地址处 偏移地址为00H FFH的单元处自动生成一个PSP 然后从偏移地址100H处开始存放用户程序 DOS自动使CS DS ES SS 存放PSP的段基址 使IP 100H SP FFFEH INT20H 代码段 堆栈段 CS DSES SS IP FFFEH SP PSP 256字节 用户程序 64K 256 返回DOS的其它方法EXE格式文件可以借用PSP首单元的INT20H返回DOS执行完用户程序后 使CS IP指向PSP的首单元 DOS在装载EXE文件时将DS指向该单元 故可采取措施 把执行程序放在一个远过程中 用户程序在给SS SP赋初值后 DS赋值前 用三条指令把PSP的首单元的物理地址 DS 0000H 压入堆栈 即 PUSHDSMOVAX 0PUSHAX返回DOS时 执行RET指令 栈顶四个字节弹出分别送CS和IP 即可执行INT20H指令 COM格式文件可直接执行INT20H指令 486 方式定义DATASEGMENTUSE16 定义数据段MESGDB HELLO 0DH 0AH DATAENDSCODESEGMENTUSE16 定义代码段ASSUMECS CODE DS DATA SS STACK 说明段约定MAINPROCFAR 为什么定义成远过程 BEG PUSHDSMOVAX 0PUSHAXMOVAX DATAMOVDS AXLAST MOVAH 9MOVDX OFFSETMESGINT21H 显示显示一行HELLORET 返回DOSMAINENDPCODEENDSENDBEG 汇编结束 源程序清单 6 2系统功能调用 DOS的4个组成部分中IBMBIO COM和IBMDOS COM是DOS系统的核心模块IBMBIO COM为基本I O设备处理程序 与BIOS一起完成数据输入和数据输出的基本操作IBMDOS COM是磁盘文件管理程序 这两个模块均有若干子功能可以被用户程序调用 称为 DOS功能调用 和 BIOS功能调用 系统功能调用 PC DOS的模块结构 DOS Shell DOS Kernel DOS BIOS 1 命令处理程序 命令解释 外部命令装入等 2 DOS内核程序MSDOS SYS 包括文件管理 磁盘管理 DOS功能调用等 该模块以系统功能调用的方式供用户使用 INT21H 3 DOS基本输入输出程序模块IO SYS 管理输入输出设备 显示器 键盘 打印机 串行通信设备等 的驱动 并转换为ROM BIOS固件的设备控制程序的请求 DOS Shell DOS Kernel DOS BIOS DOS命令 ROM BIOS 显示器卡 盘控制卡 串行口卡 键盘接口 打印机卡 应用层 DOS服务层 ROM BIOS服务层 硬件控制层 应用程序 INT10H INT13H INT14H INT16H INT17H INT21H 高端 用户程序通过INT21H软中断指令调用DOS系统功能 调用模式如下 MOVAH 功能号设置入口参数INT21H分析出口参数功能号 代表一个不同功能的子程序 DOS功能调用 调用模式 MOVAH 功能号设置入口参数INT21H分析出口参数 DOS功能调用 功能号01H 等待键入一个字符 有回显 响应Ctrl C 入口参数 无 出口参数 AL 按键的ASCII码 若AL 0 表明按键是功能键 光标键 需再次调用本功能 才能返回按键的扩展码 调用方式 MOVAH 1INT21H DOS功能调用 功能号02H 显示一个字符 响应Ctrl C 入口参数 DL 待显字符的ASCII码 出口参数 无 本功能在屏幕的当前位置显示一个字符 光标右移一格 如果是在一行末尾显示字符 则光标返回下一行的开始格 如果是在屏幕的右下角显示字符 光标返回时屏幕要上滚一行 注意 该功能要破坏AL寄存器的内容 DOS功能调用 Eg MOVDL A MOVAH 2INT21H屏幕上显示一个字符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功能调用 Eg 在屏幕上显示 IAMASTUDENT 分析 将 IAMASTUDENT 定义在数据段 并在 后加一个字符 利用9号DOS功能调用 即可完成显示 DOS功能调用 486DATASEGMENTUSE16 定义数据段MESGDB IAMASTUDENT DATAENDSCODESEGMENTUSE16 定义代码段ASSUMECS CODE DS DATABEG MOVAX DATAMOVDS AXLAST MOVAH 9MOVDX OFFSETMESGINT21HMOVAH 4CHINT21H 返回DOSCODEENDSENDBEG 源程序清单 功能号0AH 等待键入一串字符送用户程序数据缓冲区 入口参数 DS DX指向放键入字符的缓冲区缓冲区定义形式规定为 DOS功能调用 EG BUFDB100DB DB100DUP DOS功能调用 出口参数 存放于缓冲区的字符串 以回车键结尾调用方式 MOVAH 0AHINT21H注意 缓冲区定义的第二个字节由系统设置 其余由用户定义 若输入的字节数少于定义的字节数 缓冲区其余字节补零 若输入的字节数大于定义的字节数 后来输入的字符丢弃且响铃警告 DOS功能调用 例 人机会话程序 Limei Y N Whatisyourname 1 会话内容及设计思路 Linei 前者是程序给出的询问信息 后者是用户键入的回答 N 程序复制的姓名和回答提示 Limei 再次问答 Linei Y N Whatisyourname Y 问题提出 如何设置程序运行所需的数据 方法如下 数据设置在程序的数据段 程序运行时通过人机会话临时键入 程序装入时通过命令行参数给出本例学习前两种方法 并以此学习DOS功能调用 DOS功能调用 2 框图 N DOS功能调用 DATASEGMENTUSE16MESG1DB0DH 0AHDB Whatisyourname MESG2DB Y N BUFDB30DB DB30DUP DATAENDSCODESEGMENTUSE16ASSUMECS CODE DA DATABEG MOVAX DATAMOVDS AXAGAIN MOVAH 9MOVDX OFFSETMESG1INT21H 询问姓名MOVAH 0AHMOVDX OFFSETBUFINT21H 接收键入字符串MOVBL BUF 1MOVBH 0 486 实际键入的字符个数 BXMOVSI OFFSETBUF 2MOVBYTEPTR BX SI 用 作为串结束符MOVAH 2MOVDL 0AHINT21H 光标下移一行MOVAH 9MOVDX OFFSETBUF 2INT21H 复制键入的字符串MOVAH 9MOVDX OFFSETMESG2INT21H 给出认可信息MOVAH 1INT21H 等待键入CMPAL Y 比较JNEAGAINMOVAH 4CHINT21H 返回DOSCODEENDSENDBEG 源程序清单 主板EPROM中固化有基本I O系统程序 BIOS 它是最接近硬件的驱动程序 BIOS中的许多子程序可被用户程序调用 调用这些子程序称为BIOS功能调用 BIOS功能调用 BIOS功能调用模式 MOVAH 功能号设置入口参数INTn分析出口参数其中INTn为软中断指令 n为中断类型码不同n的代表不同的设备驱动程序 BIOS功能调用 功能号00H 读取键入的一个字符 无回显 响应Ctrl C 无键入则等待 入口参数 无 出口参数 AL 键入字符的ASCII码 若AL 0 则AH 输入键的扩展码 功能号01H 查询键盘缓冲区 入口参数 无 出口参数 Z标志 0 表示有键入 键代码仍留在键盘缓冲区中 此时AL 键入字符的ASCII码 AH 键入字符的扩展码 Z标志 1 表示无键入 BIOS功能调用 CRT CathodeRayTube阴极射线管 显示器是微机系统的输出设备 PC系列机可以配置单色显示器 或彩色显示器显示适配器是显示器和系统总线之间的接口电路 适配器在主机箱的扩展槽中通过9芯插座和CRT显示器相连显示适配器有CRT控制器 定时器 字符发生器 显示存储器等功能 BIOS文本显示功能调用 文本方式 显示数字 字符图形方式 显示点 由点 像点 组成图形 BIOS文本显示功能调用 2 显示存储区与显示屏 系统RAM 内存 部分空间被指定作为显示存储区 BIOS文本显示功能调用 3 文本方式属性字彩显属性字 BIOS文本显示功能调用 4 屏显的编程方法 DOS功能调用 如 2 9 BIOS功能调用 0EH 13H 直接对显示存储区进行写操作 5 BIOS屏显功能调用的调用模式MOVAH 功能号预置入口参数INT10H分析出口参数 BIOS文本显示功能调用 功能号00H 设置屏幕显示方式入口参数 AL 040 25黑白文本方式AL 140 25彩色文本方式AL 280 25黑白文本方式AL 380 25彩色文本方式出口参数 无 功能号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 黑底灰白字符在屏幕中央显示IAMASTUDENT 红底白字 思路 显示HELLO 用DOS功能 要求待显字符串放在数据段 串尾用 作结束符 显示IAMASTUDENT 用BIOS13H 功能它要求待显字符串在附加段这意味着源程序至少要有三个逻辑段 我们令数据段与附加段 重叠 这样源程序仅设置两个逻辑段即可 BIOS文本显示功能调用 486DATASEGMENTUSE16MESG1DB HELLO MESG2DB IAMASTUDENT LL MESG2DATAENDSCODESEGMENTUSE16ASSUMECS CODEASSUMEDS DATAASSUMEES DATABEG MOVAX DATAMOVDS AXMOVES AXMOVAX 0003HINT10H MOVAH 9MOVDX OFFSETMESG1INT21HMOVAX 1301HMOVBH 0MOVBL 01001111BMOVCX LLMOVDH 12MOVDL 80 LL 2MOVBP OFFSETMESG2INT10HMOVAH 4CHINT21HCODEENDSENDBEG 源程序清单 6 3程序设计举例 用汇编语言编程属结构化程序设计 分析题意 确定算法根据算法画出程序框图根据框图编写程序上机调试程序执行程序 按照自上而下的设计方法 设计一个汇编程序的步骤 在程序设计中 程序的效率是程序设计好坏的重要指标 特别是在汇编程序设计中 其特点要求我们对程序运行的效率加以重点关注 对于汇编语言程序我们可以考虑以下几方面作为程序运行效率的衡量标准 程序的执行时间 每一条语句都有自己的执行时间 在8086 8088指令手册中每条指令的运行时间都有明确的定义 根据这些时间 我们可算出程序的运行时间 程序所占有的字节数 有一些计算机系统 可能应用于工业控制或工业过程检测 不需要过多的硬件资源 比如存储单元 所以就要求我们的程序有尽可能少的字节数 以满足缩减硬件资源的要求 程序的语句行数 顺序程序分支程序循环程序 从结构上来讲 一般的汇编程序可分为 子程序宏指令 Eg 从键盘输入一个字符并存储到字节变量BUF单元中 分析 用DOS功能调用完成键入 输入的字符保存在AL寄存器中将AL中的内容存到定义在数据段的变量BUF所指单元中 顺序程序设计 直线程序设计是程序设计中最简单的设计方法 它是将确定好的算法或逻辑关系以正确的语句和正确的逻辑关系有序地编写出来 形成程序 486DATASEGMENTUSE16BUFDB DATAENDS 源程序清单 CODESEGMENTUSE16ASSUMECS CODE DS DATABEG MOVAX DATAMOVDS AXMOVAH 1INT21H AL 键入字符的MOVBUF ALASIIC码MOVAH 4CHINT21HCODEENDSENDBEG 在很多实际问题中 通常要根据不同的情况 执行不同的程序块或语句 这就需要在设计程序时使用运算后的结果 依据一定的条件进行相应的判断 根据判断结果的真或假 去运行相应的程序或语句 例 有一数学函数如下 1x 0y f x 0 x 0 1x 0要求写出程序完成上述计算 分支程序设计 DATASEGMENTXDW DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXMOVAX XORAX AXJEZEROJNSPLUSMOVBL 0FFHJMPHALT ZERO MOVBL 0JMPHALTPLUS MOVBL 1HALT MOVAH 4CHINT21HCODEENDSENDSTART 转移指令可用来实现分支程序设计 分支程序分三种 简单分支复合分支多分支 分支程序设计 简单分支即两路分支 该分支程序结构为 Eg 将BX寄存器的内容以二进制数格式显在屏幕上 BX 1110010011100110B 简单分支 486CODESEGMENTUSE16ASSUMECS CODEBEG MOVBX 5678HMOVCX 16LAST MOVAL 0 ROLBX 1JNCNEXTMOVAL 1 NEXT MOVAH 0EHINT10HLOOPLASTMOVAH 4CHINT21HCODEENDSENDBEG 源程序清单 复合分支判断的条件是复合条件 称复合判断 复合分支程序结构为 Eg 某科室9人 统计月收入在800 900间的人数 并用十进制数显示 分析 月收入是无符号数 对一批数处理应该用间址 复合分支 多分支判断条件后有多个出口 判断一次只能选择一个分支 多分支程序结构为 1 循环程序的组成 循环准备循环体循环控制 循环程序设计 1 循环初值 用于设置开始循环时 循环体所处的初始状态 如循环变量初值 循环体中用到的数据和地址指针等 2 循环体 重复运行的部分 其中还包含了工作部分和循环控制部分 工作部分进行相应的操作 而循环控制部分则保证在不满足循环条件时 跳出循环 3 循环结束条件 在循环体中包括了循环结束条件运算部分 每循环一次除了工作部分进行相应的操作外 循环条件部分还要通过运算 得出当前循环的状态 以便在适当的条件下结束循环 1 循环程序的结构 循环程序设计 DATASEGMENTSUMDW DATAENDSCODESEGMENTASSUMECS CODE DS DATASTARTPROCFARBEGIN PUSHDSXORAX AXPUSHAXMOVAX DATAMOVDS AXMOVCX 10MOVAX 0 该程序是一个以计数器为循环条件的循环结构 是循环中常见的结构之一 例 求1 10的累加和 AGAIN ADDAX CXLOOPAGAINMOVSUM AXRETSTARTENDPCODEENDSENDBEGIN 循环程序设计 DELAY PUSHAXPUSHDXMOVDX 3FFHTIME1 MOVAX 0FFFFHTIME2 DECAXNOPJNETIME2DECDXJNETIME1POPDXPOPAXRET 在循环中 多重循环也是程序设计中常用的结构之一 多重循环通常有多个循环变量 在多重循环中 各自的循环变量要明确 否则将导致循环体的混乱 以两重循环为例 外层循环的循环次数为N 内层循环次数为M 则内层体被运行了N M次 下面是一个用于延时的子程序 例 延时子程序 Eg 假设从BUF单元开始为一个ASCII码字符串 找出其中的最大数送屏幕显示 思路 ASC 码数为无符号数 无符号数的最小数为0 循环程序设计 486DATASEGMENTUSE16BUFDB QWERTYUIOP123 COUNTEQU BUF 统计串长度MAXDB MAX 0DH 0AH DATAENDSCODESEGMENTUSE16ASSUMECS CODE DS DATABEG MOVAX DATAMOVDS AXMOVAL 0 无符号最小数0 ALLEABX BUF 串首址偏移量 BXMOVCX COUNT 串长度 CX LAST CMP BX AL 比较JCNEXTMOVAL BX 大数 ALNEXT INCBXLOOPLAST 循环计数MOVMAX 4 AL 最大数 MAX 4单元MOVAH 9MOVDX OFFSETMAXINT21H 显示结果MOVAH 4CHINT21H 返回DOSCODEENDSENDBEG 源程序清单1 486DATASEGMENTUSE16BUFDB QWERTYUIOP123 FLAGDB 1 设置串结束标志MAXDB MAX 0DH 0AH DATAENDSCODESEGMENTUSE16ASSUMECS CODE DS DATABEG MOVAX DATAMOVDS AXMOVAL 0 无符号最小数0 ALLEABX BUF 串首址偏移量 BXLAST CMPBYTEPTR BX 1 BX 串结束标志 JEDISP 是 转CMP BX ALJCNEXTMOVAL BX 大数 ALNEXT INCBXJMPLASTDISP MOVMAX 4 AL 最大数 MAX 4单元MOVAH 9MOVDX OFFSETMAXINT21H 显示结果MOVAH 4CHINT21H 返回DOSCODEENDSENDBEG 源程序清单2 子程序 相对独立的程序 当程序中要多次完成某一操作时 为了简化整体程序 增强程序可读性 常常把 完成某一操作 设计成一个子程序 供调用 子程序用PROC ENDP定界 子程序分为 段内子程序 段间子程序 无参数子程序 有参数子程序 在子程序设计中 要明确地定义出这个子程序的入口参数和出口参数 使调用者能方便地使用子程序 在子程序中在合理地保存主程序和子程序都用到的寄存器和存储单元 以使主程序能正确地运行 子程序及其调用 参数传送主要有两种方式 利用寄存器传送参数 利用堆栈传送参数 利用某个内存单元传送参数 无参数宏指令有参数宏指令 宏指令与宏调用 无参数宏指令的定义语句格式 宏指令名称MACRO宏体ENDM 宏指令的定义 有参数宏指令的定义语句格式 宏指令名称MACRO哑元表宏体ENDM MACRO ENDM是宏体的定界语句宏体经过定义之后 宏指令的名称就是一条宏指令 可以像CPU指令那样去使用在代码段中放置一条宏指令就是宏调用编译时汇编程序用宏体替换宏指令 宏指令的定义与调用 一串用逗号间隔的形式参数表哑元是没有值的符号 用它 们 代表宏体中出现的操作码助记符 操作数 立即数 寄存器操作数 内存操作数 调用时 宏指令行要有和哑元一一对应的实元表实元可以是立即数 寄存器操作数以及没有PTR运算符的内存操作数 有参宏指令的哑元表 无参数宏指令的定义 宏指令名MACRO宏体ENDM 有参数宏指令的定义 宏指令名MACRO哑元表宏体ENDM 宏指令与宏调用 上述宏体的功能 令光标返回到下一行的开始格 CRLF是宏指令的名称 宏体经过定义之后 宏指令的名称CRLF就是一条宏指令 在代码段中放置一条CRLF就是宏调用 例如 CRLFMACROMOVAH 0EHMOVAL 0DHINT10HMOVAL 0AHINT10HENDM 例如 MOVAH 2MOVDL A INT21HCRLF 编译时汇编程序用宏体替换宏指令 因此执行CRLF后 光标返回下一行始格 宏指令与宏调用 解决方法 LOCAL伪指令格式 LOCAL标号名表 问题 如果宏体中有分支 循环 必然有标号 两次以上调用这样的宏指令必然出现标号重复定义的错误 怎么解决 宏指令与宏调用 说明 LOCAL伪指令要放在宏定义之中 是MACRO定界语句以下的第一条语句 标号名表是用逗号间隔的一串标号名 它们是宏体中出现的所有标号的集合 宏体中出现的标号称为局部标号 使用LOCAL伪指令后的局部标号允许和源程序中的其它标号 变量重名 宏指令中的LOCAL伪指令 486CMPDISPMACRONNLOCALLAST NEXTMOVDL 0 DL清0LAST CMPBEN NN 比较JCNEXT BEN NN转INCDL DL加1SUBBEN NN BEN NN BENJMPLASTNEXT ADDDL 30HMOVAH 2INT21H 显示ENDM 宏指令中的LOCAL伪指令 共同点 宏指令与子程序都可以简化程序设计 增强程序的可读性不同点 子程序调用是由CPU完成的 宏指令调用是在汇编过程中由汇编程序完成的子程序调用可以减小目标程序的体积 宏指令则不能 宏指令与子程序的异同 计算机内存很大 调用有参数的宏指令比调用有参数的子程序方便的多 因此在设计大型程序时 宏指令的使用非常广泛 汇编程序设计举例 代码转换 代码转换 常见的代码转换有 二进制数 显示二进制数 十进制数 显示二进制数 十六进制数 显示BCD码数 二进制数 代码转换 代码转换 A 二进制数显示例 把键盘输入的一位数 0 9 转换成等值二进数显示 显示的格式要求如下 PleaseEnter PleaseEnter 9 00001001B 思路 键盘缓冲区中是键入字符的ASC 码 0 9的ASC 码为30H 39H 二进制数每一位代码的判断 本程序采用两种格式设计源程序 一种是EXE文件编程格式 另一种是COM文件编程格式 代码转换 程序框图 486DATASEGMENTUSE16MESG1DB PleaseEnter 0DH 0AH MESG2DB Error DATAENDSCODESEGMENTUSE16ASSUMECS CODE DS DATABEG MOVAX DATAMOVDS AXMOVAH 9MOVDX OFFSETMESG1INT21H 显示操作提示MOVAH 1INT21H 等待键入CMPAL 3AHJNCERROR 9 转CMPAL 30H EXE格式程序清单 JCERROR 0 转SUBAL 30HMOVBL AL BL 0 9的二进制数MOVAH 2MOVDL INT21HCALLDISPMOVAH 2MOVDL B INT21HJMPEXITERROR MOVAH 9LEADX MESG2INT21H 显示错误信息EXIT MOVAH 4CHINT21H DISPPROC 显示BL中的二进制数MOVCX 8LAST MOVDL 0 RCLBL 1JNCNEXTMOVDL 1 NEXT MOVAH 2INT21HLOOPLASTRETDISPENDPCODEENDSENDBEG EXE格式程序清单 486CODESEGMENTUSE16ASSUMECS CODEORG100HSTART JMPBEGMESG1DB PleaseEnter 0DH 0AH MESG2DB Error BEG MOVAH 9MOVDX OFFSETMESG1INT21H 显示操作提示MOVAH 1INT21H 等待键入CMPAL 3AHJNCERROR 9 转CMPAL 30HJCERROR 0 转SUBAL 30H MOVBL AL BL 0 9的二进制数MOVAH 2MOVDL INT21HCALLDISPMOVAH 2MOVDL B INT21HJMPEXITERROR MOVAH 9LEADX MESG2INT21H 显示错误信息EXIT MOVAH 4CHINT21HCODEENDSENDBEG COM格式程序清单 DISPPROC 显示BL中的二进制数MOVCX 8LAST MOVDL 0 RCLBL 1JNCNEXTMOVDL 1 NEXT MOVAH 2INT21HLOOPLASTRETDISPENDPCODEENDSENDSTART COM格式程序清单 二 二进制数 十六进制数显示 算法 代码转换 编程技巧 8位二进制数 截取高4位 显示 显示 截取低4位 XXXX XXXX XXXX 0000 XXXX 0000 16进制数ASC 码 16进制数ASC 码 代码转换 例 设从BNUM单元开始 有4个16位的二进制数 要求把它们转换成16进制数 并送屏幕显示 程序清单 486DATASEGMENTUSE16BNUMDW0001001000110100B 1234HDW0101011001111000B 5678HDW0001101000101011B 1A2BHDW0011110001001101B 3C4DHBUFDB4DUP H 输出缓冲区COUNTDB4DATAENDSCODESEGMENTUSE16ASSUMECS CODE DS DATA 代码转换 BEG MOVAX DATAMOVDS AXMOVCX 4MOVBX OFFSETBNUMAGA MOVDX BX SALEDX 16CALLN2 16ASCMOVAH 9MOVDX OFFSETBUFINT21H 显示一个16进数ADDBX 2 地址加2LOOPAGAMOVAH 4CHINT21H 二进数 十六进数ACSII码N2 16ASCPROCMOVSI OFFSETBUF 输出缓冲区地址 SIMOVCOUNT 4LAST ROLEDX 4ANDDL 0FHCMPDL 10JCNEXTADDDL 7NEXT ADDDL 30HMOV SI DLINCSI 地址加1DECCOUNT 计数JNZLASTRETN2 16ASCENDPCODEENDSENDBEG EXE格式程序清单 三 BCD码 二进制数 算法 设4位BCD码数列为 N3N2N1N0 等值二进制数 N3 1000 N2 100 N1 10 N0 0 10 N3 10 N2 10 N1 10 N0 编程考虑 4位BCD码最大为9999H 等值的二进制数最大为16位 超过8位 而且D15位肯定为0 分离出BCD千位N3 百位N2 十位N1 个位N0 设计一个AX 10 BX AX的子程序供调用 首次调用时 令AX 0 BX N3 共调用4次 则AX中即为等值的二进制数 例 4位BCD码数 二进制数显示 代码转换 486CODESEGMENTUSE16ASSUMECS CODENUMDW4567H BCD码表示BEG MOVCX 4 4次调用MOVAX 0AGA ROLNUM 4MOVBX NUMANDBX 000FHIMULAX 10ADDAX BXLOOPAGA显示AX中的二进制数返回DOSCODEENDSENDBEG 本例数据放在代码段 本例 因为AX的D15 0 是正的有符号数 所以可用IMUL指令 EXE格式程序清单 AX 10 BX AX 四 二进制数 十进制数 方法 比较法 恢复余数法 除法 8位二进制数最大为11111111 等值的十进制数为255 比较法的关键 判断某二进制数 假设为BEN单元的内容 包含几个100 几个10 几个1 1 8位二进制数 十进制数 比较法 代码转换 486CMPDISPMACRONNLOCALLAST NEXTMOVDL 0 DL清0LAST CMPBEN NN 比较JCNEXT BEN NN转INCDL DL加1SUBBEN NNJMPLASTNEXT ADDDL 30HMOVAH 2INT21H 显示ENDM CODESEGMENTUSE16ASSUMECS CODEBENDB10101110B 174BEG CMPDISP100CMPDISP10CM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 治理能力面试常见问题及答案解析
- 普宁社工面试题解读:让你轻松应对各类面试
- 学法的个人心得体会感悟
- 输电线路带电作业资格模拟题含参考答案
- 电厂人力资源招聘面试题
- 病历剖析实战医师面试题目库
- 养护知识统计培训课件
- 养护知识培训讲话课件
- 免学费牙医专业知识培训课件
- 养护应急知识培训内容课件
- 肾上腺疾病外科治疗
- 第9章探放水钻机及相关设备的安全使用.
- (高清正版)JJF 1908-2021 双金属温度计校准规范
- 交通部农村公路建设标准指导意见
- 卫浴店面管理
- 清表施工方案4常用
- 纯化水系统再验证方案E
- 5立方米液化石油气储罐课程设计说明书
- 临床技术操作规范_骨科学分册资料全
- 华为内部虚拟股管理暂行条例
- 集装箱箱主代码
评论
0/150
提交评论