当前位置:首页 >> 信息与通信 >>

重要的汇编程序


5.3 将 AX 寄存器中的 16 位数分成 4 组,每组 4 位,然后把这四组数分别放在 AL、BL、 CL 和 DL 中。 DSEG SEGMENT STORE DB 4 DUP (?) DSEG ENDS BEGIN: MOV CL, 4 ;右移四次 MOV CH, 4 ;循环四次 LEA BX, STORE A10: MOV DX, AX AND DX, 0FH ;取 A

X 的低四位 MOV [BX], DL ;低四位存入 STORE 中 INC BX SHR AX, CL ;右移四次 DEC CH JNZ A10 ;循环四次完了码? B10: MOV DL, STORE ;四组数分别放在 AL、BL、CL 和 DL 中 MOV CL, STORE+1 MOV BL, STORE+2 MOV AL, STORE+3 STOP: RET 5.4 试编写一程序, 要求比较两个字符串 STRING1 和 STRING2 所含字符是否完全相同, 若 相同则显示‘MATCH’, 若不相同则显示‘NO MATCH’。 DSEG SEGMENT STRING1 DB ‘I am a student.’ STRING2 DB ‘I am a student!’ YES DB ‘MATCH’, 0DH, 0AH, ‘$’ NO DB ‘NO MATCH’, 0DH, 0AH, ‘$’ DSEG ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG, DS: DSEG, ES: DSEG START: PUSH DS ;设置返回 DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 DS 赋值 MOV ES, AX ;给 ES 赋值 BEGIN: LEA SI, STRING1 ;设置串比较指令的初值 LEA DI, STRING2 CLD MOV CX, STRING2 - STRING1 REPE CMPSB ;串比较 JNE DISPNO LEA DX, YES ;显示 MATCH

JMP DISPLAY DISPNO: LEA DX, NO ;显示 NO MATCH DISPLAY: MOV AH, 9 ;显示一个字符串的 DOS 调用 INT 21H RET MAIN ENDP CSEG ENDS ;以上定义代码段 END START 5.10 设有一段英文,其字符变量名为 ENG,并以$字符结束。试编写一程序,查对单词 SUN 在该文中的出现次数,并以格式“SUN:xxxx”显示出次数。 DSEG SEGMENT ENG DB ‘Here is sun, sun ,…,$’ DISP DB ‘SUN:’ DAT DB ‘0000’ , 0DH, 0AH, ‘$’ KEYWORD DB ‘sun’ DSEG ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG, DS: DSEG, ES: DSEG START: PUSH DS ;设置返回 DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 DS 赋值 MOV ES, AX ;给 ES 赋值 BEGIN: MOV AX, 0 MOV DX, DISP-ENG-2 ;计算 ENG 的长度(每次比较 sun,因此比较次数-2) LEA BX, ENG COMP: MOV DI, BX LEA SI, KEYWORD MOV CX, 3 REPE CMPSB ;串比较 JNZ NOMATCH INC AX ;是,SUN 的个数加 1 ADD BX, 2 NOMATCH: INC BX ;指向 ENG 的下一个字母 DEC DX JNZ COMP DONE: MOV CH, 4 ;将次数转换为 16 进制数的 ASCII 码 MOV CL, 4 LEA BX, DAT ;转换结果存入 DAT 单元中 DONE1: ROL AX, CL MOV DX, AX AND DL, 0FH ;取一位 16 进制数

ADD DL, 30H CMP DL, 39H JLE STORE ADD DL, 07H ;是“A~F”所以要加 7 STORE: MOV [BX], DL ;转换结果存入 DAT 单元中 INC BX DEC CH JNZ DONE1 DISPLAY: LEA DX, DISP ;显示字符串程序(将 DISP 和 DAT 一起显示) MOV AH, 09H INT 21H RET MAIN ENDP CSEG ENDS ;以上定义代码段 END START 5.17 试编制一个程序把 AX 中的 16 进制数转换为 ASCII 码, 并将对应的 ASCII 码依次存放 到 MEM 数组中的四个字节中。例如,当(AX)=2A49H 时,程序执行完后,MEM 中的 4 个 字节内容为 39H,34H,41H,32H。 DSEG SEGMENT MEM DB 4 DUP (?) N DW 2A49H DSEG ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG, DS: DSEG START: PUSH DS ;设置返回 DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 DS 赋值 BEGIN: MOV CH, 4 ;循环计数器 MOV CL, 4 MOV AX, N LEA BX, MEM ROTATE: MOV DL, AL ;从最低四位开始转换为 ASCII 码 AND DL, 0FH ADD DL, 30H CMP DL, 3AH ;是 0~9 吗? JL NEXT ADD DL, 07H ;是 A~F NEXT: MOV [BX], DL ;转换的 ASCII 码送入 MEM 中 INC BX ROR AX, CL ;准备转换下一位 DEC CH

