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

重要的汇编程序


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


相关文章:
汇编语言简介
对于训练学生掌握程序设计技术,熟悉上机操作和程序调试技术有重要作用 汇编语言组成: 达渝仁 数据传送指令 这部分指令包括通用数据传送指令 MOV、条件传送指令 CMOVcc...
汇编程序
重要的汇编程序 8页 2财富值 汇编程序汇集 20页 免费 一些简单的汇编程序 6页 10财富值 汇编程序实例 7页 免费 第7章 汇编程序 40页 1财富值 部分汇编程序...
汇编语言程序设计
汇编语言程序设计_计算机软件及应用_IT/计算机_专业资料。了解汇编语言重要性汇编语言程序设计〉课后习题及答案 作者名:不详 来源:网友提供 06年6月8日 第一...
浅析汇编语言的功能
也正因为汇编语言的如 此特性,汇编语言做底层开发,内核开发,驱动开发 具有十分重要的意义,并且在对于程序的空间和实践 要求很高的场合, 以及需要直接控制硬件的应用...
如何轻松学好汇编语言
特别是在计算机技术专业 的学习中,汇编语言具有十分重要甚至说不可代替的作用。因学生有英语、C 语言学习的基础 和习惯,故本文从英语、C 语言语法对比的角度,说明...
汇编语言零基础学习
为了使学习 汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意 力集中在最重要的几个指令上(CMP LOOP MOV JNZ……) 。但是想在 啰里吧嗦的教科...
24个汇编实例小程序
24 个汇编小程序题目列表: 1.逆序输出字符串“BASED ADDRESSING” 2.从键盘上...重要,不能漏写 al,0 l4 dx dl,30h ah,2 21h si si,0 l5 ;余数依次出...
《汇编语言程序设计》(第四版)教案及答案
汇编语言程序设计》(第四版)教案及答案_工学_高等教育_教育专区。《汇编语言...课,而且对于训练学生掌握程序设计技术、熟悉 上机操作和程序调试技术都有重要作用...
汇编语言
这样的体会和经验非 常重要, 这样我们才能真正体会到汇编语言的作用, 并且看到没有操作系统的计算机系统是 怎样的。这为以后的操作系统的学习打下了一个重要的基础...
党的十八大以来重要名词解释汇编
党的十八大以来重要名词解释汇编◆中国梦 实现全面建成小康社会、 建成富强民主...纪检监察“两为主” :推动党的纪律检查工作双重领导体制 具体化、程序化、制度...
更多相关标签: