汇编语言程序设计练习题 1. 逆序输出字符串 BASEDADDRESSING 2. 从键盘上输入 2 个一位数, 求出它们的和 ( 假设和不超过 1 位 ) 3. 试编写一段程序, 要求在长度为 100H 字节的数组中, 找出大于 42H 的无符号数的个数并存入字节单元 UP 中 ; 找出小于 42H 的无符号数的个数并存入字节单元 DOWN 中 4. 试编写一段程序, 要求对键盘输入的小写字母用大写字母显示出来 5. 编写程序, 从键盘接收一个小写字母, 然后找出它的前导字符和后续字符, 再按顺序显示这三个字符 6. 编写程序, 将一个包含有 20 个数据的数组 M 分成 2 个数组 : 正数数组 P 和负数数组 N, 并分别把这两个数组中数据的个数显示出来 7. 试编写一段程序, 求出首地址为 DATA 的 100D 字数组中的最小偶数, 并把它存放在 AX 中 8. 试编写一段程序, 要求比较两个字符串 string1 和 string2 所含字符是否相等, 如相等则显示 MATCH, 若不相同则显示 NOMATCH 9. 试编写一段程序, 从键盘接收一个四位的十六进制数, 并在终端上显示与它等值的二进制数 10. 从键盘上输入一系列以 $ 为结束符的字符串, 然后对其中的非数字字符计数, 并显示计数结果 11. 有一个首地址为 mem 的 100 个字的数组, 试编制程序删除数组中所有为零的项, 并将后续项向前压缩, 最后将数组的剩余部分补上零 12. 从键盘上输入一串字符 ( 用回车键结束, 使用 10 号功能调用 ) 放在 STRING 中, 试编制一个程序测试字符串中是否存在数字 如有, 则把 CL 的第 5 位置 1, 否则将该位置置 0 13. 在首地址为 DATA 的字数组中, 存放了 100H 个 16 位补码数, 试编写一个程序, 求出它们的平均值放在 AX 寄存器中 ; 并求出数组中有多少个数小于此平均值, 将结果放在 BX 寄存器中 14. 已知数组 A 包含 15 个互不相等的整数, 数组 B 包含 20 个互不相等的整数 试编制一个程序, 把既在 A 中又在 B 中出现的整数存放于数组 C 中 15. 设在 A B 和 D 单元中分别存放着个数 若三个数都不是 0, 则求出三个数的和冰存放在 S 单元中 ; 若其中有一个数为 0, 则把其他两个单元也清零 请编写此程序 16. 试编写一个程序, 要求比较数组 ARRAY 中的三个 16 位补码数, 并根据比较结果在终端上显示如下信息 : (1) 如果三个数都不相等则显示 0; (2) 如果三个数有两个相等则显示 1; (3) 如果三个数都相等则显示 2 17. 从键盘输入一系列字符 ( 以回车符结束 ), 冰按字母 数字及其他字符分类计数, 最后显示这三类的计数结果 18. 已定义了两个整数变量 A 和 B, 试编写程序完成下列功能 :
(1) 若两个数种有一个是奇数, 则将奇数存入 A 中, 偶数存入 B 中 ; (2) 若两个数均为奇数, 则将两数均加 1 后存回原变量 ; (3) 若两个数均为偶数, 则两个变量均不改变 19. 写一段子程序 SKIPLINES, 完成输出空行的功能 空行的行数由用户在主程序中通过键盘输入, 并将行数放在 AX 寄存器中 设有 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 单元中 20. 编写子程序嵌套结构的程序, 把整数分别用二进制和八进制形式显示出来 主程序 BANDO: 把整数字变量 VAL1 存入堆栈, 并条用子程序 PAIRS; 子程序 PAIRS: 从堆栈中取出 VAL1; 调用二进制显示程序 OUTBIN 显示出与其等效的二进制数, 输出 8 个空格 ; 调用八进制显示程序 OUTOCT 显示出与其等效的八进制数, 调用输出回车及换行符的子程序 21. 根据欧几里德辗转相除法求两个正整数 M N 的最大公约数 R 22. 某计算机端口地址 600H 的是 8 位寄存器, 其位 0~6 分别控制数码管显示中各段 D0~D6 的亮 (1) 和灭 (0), 七段数码管的各段编号为 : D0 D5 D6 D1 D4 D2 D3 试编写一个过程, 将 AL 保存的一位 10 进制数以数码管显示出来 ( 如 AL 的值为 3, 则 D0 D1 D2 D3 D6 亮,D4 D5 灭 ) 23. 简化的歌德巴赫猜想 : 任何一个大于 6 的偶数均可以表示为两个素数之和 现从键盘输入一个 0~65535 之间的无符号整数, 试验证歌德巴赫猜想 如输入数 12, 输出 : 12=5+7 如输入数 20, 输出 : 20=3+17 20=7+13 如输入数 7, 输出 : Must be even 如输入数 3, 输出 : Must be greater than or equal to 6 24. 用减奇数次数的方法, 求一个数的近似平方根, 这个平方根是一个整数 如求 17 的平方根, 可以用 17 相继减去奇数 1 3 5 7, 当结果为负数时停止, 即 : 17-1-3-5-7-9<0
可以看出,17 在减去 5 次奇数后结果变为负数, 可以近似认为 17 的平方根在 4 与 5 之间, 计算 NUM 的平方根, 如果 NUM=17, 则 ANS 中保存结果 4 25. 以下面形式定义一个长整数, 其所占用字节数由 N 得到, 比如 128 位的数 5746352413DE89674523BC9A78563412H 定义成 : NUMDB 12H,34H,56H,78H,9AH,0BCH,23H,45H DB 67H,89H,0DEH,13H,24H,35H,46H,57H N DB $-NUM 试编写一个程序, 实现对 N 字节的 NUM 的值求补, 并把求补后的值仍保存在 NUM 中 26. 根据 中华人民共和国国家标准 GB11643-1999 中有关公民身份号码的规定, 公民身份号码是特征组合码, 由十七位数字本体码和一位数字校验码组成 排列顺序从左至右依次为 : 六位数字地址码, 八位数字出生日期码, 三位数字顺序码和一位数字校验码 顺序码的奇数分给男性, 偶数分给女性 校验码是根据前面十七位数字码, 按照 ISO 7064:1983.MOD11-2 校验码计算出来的检验码 下面介绍计算校验码的算法 : 先引入公式 : ( 右边最低位为第 1 位, 左边最高位为第 18 位 ) 有了 Wi 值表后, 可以简化 S 的计算过程, 得出 S 后计算余数 Y,Y 的计算公式为 :Y=mod(S, 11), 再根据下表找出 Y 对应的校验码即为要求身份证号码的校验码 C 编写一个程序, 完成从键盘上输入一个 17 位的身份证号 ( 身份证号的前 17 位, 即上面描述中的第 18 位至第 2 位 ), 通过计算补充第 1 位后, 将完整的身份证号显示出来 27. 编写一个程序, 从键盘输入一个 0~65535 之间的 10 进制无符号数, 然后以 16 进制和六进制数形式显示出所输入的数 28. 编写一个程序, 将一个包含有 30 个字数据的数组 M 分成两个数组 : 奇数数组 ODD 和偶数数组 EVEN, 并把这两个数组中元素的个数以二进制形式显示出来 ( 不能使用 DIV/IDIV 指令 )
29. 已知在首地址为 DATA 的字数组中存放一系列有符号数 ( 首元素为数据个数 ), 试编写一个程序求出它们的平均值放在变量 AVER 中, 并求出数组中有多少个数大于该平均值, 将大于平均值的元素个数保存在变量 COUNT 中 ( 注意, 这些数据的累加和可能超出 -32768~ 32767 之间 ) 要求使用堆栈作为主程序和子程序之间的参数传递方式 30. 编写一个程序, 从键盘输入一个不长于 8 位的四进制数, 并将所输入的数以 10 进制数形式显示出来 31. 从键盘上输入一串字符 ( 用回车键结束, 使用 10 号功能调用 ), 将其中的小写英文字母变换为大写英文字母, 其他字符保持不变 然后将变换后的字符串显示出来 32. 从键盘上输入一串字符 ( 用回车键结束, 使用 10 号功能调用 ), 将其中的小写英文字母变换为大写英文字母, 其他字符保持不变 然后将变换后的字符串显示出来 33. 在 D 盘根目录建立一个文件 abc.txt, 第 1 次向文件中写入 123456 六个字符, 第 2 次增加 abcdefg 几个字符 34. 从键盘上输入文本文件 : d:temp1.txt 的内容, 然后新建一个文件 d:\temp2.txt, 把 d:temp1.txt 中的所有内容复制到 d:\temp2.txt 文件中 35. 从键盘上接收一个有符号的十进制数, 然后在下一行用十进制输出此有符号数 36. 从键盘上输入 10 个人名, 然后把它们按照升序的顺序排序 37. 在数据区中有 10 个不同的信息, 编号为 0-9, 每个信息包括 30 个字符 现在要求编制一个程序 : 从键盘上接收 0-9 之间的一个编号, 然后在屏幕上显示出相应的信息内容 38. 从键盘上接收 0-FFFFH 的十六进制正数, 转换为十进制数并在屏幕上显示出来 39. 主程序 MAIN 和过程 PROADD 在同一源文件中, 要求分别使用变量名 地址表 堆栈传送参数的方法, 用过程 PROADD 累加数组中的所有元素, 并把和 ( 不考虑溢出的可能性 ) 送到指定的存储单元中去 40. 从键盘上取得一个十进制数, 然后把该数用十六进制的形式显示出来 要求子程序用寄存器参数传送的方法 41. 使用跳跃表法, 根据 AL 寄存器中哪一位位 1( 从低位到高位 ) 把程序转移到 8 个不同的程序分支去 42. 在附加段中, 有一个按从小到大的顺序排列的无符号数数组, 其首地址存放在 DI 寄存器中, 数组中的第一个单元存放着数组长度 在 AX 中有一个无符号数, 要求在数组中查找 (AX), 如找到, 则使 CF=-, 并在 SI 中给出该元素在数组中的偏移地址 ; 如未找到, 则使 CF=1. 43. 在附加段中有一个字数组, 其首地址已存放在 DI 寄存器中, 在数组的第一个字中存放着该数组的长度 要求编制一个程序使该数组中的数按照从小到大的次序排列整齐 ( 分别使用起泡排序算法 交换标志 2 种方法 ) 44. 试编制一个程序 : 从键盘输入一行字符, 要求第一个键入的字符必须是空格符, 如不是, 则退出程序 ; 如是, 则开始接收键入的字符并顺序存放在首地址为 buffer 的缓冲区中 ( 空格符不存入 ), 直到接收到第二个空格符时退出程序 45. 设有 2 个数组 X 和 Y X 数组中有 X 1,X 2,,X 10 ; Y 数组中有 Y 1,Y 2,,Y 10 试编制程序计算 Z 1 =X 1 +Y 1 Z 5 =X 5 -Y 5 Z 8 =X 8 -Y 8
Z 2 =X 2 +Y 2 Z 6 =X 6 +Y 6 Z 9 =X 9 +Y 9 Z 3 =X 3 +Y 3 Z 7 =X 7 -Y 7 Z 10 =X 10 +Y 10 Z 4 =X 4 -Y 4 结果存入 Z 数组 46. 在附加段中, 有一个首地址为 LIST 和未经排序的字数组 在数组的第一个字中, 存放着该数组的长度, 数组的首地址已存放在 DI 寄存器中,AX 寄存器中存放着一个数 要求编制一个程序 : 在数组中查找该数, 如果找到此数, 则把它从数组中删除 47. 在 ADDR 单元中存放着数 Y 的地址, 试编制一个程序把 Y 中 1 的个数存入 COUNT 单元中 48. 试编制一个程序, 把 BX 寄存器内的二进制数用十六进制数的形式在屏幕上显示出来 49. 编写一个程序, 计算 1 + 2 + 3 + 4 + + N 的累加和, 并把累加和与 10 进制形式显示出来 ( 不能使用公式计算 累加和 =N (N+1)/2, 必须使用程序实现循环累加来计算 ) 50. 编写一个程序, 新建一个文件 :d:\abc.txt, 从键盘输入文件的内容 ( 不超过 100 个字符 ) 然后新建一个文件:d:\def.txt, 将 d:\abc.txt 文件的内容复制到 d:\def.txt