JNZ ROTATE RET MAIN ENDP CSEG ENDS ;以上定义代码段 END START 5.23 已定义了两个整数变量 A 和 B,试编写程序完成下列功能: (1) 若两个数中有一个是奇数,则将奇数存入 A 中,偶数存入 B 中; (2) 若两个数中均为奇数,则将两数加 1 后存回原变量; (3) 若两个数中均为偶数,则两个变量均不改变。 DSEG SEGMENT A DW ? B DW ? DSEG ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG, DS: DSEG START: PUSH DS ;设置返回 DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 DS 赋值 BEGIN: MOV AX, A MOV BX, B XOR AX, BX TEST AX, 0001H ;A 和 B 同为奇数或偶数吗? JZ CLASS ;A 和 B 都为奇数或偶数,转走 TEST BX, 0001H JZ EXIT ;B 为偶数,转走 XCHG BX, A ;A 为偶数,将奇数存入 A 中 MOV B, BX ;将偶数存入 B 中 JMP EXIT CLASS: TEST BX, 0001H ;A 和 B 都为奇数吗? JZ EXIT ;A 和 B 同为偶数,转走 INC B INC A EXIT: RET MAIN ENDP CSEG ENDS ;以上定义代码段 END START 6.7 设有 10 个学生的成绩分别是 76,69,84,90,73,88,99,63,100 和 80 分。试编制 一个子程序统计 60~69 分,70~79 分,80~89 分,90~99 分和 100 分的人数,分别存放到 S6, S7,S8,S9 和 S10 单元中。 DSEG SEGMENT

RECORD DW 76,69,84,90,73,88,99,63,100,80 S6 DW 0 S7 DW 0 S8 DW 0 S9 DW 0 S10 DW 0 DSEG ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG, DS: DSEG START: PUSH DS ;设置返回 DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 DS 赋值 BEGIN: MOV CX, 10 CALL COUNT RET MAIN ENDP COUNT PROC NEAR ;成绩统计子程序 MOV SI, 0 NEXT: MOV AX, RECORD[SI] MOV BX, 10 ;以下 5 句是根据成绩计算相对 S6 的地址变化量 DIV BL ;计算公式为:((成绩)/10-6)*2 送(BX) MOV BL, AL ;此时(BH)保持为 0 不变 SUB BX, 6 ;应为只统计 60 分以上成绩 SAL BX, 1 ;(BX)*2 INC S6[BX] ;S6 是 S6,S7,S8,S9 和 S10 单元的首地址 ADD SI, 2 LOOP NEXT RET COUNT ENDP ;COUNT 子程序结束 CSEG ENDS ;以上定义代码段 END START 6.15 试编写一个执行以下计算的子程序 COMPUTE: R←X+Y-3 其中 X, 及 R 均为字数组。 Y 假设 COMPUTE 与其调用程序都在同一代码段中, 数据段 D_SEG 中包含 X 和 Y 数组,数据段 E_SEG 中包含 R 数组,同时写出主程序调用 COMPUTE 过程 的部分。 如果主程序和 COMPUTE 在同一程序模块中,但不在同一代码段中,程序应如何修改? 如果主程序和 COMPUTE 不在同一程序模块中,程序应如何修改? 答:(1) 主程序和 COMPUTE 在同一代码段中的程序如下: TITLE ADDITION ;主程序 D_SEG SEGMENT PARA ‘DATA’

COUNT EQU 10H X DW COUNT DUP (?) Y DW COUNT DUP (?) D_SEG ENDS E_SEG SEGMENT PARA ‘DATA’ R DW COUNT DUP (?) E_SEG ENDS C_SEG SEGMENT PARA ‘CODE’ ADDITION PROC FAR ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG START: PUSH DS SUB AX, AX PUSH AX MOV AX, D_SEG MOV DS, AX MOV AX, E_SEG MOV ES, AX CALL COMPUTE ;调用求和子程序 RET ADDITION ENDP COMPUTE PROC NEAR ;同一段的求和子程序 MOV CX, COUNT MOV BX, 0 REPEAT: MOV AX, X[BX] ADD AX, Y[BX] SUB AX, 3 MOV ES: R[BX], AX RET COMPUTE ENDP C_SEG ENDS END START (2) 主程序和 COMPUTE 在同一程序模块中,但不在同一代码段中的程序如下: TITLE ADDITION ;主程序 D_SEG SEGMENT PARA ‘DATA’ COUNT EQU 10H X DW COUNT DUP (?) Y DW COUNT DUP (?) D_SEG ENDS E_SEG SEGMENT PARA ‘DATA’ R DW COUNT DUP (?) E_SEG ENDS C_SEG SEGMENT PARA ‘CODE’ ADDITION PROC FAR ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG

