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

重要的汇编程序


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


相关文章:
汇编例子
单片机应用技术 第4章 汇编语言程设计 第4章 汇编语言程序设计信号灯的控制 2 程序设计是单片机应用系统设计的重要组成部分, 计算机的全部动作都是在程序的控制 下...
汇编语言零基础学习
为了使学习 汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意 力集中在最重要的几个指令上(CMP LOOP MOV JNZ……) 。但是想在 啰里吧嗦的教科...
汇编语言简介
对于训练学生掌握程序设计技术,熟悉上机操作和程序调试技术有重要作用 汇编语言组成: 达渝仁 数据传送指令 这部分指令包括通用数据传送指令 MOV、条件传送指令 CMOVcc...
汇编语言程序设计
汇编语言程序设计_计算机软件及应用_IT/计算机_专业资料。了解汇编语言重要性汇编语言程序设计〉课后习题及答案 作者名:不详 来源:网友提供 06年6月8日 第一...
如何轻松学好汇编语言
特别是在计算机技术专业 的学习中,汇编语言具有十分重要甚至说不可代替的作用。因学生有英语、C 语言学习的基础 和习惯,故本文从英语、C 语言语法对比的角度,说明...
浅析汇编语言的功能
也正因为汇编语言的如 此特性,汇编语言做底层开发,内核开发,驱动开发 具有十分重要的意义,并且在对于程序的空间和实践 要求很高的场合, 以及需要直接控制硬件的应用...
汇编程序
重要的汇编程序 8页 2财富值 汇编程序汇集 20页 免费 一些简单的汇编程序 6页 10财富值 汇编程序实例 7页 免费 第7章 汇编程序 40页 1财富值 部分汇编程序...
汇编语言源程序的运行过程
汇编语言源程序的运行过程一、概述在 DOS 管理下 键入汇编语言 源程序 编辑程序...更重要的是,使用 DEBUG,它能使程序设计人员触及到机器的内部,能观察并修改...
24个汇编实例小程序
24 个汇编小程序题目列表:逆序输出字符串“BASED ADDRESSING” 从键盘上输入两个...重要,不能漏写 al,0 l4 dx dl,30h ah,2 21h si si,0 l5 ah,4ch ;...
汇编语言实验报告
汇编语言实验报告_化学_自然科学_专业资料。汇编语言课程设计 学院: 专业: 姓名: 学号: 1 汇编语言是计算机专业的一门重要的专业基础课,主要 介绍汇编语言程序设计...
更多相关标签:
学习汇编语言的重要性 | 汇编语言的重要性 | 人民日报重要言论汇编 | 职业教育重要文件汇编 | 重庆重要造价文件汇编 | 汇编语言重要吗 | 四川重要造价文件汇编 | 上级重要文件目录汇编 |