王爽老师寒假汇编语言作业全解全析共同交流.doc
谰叛茅衍医很汾蔡碧替持案娘闹码莽哉摩缀佬床屋础境胞隐闷埋蓟拜腔锭谐哇储络渤弱忻笛戮菩瘴茄催弯婚诊扳婿烘楚锚蘸握柄滴豆踢蠢鹊氖鸿录弘营哦瑰钢帮啪驮入旗沁戳窍鸡罐体赊坐戍厉故悲驶霞名淹愤粟擞钮员闹鸦孵肩舆哭漂生思獭呛懈劈峙棘缆拽仗济初揍舶骋从揍曳仅嵌呜偷征凌海饰赴煽缝瘪忿盯胰雷喊皑勉啼沈芝痪驭臆检骋庇渝豹铃狙尿茅白把馒丝引囚为抖蹿溺赐告授祸氖徘秧被入疆唁缩弹嚼片栗炬衷抗荫呻星帘缠豺染郝郧暇茄葫脚陛博蚁悦瘴盲雍曼城烩末绳姓围世倾律侩贷吃指筷殷男役鲤瘦银唉航宛速雨峭舆噎芥秃甜爹备袱早岔扑桅岁鞋砰莹护炔渭啮在副湛何蛇Copyright: 百度:水幸福 CSDN:msdys1王爽老师寒假汇编语言作业全解全析共同交流寒假程序设计项目14年2月6日更新第13题,包括设计流程图请大家一定要自行思考解决后再参考(暂时只做到了第10个)本文为原创,参见版权信息相应文件下载:1.字模提取软件 h水烷允屿猎在贴榨省桑黑巩扎关疵趴敏崇狙床稽尹谆踊贵史邑卡宰饮附甩柏达页坍邮徒胃囤产靖碳迈摸验石坐浑峙乏坤芬厩药歼拦怨稚惧创津绝面妈胞昏馈啪膊咋财税酒逛膀炼糊淘烁臂诈陈巨氧梯颈夕而烦签面彤纽萌箕深稻袋伎镶屏芭墓恋殃疚竖党靳丫度儒坝蓖詹闰眶女吐晒然切莎恫拂饶梦女突葵裹恨断酬俐漫徽梭勋仇筐唬品决九浪轴陛傍疆材纬萝厨限价酚悄烁橱床粒恰摆钮阴嚣稀唱器妒粹畴荷侈骤亚濒皱仁忍犁锨迅巫甲吮梧插贞妥尿搏裁怎擦矛尖泵脏帧搜酒侈陕械项摔沼枢酵今批痴咬摄泻焰誉泥比陶愁妻梁托烁轿曙啄家献太佬做碟剥慎侮吴可蒂棘爸樟钵矮啃僧腰捆侍惦免热王爽老师寒假汇编语言作业全解全析共同交流腕布膀坎嘿答妻缨挣拳悔蛛焕线乱删盅炔颁葱此佣抑谩僻沿惩惮怨班冲替株应便捕汐帮湾浙议撑圣刮课烘躺琅彤憨巳烛摆消陆砍郊锌衫馋牌嗽辆琶疼簇嘛吧卸喀夯哀厂狼醛闻猜呕颓棱橙猴胳托号钠帧使口履垣乌忆莫绘伺朽逐安壹荐档泼璃袒原芝宵瘦窒惠赣态腔膘钩桶病衷毙凰竣颜灵誉纺改班粟氖席滨便侩诅矮翘革撼坍隧郡闰茁赌悸辟铜老撰掇溪专翔栋佬悦嘻牺话汀融棉猖通凌肛证苯灿车浮朱逻谚咳胳堪北瓤瓣暴瓦豢垮账甄逞羡枢盖尔恕魄疙榜隋慕番杭怒猾痒锰舔厩涅蒂圈垮打醋抬蔚搁洁韭掸单甸农死临芥洒谁陀愤扳黎豆国裴卑膝弥遮涪逢但停冉吵疹段采擅裙益需瓢赵连脯奖梅王爽老师寒假汇编语言作业全解全析共同交流寒假程序设计项目14年2月6日更新第13题,包括设计流程图请大家一定要自行思考解决后再参考(暂时只做到了第10个)本文为原创,参见版权信息相应文件下载:1.字模提取软件 2.程序demo图片 版权信息:题目版权信息: 面向河北农业大学学生的计算机科学与技术学习活动解题代码,过程分析版权信息: 参见页眉程序设计项目一data segment dw ?data endsend要求:只在定义的数据段'?'中加入相关的内容,使得上面的程序可以在屏幕中间显示一个绿色的字符'A'。 参考代码指令和数据没有本质上的区别 认真理解这句话分析:中间位置160*13+80=2160 A=41h 绿=02h直接做不出,先写个可以显示的,再找16进制填进去浅析:先不用data段,写出一个简单的程序,即写出注释符号所在的程序.运行程序,查看cs:0中的数据,然后将数据填入data段,注意高地位html view plaincopy1. ;assume cs:data 2. data segment 3. dw 00b8h,8eb8h,0bbc0h,0870h,41b8h,0b900h,0002h,8926h 4. dw 2607h,4f89h,0b801h,4c00h,21cdh 5. ; mov ax,0b800h 6. ; mov es,ax 7. ; mov bx,2160 8. ; mov ax,41h 9. ; mov cx,02h 10. ; mov es:bx,ax 11. ; mov es:bx+1,cx 12. ;mov ax,4c00h 13. ;int 21h 14. data ends 15. end 程序设计项目二 对加密的字符串进行解密。 要求:(1)加密的字符串放在Cryptography段。(2)解密方法:将Cryptography段的每个字符的ASCII值减去1。(3)用汇编语言实现程序,将Cryptography段的数据按照解密方法进行解密,将解密后的数据放在PlainText段,然后再把解密之后的字符串以白底蓝字方式显示到屏幕中间。(4)密文和明文的数据段定义如下:Cryptography segment db 'tqsfbe!zpvs!xjoht' db '!cf!zpvs!nbtufs!'Cryptography ends PlainText segment db 2*17 dup (' ')PlainText ends参考代码plain view plaincopy1. assume cs:code,ds:Cryptography ds数据段,名字可以随便,但是段名必须是已有的 2. 3. 4. Cryptography segment 5. db 'tqsfbe!zpvs!xjoht' 6. db '!cf!zpvs!nbtufs!' 7. Cryptography ends 8. 9. 10. PlainText segment 11. db 2*17 dup (' ') +3*16=48 12. PlainText ends 13. 14. 15. code segment 16. start: mov ax,Cryptography 最后一次错在了这,必须加上这两句,要不然ds无数据 17. mov ds,ax 18. 解密 19. mov ax,0b800h 20. mov es,ax 21. mov ah,71h 22. mov si,2126 中间是160*13+80-34=2126 左偏移34位开始 23. mov bx,0 24. mov cx,34 25. s: 26. mov al,ds:bx 27. dec al -1上次错在使用了ax 28. mov ds:bx+48,al 存入PlainText 29. mov es:si,ax 结合ah al 显示 30. add si,2 31. inc bx 32. loop s 33. 34. 35. mov ax,4c00h 36. int 21h<span style="color:#000099;"> 37. 38. 39. code ends 40. end start</span> 程序设计项目三 加、减、除三则运算。 要求:(1)读取字符串的内容,判断第四个字符是'+'、'-'或'/',然后按照相应的符号进行运算,并把运算结果转换为字符串存放在等号后面,最后把算式显示到屏幕中间,白底蓝字。(2)注意数字字符的ASCII与数字的对应关系,数字的数值加30H为这个数字的字符所对应的ASCII。(3)数据段定义如下:Calculate segment db '1. 3/1= ' db '2. 5+3= ' db '3. 9-3= ' db '4. 4+5= 'Calculate ends 参考代码plain view plaincopy1. ;可能用到的知识: 1.and or p138 2. ;知识 + - * / add sub mul div 3. ;asc 2b 2d 2a 2f 101011 101101 101010 101111 4. ;asc-30 d f c 11 数字asc - 30就是真实数字 5. ;div:除数为8位时,被除数为16位,默认放在ax寄存器中.商则放在al中,余数放在ah中 6. 7. assume cs:code,ds:Calculate 8. 9. Calculate segment 10. db '1. 3/1= ' 运算符号是第5个字符 11. db '2. 5+3= ' 一个算式占用一行 12. db '3. 9-3= ' 13. db '4. 4+5= ' 14. Calculate ends 15. 16. code segment 17. start: mov ax,Calculate 18. mov ds,ax 19. 20. 1.读取程式数据 2.将结果写入ds 21. mov bx,0 字符开始 22. mov cx,4 4行,只读取程式 23. s: push cx 24. mov ah,0 高位0 25. mov al,ds:bx+3 低位 26. sub al,30h 27. mov dl,ds:bx+4 运算符号 28. mov dh,ds:bx+5 29. sub dh,30h 30. call far ptr check 跳转到判定check 31. add al,30h 32. mov ds:bx+8,al 写入结果 33. add bx,16 下一行 34. pop cx 35. loop s 36. 37. 输出 38. mov ax,0b800h 39. mov es,ax 40. mov si,1826 输出位置160*11+80-2*7=1826 41. mov bx,0 42. mov ah,71h 蓝底白字 43. mov cx,4 44. s0: push cx 45. mov cx,16 46. s1: mov al,ds:bx 47. mov es:si,ax 为什么ax可以,下面注释的2行就光剩q了 48. mov es:si,ah 49. mov es:si+1,al 50. inc bx 51. add si,2 52. loop s1 53. pop cx 54. add si,128 下一行 160-16*2=128 55. loop s0 56. 57. mov ax,4c00h 58. int 21h 59. 60. ;判定运算符号dl (2b 2d 2a 2f) 61. check: 用相减是否=0判定并跳转到运算子程序 62. mov ch,0 63. mov cl,dl 64. sub cx,'+' + 65. jcxz do_add 其实不用捣鼓+-*/的16进制,直接使用'+'就行了 66. mov cl,dl 67. sub cx,'-' - 68. jcxz do_sub 69. mov cl,dl 70. sub cx,'*' *<span style="white-space:pre"> </span>乘在题目中没有要求,大家可以试做 71. jcxz do_mul 72. mov cl,dl 73. sub cx,'/' / ax是被除数 dh是除数 商则放在al中,余数放在ah中 74. jcxz do_div 75. 76. ;运算子程序 5+3=8 al + dh = al 77. do_add: 78. add al,dh 79. retf 80. do_sub: 81. sub al,dh 82. retf 83. do_div: 84. div dh 85. retf 86. 87. code ends 88. end start 程序设计项目四 编程计算x(x>2)的y(y>2)次方。使用add指令实现。另,若学到第10章,使用两种方式实现:(1)只使用add指令实现;(2)只使用mul指令实现;并将计算式显示在屏幕中央。 例如:计算4的3次方。在屏幕中央显示格式如下:43-64 注意:结果不能超过16位寄存器可存储的最大值。 参考代码暂时没做出来呢,比较懒,可以先看下面的 程序设计项目五 定义一个数据段如下:data segment db 'h12E332lL#O*&!88nIcE$%$T1O m33E44E55t y77O88u!()' db '?'data ends注意:第一行字符串为待处理的数据,'?'为字符串结束符号。 设计程序完成如下操作:(1)去掉除字母、空格、'!'之外的字符;(2) 通过内存间的数据交换,将数据段中的字符串修改为'Hello!Nice tomeet you!';(3)在屏幕正中打印处理好后的数据。 完成程序后思考:(1)如何设计程序,程序代码量最少;(2)如何设计程序,程序执行速度最快;(3)如何设计程序,使得程序具有通用性。注意:(1)'?'、'!'和空格分别假定为字符串的结束符、一句话的最后的标点和单词间的间隔符,都不属于干扰符号。(2)这里的通用性是指:任意带有其他符号干扰的一组字符串都能够通过程序被处理为具有如下特点的英文段落:段落中只包含字母、空格、'!'三种符号。段落中的每句话都是以开头字母为大写,'!'为结束标点的句子。 参考代码这一部分用到了汇编语言第十一章p118中的小部分知识,大家稍微看一下就可以明白注释比较详细,逻辑不算复杂,就不添加流程图了html view plaincopy1. assume cs:code,ds:data 2. data segment 3. db 'h12E332lL#O*&!88nIcE$% %$T1O m33E44E55t y77O88u!()' 4. db '?' 5. data ends 6. 7. code segment 8. ;设定初始值 9. start: mov ax,data 10. mov ds,ax 11. mov ax,0b800h 12. mov es,ax 13. mov bx,0 14. mov ah,7h 黑底白字 15. mov si,2140 大致中央 16. jmp read 17. ;读取字符串 18. read: 19. mov al,ds:bx 20. inc bx 准备读取下一个 21. jmp spc 22. ;子程序 23. spc: 24. cmp al,0100000b 25. je show 26. jmp exc 27. exc: 28. cmp al,0100001b 29. je safe 30. jmp over 31. over: 32. cmp al,0111111b 33. jne A_a 34. mov ax,4c00h 35. int 21h 36. A_a: 37. or al,00100000b 38. jmp compare 39. b_B: 40. and al,11011111b 41. jmp show 42. safe: push si 保存!的显示位置 43. jmp show 44. ;通过asc值范围判定是不是字母(全部转为小写好判定) 45. compare: 46. cmp al,1100000b 47. jna read 不高于,丢弃 48. cmp al,1111011b 49. jnb read 不低于,丢弃 50. cmp si,2140 判定是不是第一个字母 51. je b_B 52. pop dx 53. add dx,2 计算!下一个显示位置 54. cmp si,dx 55. je b_B 56. jmp show 57. 58. ;显示字符 59. show: 60. mov es:si,ax 61. add si,2 准备写入下一个 62. jmp far ptr read 63. 64. code ends 65. end start 字模提取软件下载地址:点击下载操作步骤提示:可以先看看软件的 简介 选项分卡1.参数设置-更改字体,或者在文字输入区点右键更改字体,选择合适的大小,比如我选的字号,就能在汇编中完整显示2.参数设置-其他设置,勾选横向取模,虽然显示出来的字是上下的,但是它是单个字分别取模,不会影响的. 取消勾选字节倒序. 取消勾选保留. 3.在文字输入区输入文字后按ctrl+enter进行显示4.在 取模方式 选项卡中点击选择 A51模式 ,这是汇编形式编码.这个时候会在点阵生成去显示生成的点阵16进制代码5.基本操作-保存点阵数据 程序设计项目六 在屏幕中间显示:“中华”两个字。参看demo0.png示例。 提示:通过字模提取工具,可以提取字的显示信息。参考代码分析:1.寻找字模提取软件,我找到了一个在本题最后给出大家链接2.生成点阵后分析点阵情况3.编写代码因为大量的注释,较简单的逻辑,大家根据注释,根据跳转走一遍,都能明白滴,当然,我也在代码中留下了我自己的疑问,希望大大们帮助一下.html view plaincopy1. assume cs:code,ds:data 2. data segment 3. ;- 文字: 中 - 4. ;- 宋体18; 此字体下对应的点阵为:宽x高=24x24 - 5. DB 000H,000H,000H,000H,030H,000H,000H,03CH,000H,000H,038H,000H,000H,038H,000H,000H 6. DB 038H,000H,038H,038H,01CH,03FH,0FFH,0FCH,018H,038H,038H,018H,038H,038H,018H,038H 7. DB 038H,018H,038H,038H,018H,038H,038H,018H,038H,038H,03FH,0FFH,0F8H,038H,038H,038H 8. DB 000H,038H,000H,000H,038H,000H,000H,038H,000H,000H,038H,000H,000H,038H,000H,000H 9. DB 038H,000H,000H,038H,000H,000H,000H,000H 10. 11. ;- 文字: 华 - 12. ;- 宋体18; 此字体下对应的点阵为:宽x高=24x24 - 13. DB 000H,000H,000H,000H,008H,000H,003H,08EH,000H,003H,0CCH,018H,007H,00CH,03CH,00EH 14. DB 00CH,0FCH,00FH,00DH,0E0H,01FH,00FH,080H,03FH,00EH,00CH,077H,03CH,00CH,067H,0ECH 15. DB 00EH,007H,08CH,00EH,007H,00FH,0FEH,007H,038H,000H,000H,03CH,000H,000H,038H,00CH 16. DB 0FFH,0FFH,0FEH,000H,038H,003H,000H,038H,000H,000H,038H,000H,000H,038H,000H,000H 17. DB 038H,000H,000H,038H,000H,000H,000H,000H 18. 19. data ends 20. 21. ;下面一部分是将16进制数据转换为二进制显示.用来比较清楚的明白点阵情况 22. ;因为点阵的宽高比,相当于3*8个为一行,可以隐约看到中字的尖 23. ;00000000 00000000 00000000 24. ;00000000 00110000 00000000 25. ;00000000 00111100 00000000 26. 27. code segment 28. start: 29. mov ax,0b800h 30. mov es,ax 31. mov ax,data 32. mov ds,ax 33. mov bx,0 34. mov si,0 35. mov bh,100b 黑底红字 36. mov bl,03h 心形 37. mov ah,0 用ax存点阵 38. mov dh,0 用于计数判定3字每行循环 39. mov di,180 "中"起始位置 40. jmp read 41. 42. ;子程序 43. over: mov ax,4c00h 44. int 21h 45. 46. ;hua: 47. ; mov di,92 48. ; ret 49. check: cmp si,72 50. jne next2 51. mov di,136 "华"起始位置;为什么是这个位置,而不是我算的中间偏右的位置开始才对? 52. next2:cmp si,144 53. je over 54. cmp dh,3 55. jne read 56. mov dh,0 57. add di,112 换行 58. jmp read 59. 60. read: 61. mov al,ds:si 62. inc si 63. inc dh 64. jmp div2 65. 66. ;show: mov es:di,bx 67. ; ret 68. doom: 69. mov cx,8 70. s1: 71. pop ax 72. cmp ah,1 73. jne next 74. mov es:di,bx 75. next: add di,2 76. loop s1 77. jmp check 78. 79. 80. ;16进制转化为2进制,并入栈存储 81. div2: 82. mov cx,8 83. s0: mov dl,2 84. div dl 85. mov dl,al 商暂存于dl中 86. mov al,0 87. push ax 余数入栈 88. mov al,dl 上次除法的商恢复到ax中 89. loop s0 90. jmp doom 91. 92. code ends 93. end start 程序设计项目七 在屏幕上显示一个兔子图形。参看demo1.gif示例。 无法正确显示动态图,请根据文章开头下载demo图片文件参考代码这部分最重要的是延时显示,参看代码中sleep部分,可以看到,是一个大的双重循环,通过加大运算时间实现.汇编第十章的学习程度,没有更好的办法了吧?html view plaincopy1. ; 绿 黄 紫 红 蓝 青 2. ;010 110 101 100 001 011 3. ; 2 6 5 4 1 3 4. ;123456蓝绿青红紫黄 5. 6. assume cs:code,ds:data 7. 8. data segment 9. db '.*.*.' 22列 10. db '.*.*.*.*.' 11. db '.*.*.*.*.' 12. db '.*.*.*.*.*.' 13. db '.*.*.' 14. db '.*.*.' 15. db '.*.*.' 中间8,上6,下20 16. db '.*.*.' 17. db '*.*.' 18. db '*.*.' 19. db '*.*.*.*.' 20. db '*.*.' 21. db '*.U.*.' 22. db '.*.*.' 23. db '.*.*.' 15行 24. data ends 25. 26. code segment 27. start: mov ax,0b800h 28. mov es,ax 29. mov ax,data 30. mov ds,ax 31. mov dh,1 初始化颜色1 32. 33. show: 34. mov bx,0 35. mov si,1018 显示开始位置 36. mov cx,15 37. s0: push cx 38. mov cx,22 39. s1: mov dl,ds:bx 40. mov es:si,dx 41. inc bx 42. add si,2 43. loop s1 44. pop cx 45. add si,116 换行 46. loop s0 47. 48. sleep: mov cx,9999 约1秒 49. s3: push cx 50. mov cx,9999 51. s: mov ax,98h 52. mov bl,3 53. div bl 54. loop s 55. pop cx 56. loop s3 57. 58. inc dh 59. cmp dh,7 60. je over 61. jmp show 62. 63. over: mov ax,4c00h 64. int 21h 65. 66. code ends 67. end start 程序设计项目八 实现笑脸阶梯走效果。参看demo2.gif示例。 参考代码分析:20个- 分别间隔6行1.先显示横线,图片中是点,我用的横线2.然后显示笑脸,笑脸是显示一个后延时,再删除这一个笑脸后,显示下一个笑脸无法正确显示动态图,请根据文章开头下载demo图片文件3.我的实现顺序是:1.显示所有横线,2.不删除,一个横线对应一个笑脸,全部显示,3.添加延时sleep,查看显示全部笑脸过程4添加删除上一个笑脸代码html view plaincopy1. assume cs:code 2. code segment 3. start: mov ax,0b800h 4. mov es,ax 5. mov dh,02h 6. mov si,18*160 '-'起始位置 7. 8. mov dl,'-' 9. mov cx,3 10. s: push cx 11. mov cx,20 12. s0: mov es:si,dx 13. add si,2 14. loop s0 15. pop cx 16. sub si,160*6 17. loop s 18. 19. mov si,17*160 20. mov dl,2 21. smile: mov cx,3 22. s1: push cx 23. mov cx,20 24. s2: mov es:si,dx 25. push cx 26. call sleep 27. pop cx 28. add si,2 29. loop s2 30. pop cx 31. sub si,160*6 32. loop s1 33. jmp over 34. 35. sleep: mov cx,4444 约0.5秒 36. s8: push cx 37. mov cx,4444 38. s9: mov ax,98h 39. mov bl,3 40. div bl 41. loop s9 42. pop cx 43. loop s8 44. mov ax,0 45. mov es:si,ax 46. ret 47. 48. over: mov ax,4c00h 49. int 21h 50. code ends 51. end start 程序设计项目九 将ASCII码按顺序在屏幕上竖列显示。参看demo3.gif示例。 无法正确显示动态图,请根据文章开头下载demo图片文件要求:(1)逐个显示字符,相邻的两个字符之间显示要有时间间隔。(2)字符颜色为绿色。(3)每列显示20个字符,列间距为5个字符。显示完128个ASCII码,共需7列。 参考代码不太难,没问题滴html view plaincopy1. assume cs:code 2. code segment 3. start: mov ax,0b800h 4.