START: PUSH DS SUB AX, AX POP AX MOV AX, D_SEG MOV DS, AX MOV AX, E_SEG MOV ES, AX CALL FAR PTR COMPUTE ;调用求和子程序 RET ADDITION ENDP C_SEG ENDS CODESG SEGMENT PARA ‘CODE’ ASSUME CS: CODESG COMPUTE PROC FAR ;不同段的求和子程序 MOV CX, COUNT MOV BX, 0 REPEAT: MOV AX, X[BX] ADD AX, Y[BX] SUB AX, 3 MOV ES: R[BX], AX RET COMPUTE ENDP CODESG ENDS END START (3) 主程序和 COMPUTE 不在同一程序模块中的程序如下: TITLE ADDITION ;主程序 EXTRN COMPUTE: FAR PUBLIC COUNT, X, Y, R D_SEG SEGMENT PARA ‘DATA’ COUNT DW 10H X DW 10H DUP (?) Y DW 10H DUP (?) D_SEG ENDS E_SEG SEGMENT PARA ‘DATA’ R DW 10H DUP (?) E_SEG ENDS C_SEG SEGMENT PARA ‘CODE’ ADDITION PROC FAR ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG START: PUSH DS SUB AX, AX POP AX MOV AX, D_SEG MOV DS, AX

MOV AX, E_SEG MOV ES, AX CALL FAR PTR COMPUTE ;调用求和子程序 RET ADDITION ENDP C_SEG ENDS END START TITLE COMPUTE ;求和子程序 EXTRN COUNT:WORD, X:WORD, Y:WORD, R:WORD PUBLIC COMPUTE CODESG SEGMENT PARA ‘CODE’ ASSUME CS: CODESG COMPUTE PROC FAR ;不同模块的求和子程序 MOV CX, COUNT MOV BX, 0 REPEAT: MOV AX, X[BX] ADD AX, Y[BX] SUB AX, 3 MOV ES: R[BX], AX RET COMPUTE ENDP CODESG ENDS END 8.10 假定中断类型 9H 的中断处理程序的首地址为 INT_ROUT,试写出主程序中为建立这 一中断向量而编制的程序段。 MOV AL, 1CH ;取原中断向量,并保护起来 MOV AH, 35H INT 21H PUSH ES PUSH BX PUSH DS MOV AX, SEG INT_ROUT MOV DS, AX MOV DX, OFFSET INT_ROUT MOV AL, 09H MOV AH, 25H ;设置中断向量功能调用 INT 21H POP DS POP DX ;还原原中断向量 POP DS MOV AL, 1CH MOV AH, 25H INT 21H


相关文章:
汇编语言复习重点(王爽)
汇编语言复习重点(王爽)_工学_高等教育_教育专区。含汇编重要指令表及一些练习题 汇编语言(教材 王爽)期末考试复习: 考试题型:选择、填空、程序分析、编程题 一、...
汇编程序
在我看来,微机原理课程设 计主要的目标是利用课程中学到的汇编知识来完成一定的操作, 用以解决生活中需要解决 的问题。通过这次的课程设计,可以巩固我们对汇编语言...
汇编语言程序设计
汇编语言程序设计_计算机软件及应用_IT/计算机_专业资料。了解汇编语言重要性汇编语言程序设计〉课后习题及答案 作者名:不详 来源:网友提供 06年6月8日 第一...
汇编语言简介
对于训练学生掌握程序设计技术,熟悉上机操作和程序调试技术有重要作用 汇编语言组成: 达渝仁 数据传送指令 这部分指令包括通用数据传送指令 MOV、条件传送指令 CMOVcc...
汇编例子
单片机应用技术 第4章 汇编语言程设计 第4章 汇编语言程序设计信号灯的控制 2 程序设计是单片机应用系统设计的重要组成部分, 计算机的全部动作都是在程序的控制 下...
汇编程序
重要的汇编程序 8页 2财富值 汇编程序汇集 20页 免费 一些简单的汇编程序 6页 10财富值 汇编程序实例 7页 免费 第7章 汇编程序 40页 1财富值 部分汇编程序...
汇编语言源程序的运行过程
3.连结过程 D:\文件夹名>Link 文件名;↙ 我们学习汇编的主要目的,就是通过用汇编语言进行编程而深入地理解计算机底层的 基本工作机理, 达到可以随心所欲地控制...
汇编语言零基础学习
汇编写程序已经够要命了,如果不用 MS、IBM 的子程序,这日子 真是没法过了(关于功能调用详见《电脑爱好者》98年11期) 。 编写汇编语言有两种主要的方法:1....
浅析汇编语言的功能
与此相同,在程序调试时,一旦程序的运行 出了问题,就很难发现。 二.汇编语言的应用领域 汇编语言的在不同的领域有着不同的应用,下面介绍其主要的用 途: 1....
如何轻松学好汇编语言
特别是在计算机技术专业 的学习中,汇编语言具有十分重要甚至说不可代替的作用。因学生有英语、C 语言学习的基础 和习惯,故本文从英语、C 语言语法对比的角度,说明...
更多相关标签:
制作汇编的重要性 | 重庆重要造价文件汇编 | 人民日报重要言论汇编 | 上级重要文件目录汇编 | 汇编语言重要吗 | 四川重要造价文件汇编 | 胡敏2016重要讲话汇编 | 人民日报重要社论汇编 |