资源描述
第 6章 汇 编 语 言 程 序 设 计 用 汇 编 语 言 编 程 属 结 构 化 程 序 设 计 。 需 按 照 结 构 化 的 思 想 来 进 行 汇 编 程序 的 设 计 分析题意,确定算法根据算法画出程序框图根据框图编写程序上机调试程序执行程序按 照 自 上 而 下 的 设 计 方 法 , 设 计 一 个 汇 编 程 序 的 步 骤 : 顺序程序 分支程序 循环程序从 结 构 上 来 讲 , 一 般 的 汇 编 程 序 可 分 为 : Eg:从 键 盘 输 入 一 个 字 符 并 存 储 到 字 节 变量 BUF单 元 中 .分 析 : 用 DOS功 能 调 用 完 成 键 入 , 输 入 的 字 符 保 存 在 AL寄 存 器 中 将 AL中 的 内 容 存 到 定 义 在 数 据 段 的 变 量 BUF所 指 单 元 中 顺 序 程 序 设 计 .486DATA SEGMENT USE16 BUF DB ?DATA ENDS源 程 序 清 单 :CODE SEGMENT USE16 ASSUME CS : CODE , DS : DATABEG: MOV AX , DATAMOV DS , AXMOV AH , 1INT 21H ;AL=键 入 字 符 的MOV BUF , AL ASIIC码MOV AH , 4CHINT 21HCODE ENDSEND BEG 分 支 程 序 设 计 转 移 指 令 可 用 来 实 现 分 支 程 序 设 计分 支 程 序 分 三 种 : 简 单 分 支 复 合 分 支 多 分 支 简 单 分 支 即 两 路 分 支 , 该 分 支 程 序 结 构 为 :条 件 满 足 否 ?程 序 段 1 程 序 段 2Y N Eg: 将 BX寄 存 器 的 内 容 以 二 进 制 数 格 式 显 在屏 幕 上 BX=1110010011100110B 简 单 分 支 RCL 0SALROL CF CF CF 486CODE SEGMENT USE16 ASSUME CS:CODE BEG: MOV BX,5678H MOV CX,16 LAST: MOV AL,0 ROL BX,1 JNC NEXT MOV AL,1 NEXT: MOV AH,0EH INT 10H LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG ADC AL,0 数 BX,16 CXC标 =? 1 AL调 BIOS.0EHCX-1 CXCX=0 0 ALBX左 移 一 位10N Y返 DOS 源 程 序 清 单 : 复 合 分 支判 断 的 条 件 是 复 合 条 件 , 称 复 合 判 断 复 合 分 支 程 序 结 构 为 :条 件 1和 条 件 2.满 足 否 ?程 序 段 1 程 序 段 2Y N Eg:某 科 室 9人 , 统 计 月 收 入 在 800900间 的 人 数 , 并 用 十 进 制 数 显 示 复 合 分 支 分 析 : 月 收 入 是 无 符 号 数 , 对 一 批 数 处 理 应 该 用 间 址 。 数 轴 : N1 (800) N2 (900) 多 分 支判 断 条 件 后 有 多 个 出 口 , 判 断 一 次 只 能 选 择一 个 分 支 。 多 分 支 程 序 结 构 为 :1 条 件 属 哪 种情 况 ?程 序 段 1 程 序 段 n+m. .程 序 段 nn n+m 例 .多 分 支 段 内 转 移要 求 : 键 入 0, 转 P0程 序 段 键 入 1, 转 P1程 序 段 键 入 9, 转 P9程 序 段思 路 : 用 比 较 指 令 配 合 直 接 转 移 指 令 实 现 CMP 键 入 字 符 , 0 JE P0 CMP 键 入 字 符 , 1 JE P1 用 转 移 地 址 表 配 合 间 接 转 移 指 令 实 现 多 分 支 486DATA SEGMENT USE16TAB DW P0, P1, , P9 ;汇 编 后 自 动 装 入 相 应 的 偏 移 地 址MESG DB 0DH,0AH,strike 09:$DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AXAGA: MOV AH,9 MOV DX,OFFSET MESG INT 21H MOV AH,1 INT 21H CMP AL,0 JC AGA CMP AL,9JA AGASUB AL,30HMOVZX BX,ALADD BX,BX;2 BXBXMOV SI,OFFSET TABJMP BX+SI;DS:BX+SI IPP0: P1: P9: CODE ENDS END BEG 或 :MOV BX,BX+SI JMP BX ;BX IP源 程 序 清 单 : 循 环 程 序 设 计循 环 程 序 的 组 成 : 循 环 准 备 循 环 体 循 环 控 制 1. 循 环 程 序 的 结 构Y预 置 循 环 次 数其 他 准 备 工 作循 环 体循 环 减 1计 数退 出 循 环结 果 为 0?N (a)单循环结构 (b) 双循环结构结 果 为 0?循 环 体内 循 环 减 1计 数结 果 为 0?外 循 环 减 1计 数退 出 循 环预 置 外 循 环 次 数其 他 准 备 工 作预 置 内 循 环 次 数其 他 准 备 工 作NN YY Eg: 假 设 从 BUF单 元开 始 为 一 个 ASCII码 字 符 串 ,找 出 其 中的 最 大 数 送 屏 幕 显示 。 循 环 程 序 设 计思 路 : ASC 码 数 为 无 符 号数 , 无 符 号 数 的 最 小 数 为 0 Y NN 数 据 区 首 址 DS:BX无 符 号 最 小 数 AL数 据 个 数 CXBX ALBX=AL?BX+1 BXCX-1 CX显 示 结 果返 回 DOSCX=0?Y 486 DATA SEGMENT USE16 BUF DB QWERTYUIOP123 COUNT EQU $ -BUF;统 计 串 长 度 MAX DB MAX=,?,0DH,0AH,$ DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX MOV AL,0 ;无 符 号 最 小 数 0 AL LEA BX,BUF ;串 首 址 偏 移 量 BX MOV CX,COUNT ;串 长 度 CX LAST: CMP BX,AL;比 较 JC NEXT MOV AL,BX;大 数 ALNEXT: INC BX LOOP LAST ;循 环 计 数 MOV MAX+4,AL ;最 大 数 MAX+4 单 元 MOV AH,9 MOV DX,OFFSET MAX INT 21H ;显 示 结 果 MOV AH,4CH INT 21H ;返 回 DOSCODE ENDS END BEG 源 程 序 清 单 1: 486DATA SEGMENT USE16BUF DB QWERTYUIOP123FLAG DB 1 ;设 置 串 结 束 标 志MAX DB MAX=,?,0DH,0AH,$DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AX MOV AL,0 ;无 符 号 最 小 数 0 AL LEA BX,BUF ;串 首 址 偏 移 量 BXLAST: CMP BYTE PTR BX, -1 ;BX=串 结 束 标 志 ? JE DISP ;是 ,转 CMP BX,AL JC NEXT MOV AL,BX ;大 数 ALNEXT: INC BX JMP LASTDISP: MOV MAX+4,AL ;最 大 数 MAX+4 单 元 MOV AH,9 MOV DX,OFFSET MAX INT 21H ;显 示 结 果 MOV AH,4CH INT 21H ;返 回 DOSCODE ENDS END BEG 源 程 序 清 单 2: 汇 编 程 序 设 计 举 例 代 码 转 换 代 码 转 换 常 见 的 代 码 转 换 有 : 二 进 制 数 显 示 二 进 制 数 十 进 制 数 显 示 二 进 制 数 十 六 进 制 数 显 示 BCD码 数 二 进 制 数 代 码 转 换 A1 二 进 制 数 显 示 :例 .把 键 盘 输 入 的 一 位 数 (0 9),转 换 成 等 值 二 进 数 显 示显 示 的 格 式 要 求 如 下 :Please Enter:ERROR!Please Enter:9 =00001001B 代 码 转 换思 路 :键 盘 缓 冲 区 中 是 键 入 字 符 的 ASC 码 。 0 9的 ASC 码 为 30H 39H。二 进 制 数 每 一 位 代 码 的 判 断 :本 程 序 采 用 两 种 格 式 设 计 源 程 序 :一 种 是 EXE文 件 编 程 格 式 ,另 一 种 是 COM文 件 编 程 格 式 。RCL 0SALROLCF CF CF 程 序 框 图 : AL-30H BL = 屏 幕 ,8 CX 0 屏幕 1 屏幕 CX-1 CX B 屏 幕 ,返 回DOSN N给 出 操 作 提 示键 盘 输 入 ALAL= 0 9 ?CF=?CX=0?BL左 移 一 位Y 显 示 错 误 信 息 Y0 1 . 486DATA SEGMENT USE16MESG1 DB Please Enter ! ,0DH,0AH,$MESG2 DB -Error ! $ DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AX MOV AH,9 MOV DX,OFFSET MESG1 INT 21H ;显 示 操 作 提 示 MOV AH,1 INT 21H ;等 待 键 入 CMP AL,3AH JNC ERROR ; 9转 CMP AL,30H EXE格 式 程 序 清 单 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 EXITERROR: MOV AH,9 MOV DX,OFFSET MESG2 INT 21H ;显 示 错 误 信 息EXIT: MOV AH,4CH INT 21H ;-DISP PROC ;显 示 BL中 的 二 进 制 数 MOV CX,8LAST: MOV DL,0 RCL BL,1 JNC NEXT MOV DL,1NEXT: MOV AH,2 INT 21H LOOP LAST RETDISP ENDPCODE ENDS END BEG EXE格 式 程 序 清 单 . 486CODE SEGMENT USE16 ASSUME CS:CODE ORG 100HSTART: JMP BEGMESG1 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 MOV DX,OFFSET MESG2 INT 21H ;显 示 错 误 信 息 INT 21H ERROR: MOV AH,9EXIT: MOV AH,4CH COM格 式 程 序 清 单 ;-DISP PROC ;显 示 BL中 的 二 进 制 数 MOV CX,8LAST: MOV DL,0 RCL BL,1 JNC NEXT MOV DL,1NEXT: MOV AH,2 INT 21H LOOP LAST RETDISP ENDPCODE ENDS END START COM格 式 程 序 清 单 问 题 : 键 入 的 是 两 位 十 进 制 数 时 ,如 何 将 该 十 进 制 数 的 二 进 制 数 显示 在 屏 幕 上 ?代 码 转 换 二 .二 进 制 数 十 六 进 制 数 显 示算 法 :四 位 二 进 制 数等 值 的 十 六 进 制 数十 六 进 制 数 ASC 码算 法 00001001 1010111109 AF30H39H 41H46H四 位 二 进 制 数 +30H= 等 值 的 十 六 进 制数 ASC 码 四 位 二 进 制 数 +37H= 等 值 的 十 六 进制 数 ASC 码代 码 转 换 编 程 技 巧 :8位 二 进 制 数截 取 高 4位 显 示 显 示 截 取 低 4位XXXX XXXXXXXX0 0 0 0 XXXX0 0 0 016进 制 数 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 BNUMAGA: 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,4LAST: ROL EDX,4 AND DL,0FH CMP DL,10 JC NEXT ADD DL,7NEXT: ADD DL,30H MOV SI,DL INC SI ;地 址 加 1 DEC COUNT ;计 数 JNZ LAST RETN2_16ASC ENDPCODE ENDS END BEGEXE格 式 程 序 清 单 代 码 转 换 三 .BCD码 二 进 制 数例 .4位 BCD码 数 二 进 制 数 显 示算 法 : 设 4位 BCD码 数 列 为 : N3 N2 N1 N0,等 值 二 进 制 数 =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中 即 为 等 值 的 二 进制 数 。 486CODE SEGMENT USE16 ASSUME CS:CODENUM DW 4567H ;BCD码 表 示BEG: MOV CX,4 ;4次 调 用 MOV AX,0AGA: ROL NUM, 4 MOV BX,NUM AND BX,000FH IMUL AX,10 ADD AX,BX LOOP AGA 显 示 AX中 的 二 进 制 数 返 回 DOSCODE ENDS END BEG 本 例 数 据 放 在 代 码 段 !本 例 : 因 为 AX的 D15=0,是 正的 有 符 号 数 , 所 以 可 用IMUL指 令AX 10+BXAX EXE格 式 程 序 清 单 代 码 转 换三 .二 进 制 数 十 进 制 数方 法 :比 较 法 , 恢 复 余 数 法 , 除 法 8位 二 进 制 数 最 大 为 11111111, 等 值 的 十 进 制 数 为 255, 比 较 法 的 关 键 : 判 断 某 二 进 制数 (假 设 为 BEN单 元 的 内 容 )包 含几 个 100, 几 个 10, 几 个 1 1. 8位 二 进 制 数 十 进 制 数 ,比 较 法 : DL+1 DL(BEN)-10 BEN(BEN)=100? NY(BEN)=10? NY0 DL DL+1 DL(BEN)-100 BENDL+30H 屏 幕 0 DL DL+30H 屏 幕(BEN)+30H 屏 幕 返 回 DOS . 486CMPDISP MACRO NN LOCAL LAST, NEXT MOV DL,0 ;DL清 0LAST: CMP BEN, NN ;比 较 JC NEXT ;BEN NN转 INC DL ;DL加 1 SUB BEN, NN JMP LASTNEXT: ADD DL, 30H MOV AH,2 INT 21H ;显 示 ENDM CODE SEGMENT USE16 ASSUME CS:CODEBEN DB 10101110B ;=174BEG: CMPDISP 100 CMPDISP 10 CMPDISP 1 MOV AH,4CH INT 21HCODE ENDS END BEGEXE格 式 程 序 清 单 代 码 转 换2. 8位 二 进 制 数 十 进 制 数 , 恢 复 余 数 法 ( 请 自 学 )3. 8位 二 进 制 数 十 进 制 数 , “ 除 权 值 求 商 ” 的 算 法 分 析把 11110101B 十 进 制 数 245 算 法 : 依 次 用 权 值 100,10,1去 除上 次 的 余 数 , 直 到 余 数 为 0时 停 止 。 每 次 除 法 所 得 的 商 数 顺 序 排 列 , 即 为 十 进 制 数 。 1 1 1 1 0 1 0 11100100 1 1 0 0 1 0 01 0 1 1 0 11 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 11010权 值 (10)10 例 . 将 NUM单 元 中 的 16位 二 进 制 数 , 转 换 成 十 进 制数 显 示 。思 路 : 16 位 二 进 制 数 : 最 大 为 11, 其 等 值 的 十 进制 数 为 65535, 故 应 判 断 NUM单 元 的 数 包 含 几 个 10000,几 个 1000, 几 个 100, 几 个 10, 几 个 1设 计 一 个 XX YY并 显 示 商 值 的 宏 指 令 供 调 用 , XX为 32位 , YY为 16为 二 进 制 数 。 DX,AX为 被 除 数 486DIVIDE 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 ENDMCODE SEGMENT USE16 ASSUME CS:CODENUM 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 21HCODE ENDS END BEG显 示 一 位 商 值不 能颠 倒 分 析 :应 写 成 :DIVIDE CS:BX,10000程 序 清 单 代 码 转 换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 151010即 (10)10 1 0 1 1 0 0 0 1 0 1 0 1 0 041010 0商 为 0时 止 1 0 0 0 1 021010 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? 转 换 完 毕YYNN CODE SEGMENT USE16 ASSUME CS:CODEBEN DB 10101110B ;=174BEG: CMPDISP 100 CMPDISP 10 CMPDISP 1 MOV AH,4CH INT 21HCODE ENDS END BEG 代 码 转 换 .486CODE SEGMENT USE16 ASSUME CS:CODEBEN DB 10101110B ;=174BEG: 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清 0LAST: CMP BEN,BL ;比 较 JC NEXT ;BEN BX 转 INC DL ;DL加 1 SUB BEN,BL ;BEN-BX BEN JMP LASTNEXT: ADD DL,30H MOV AH,2 INT 21H ;显 示 RETCMPDISP ENDPCODE ENDS END BEG 代 码 转 换
展开阅读全文