王爽老师寒假汇编语言作业全解全析共同交流.doc

上传人:本田雅阁 文档编号:2555192 上传时间:2019-04-07 格式:DOC 页数:37 大小:707.01KB
返回 下载 相关 举报
王爽老师寒假汇编语言作业全解全析共同交流.doc_第1页
第1页 / 共37页
王爽老师寒假汇编语言作业全解全析共同交流.doc_第2页
第2页 / 共37页
王爽老师寒假汇编语言作业全解全析共同交流.doc_第3页
第3页 / 共37页
王爽老师寒假汇编语言作业全解全析共同交流.doc_第4页
第4页 / 共37页
王爽老师寒假汇编语言作业全解全析共同交流.doc_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《王爽老师寒假汇编语言作业全解全析共同交流.doc》由会员分享,可在线阅读,更多相关《王爽老师寒假汇编语言作业全解全析共同交流.doc(37页珍藏版)》请在三一文库上搜索。

1、Copyright: 百度:水幸福 CSDN:msdys王爽老师寒假汇编语言作业全解全析共同交流寒假程序设计项目14年2月6日更新第13题,包括设计流程图请大家一定要自行思考解决后再参考(暂时只做到了第10个)本文为原创,参见版权信息相应文件下载:1.字模提取软件http:/ 面向河北农业大学学生的计算机科学与技术学习活动解题代码,过程分析版权信息: 参见页眉程序设计项目一data segment dw ?data endsend要求:只在定义的数据段?中加入相关的内容,使得上面的程序可以在屏幕中间显示一个绿色的字符A。参考代码指令和数据没有本质上的区别 认真理解这句话分析:中间位置160*1

2、3+80=2160 A=41h 绿=02h直接做不出,先写个可以显示的,再找16进制填进去浅析:先不用data段,写出一个简单的程序,即写出注释符号所在的程序.运行程序,查看cs:0中的数据,然后将数据填入data段,注意高地位htmlview plaincopy1. ;assumecs:data2. datasegment3. dw00b8h,8eb8h,0bbc0h,0870h,41b8h,0b900h,0002h,8926h4. dw2607h,4f89h,0b801h,4c00h,21cdh5. ;movax,0b800h6. ;moves,ax7. ;movbx,21608. ;mo

3、vax,41h9. ;movcx,02h10. ;moves:bx,ax11. ;moves:bx+1,cx12. ;movax,4c00h13. ;int21h14. dataends15. end程序设计项目二对加密的字符串进行解密。要求:(1)加密的字符串放在Cryptography段。(2)解密方法:将Cryptography段的每个字符的ASCII值减去1。(3)用汇编语言实现程序,将Cryptography段的数据按照解密方法进行解密,将解密后的数据放在PlainText段,然后再把解密之后的字符串以白底蓝字方式显示到屏幕中间。(4)密文和明文的数据段定义如下:Cryptograp

4、hy segment db tqsfbe!zpvs!xjoht db !cf!zpvs!nbtufs!Cryptography endsPlainText segment db 2*17 dup ( )PlainText ends参考代码plainview plaincopy1. assumecs:code,ds:Cryptography;ds数据段,名字可以随便,但是段名必须是已有的2. 3. 4. Cryptographysegment5. dbtqsfbe!zpvs!xjoht6. db!cf!zpvs!nbtufs!7. Cryptographyends8. 9. 10. PlainT

5、extsegment11. db2*17dup();+3*16=4812. PlainTextends13. 14. 15. codesegment16. start:movax,Cryptography;最后一次错在了这,必须加上这两句,要不然ds无数据17. movds,ax18. ;解密19. movax,0b800h20. moves,ax21. movah,71h22. movsi,2126;中间是160*13+80-34=2126左偏移34位开始23. movbx,024. movcx,3425. s:26. moval,ds:bx27. decal;-1上次错在使用了ax28.

6、movds:bx+48,al;存入PlainText29. moves:si,ax;结合ahal显示30. addsi,231. incbx32. loops33. 34. 35. movax,4c00h36. int21h37. 38. 39. codeends40. endstart程序设计项目三加、减、除三则运算。要求:(1)读取字符串的内容,判断第四个字符是+、-或/,然后按照相应的符号进行运算,并把运算结果转换为字符串存放在等号后面,最后把算式显示到屏幕中间,白底蓝字。(2)注意数字字符的ASCII与数字的对应关系,数字的数值加30H为这个数字的字符所对应的ASCII。(3)数据段定

7、义如下:Calculate segment db 1. 3/1= db 2. 5+3= db 3. 9-3= db 4. 4+5= Calculate ends 参考代码plainview plaincopy1. ;可能用到的知识:1.andorp1382. ;知识+-*/addsubmuldiv3. ;asc2b2d2a2f1010111011011010101011114. ;asc-30dfc11数字asc-30就是真实数字5. ;div:除数为8位时,被除数为16位,默认放在ax寄存器中.商则放在al中,余数放在ah中6. 7. assumecs:code,ds:Calculate8.

8、 9. Calculatesegment10. db1.3/1=;运算符号是第5个字符11. db2.5+3=;一个算式占用一行12. db3.9-3=13. db4.4+5=14. Calculateends15. 16. codesegment17. start:movax,Calculate18. movds,ax19. 20. ;1.读取程式数据2.将结果写入ds21. movbx,0;字符开始22. movcx,4;4行,只读取程式23. s:pushcx24. movah,0;高位025. moval,ds:bx+3;低位26. subal,30h27. movdl,ds:bx+4

9、;运算符号28. movdh,ds:bx+529. subdh,30h30. callfarptrcheck;跳转到判定check31. addal,30h32. movds:bx+8,al;写入结果33. addbx,16;下一行34. popcx35. loops36. 37. ;输出38. movax,0b800h39. moves,ax40. movsi,1826;输出位置160*11+80-2*7=182641. movbx,042. movah,71h;蓝底白字43. movcx,444. s0:pushcx45. movcx,1646. s1:moval,ds:bx47. mov

10、es:si,ax;为什么ax可以,下面注释的2行就光剩q了48. ;moves:si,ah49. ;moves:si+1,al50. incbx51. addsi,252. loops153. popcx54. addsi,128;下一行160-16*2=12855. loops056. 57. movax,4c00h58. int21h59. 60. ;判定运算符号dl(2b2d2a2f)61. check:;用相减是否=0判定并跳转到运算子程序62. movch,063. movcl,dl64. subcx,+;+65. jcxzdo_add;其实不用捣鼓+-*/的16进制,直接使用+就行

11、了66. movcl,dl67. subcx,-;-68. jcxzdo_sub69. ;movcl,dl70. ;subcx,*;*乘在题目中没有要求,大家可以试做71. ;jcxzdo_mul72. movcl,dl73. subcx,/;/ax是被除数dh是除数商则放在al中,余数放在ah中74. jcxzdo_div75. 76. ;运算子程序;5+3=8al+dh=al77. do_add:78. addal,dh79. retf80. do_sub:81. subal,dh82. retf83. do_div:84. divdh85. retf86. 87. codeends88.

12、 endstart程序设计项目四编程计算x(x2)的y(y2)次方。使用add指令实现。另,若学到第10章,使用两种方式实现:(1)只使用add指令实现;(2)只使用mul指令实现;并将计算式显示在屏幕中央。例如:计算4的3次方。在屏幕中央显示格式如下:43-64注意:结果不能超过16位寄存器可存储的最大值。参考代码暂时没做出来呢,比较懒,可以先看下面的程序设计项目五定义一个数据段如下:data segment db h12E332lL#O*&!88nIcE$%$T1O m33E44E55t y77O88u!() db ?data ends注意:第一行字符串为待处理的数据,?为字符串结束符号。

13、设计程序完成如下操作:(1)去掉除字母、空格、!之外的字符;(2) 通过内存间的数据交换,将数据段中的字符串修改为Hello!Nice tomeet you!;(3)在屏幕正中打印处理好后的数据。完成程序后思考:(1)如何设计程序,程序代码量最少;(2)如何设计程序,程序执行速度最快;(3)如何设计程序,使得程序具有通用性。注意:(1)?、!和空格分别假定为字符串的结束符、一句话的最后的标点和单词间的间隔符,都不属于干扰符号。(2)这里的通用性是指:任意带有其他符号干扰的一组字符串都能够通过程序被处理为具有如下特点的英文段落:段落中只包含字母、空格、!三种符号。段落中的每句话都是以开头字母为大

14、写,!为结束标点的句子。参考代码这一部分用到了汇编语言第十一章p118中的小部分知识,大家稍微看一下就可以明白注释比较详细,逻辑不算复杂,就不添加流程图了htmlview plaincopy1. assumecs:code,ds:data2. datasegment3. dbh12E332lL#O*&!88nIcE$%$T1Om33E44E55ty77O88u!()4. db?5. dataends6. 7. codesegment8. ;设定初始值9. start:movax,data10. movds,ax11. movax,0b800h12. moves,ax13. movbx,014.

15、 movah,7h;黑底白字15. movsi,2140;大致中央16. jmpread17. ;读取字符串18. read:19. moval,ds:bx20. incbx;准备读取下一个21. jmpspc22. ;子程序23. spc:24. cmpal,0100000b25. jeshow26. jmpexc27. exc:28. cmpal,0100001b29. jesafe30. jmpover31. over:32. cmpal,0111111b33. jneA_a34. movax,4c00h35. int21h36. A_a:37. oral,00100000b38. jm

16、pcompare39. b_B:40. andal,11011111b41. jmpshow42. safe:pushsi;保存!的显示位置43. jmpshow44. ;通过asc值范围判定是不是字母(全部转为小写好判定)45. compare:46. cmpal,1100000b47. jnaread;不高于,丢弃48. cmpal,1111011b49. jnbread;不低于,丢弃50. cmpsi,2140;判定是不是第一个字母51. jeb_B52. popdx53. adddx,2;计算!下一个显示位置54. cmpsi,dx55. jeb_B56. jmpshow57. 58.

17、 ;显示字符59. show:60. moves:si,ax61. addsi,2;准备写入下一个62. jmpfarptrread63. 64. codeends65. endstart字模提取软件下载地址:点击下载操作步骤提示:可以先看看软件的 简介 选项分卡1.参数设置-更改字体,或者在文字输入区点右键更改字体,选择合适的大小,比如我选的字号,就能在汇编中完整显示2.参数设置-其他设置,勾选横向取模,虽然显示出来的字是上下的,但是它是单个字分别取模,不会影响的. 取消勾选字节倒序. 取消勾选保留. 3.在文字输入区输入文字后按ctrl+enter进行显示4.在 取模方式 选项卡中点击选择

18、 A51模式 ,这是汇编形式编码.这个时候会在点阵生成去显示生成的点阵16进制代码5.基本操作-保存点阵数据程序设计项目六在屏幕中间显示:“中华”两个字。参看demo0.png示例。提示:通过字模提取工具,可以提取字的显示信息。参考代码分析:1.寻找字模提取软件,我找到了一个在本题最后给出大家链接2.生成点阵后分析点阵情况3.编写代码因为大量的注释,较简单的逻辑,大家根据注释,根据跳转走一遍,都能明白滴,当然,我也在代码中留下了我自己的疑问,希望大大们帮助一下.htmlview plaincopy1. assumecs:code,ds:data2. datasegment3. ;-文字:中-4

19、. ;-宋体18;此字体下对应的点阵为:宽x高=24x24-5. DB000H,000H,000H,000H,030H,000H,000H,03CH,000H,000H,038H,000H,000H,038H,000H,000H6. DB038H,000H,038H,038H,01CH,03FH,0FFH,0FCH,018H,038H,038H,018H,038H,038H,018H,038H7. DB038H,018H,038H,038H,018H,038H,038H,018H,038H,038H,03FH,0FFH,0F8H,038H,038H,038H8. DB000H,038H,000

20、H,000H,038H,000H,000H,038H,000H,000H,038H,000H,000H,038H,000H,000H9. DB038H,000H,000H,038H,000H,000H,000H,000H10. 11. ;-文字:华-12. ;-宋体18;此字体下对应的点阵为:宽x高=24x24-13. DB000H,000H,000H,000H,008H,000H,003H,08EH,000H,003H,0CCH,018H,007H,00CH,03CH,00EH14. DB00CH,0FCH,00FH,00DH,0E0H,01FH,00FH,080H,03FH,00EH,00

21、CH,077H,03CH,00CH,067H,0ECH15. DB00EH,007H,08CH,00EH,007H,00FH,0FEH,007H,038H,000H,000H,03CH,000H,000H,038H,00CH16. DB0FFH,0FFH,0FEH,000H,038H,003H,000H,038H,000H,000H,038H,000H,000H,038H,000H,000H17. DB038H,000H,000H,038H,000H,000H,000H,000H18. 19. dataends20. 21. ;下面一部分是将16进制数据转换为二进制显示.用来比较清楚的明白点阵

22、情况22. ;因为点阵的宽高比,相当于3*8个为一行,可以隐约看到中字的尖23. ;00000000000000000000000024. ;00000000001100000000000025. ;00000000001111000000000026. 27. codesegment28. start:29. movax,0b800h30. moves,ax31. movax,data32. movds,ax33. ;movbx,034. movsi,035. movbh,100b;黑底红字36. movbl,03h;心形37. movah,0;用ax存点阵38. movdh,0;用于计数判

23、定3字每行循环39. movdi,180;中起始位置40. jmpread41. 42. ;子程序43. over:movax,4c00h44. int21h45. 46. ;hua:47. ;movdi,9248. ;ret49. check:cmpsi,7250. jnenext251. movdi,136;华起始位置;为什么是这个位置,而不是我算的中间偏右的位置开始才对?52. next2:cmpsi,14453. jeover54. cmpdh,355. jneread56. movdh,057. adddi,112;换行58. jmpread59. 60. read:61. mova

24、l,ds:si62. incsi63. incdh64. jmpdiv265. 66. ;show:moves:di,bx67. ;ret68. doom:69. movcx,870. s1:71. popax72. cmpah,173. jnenext74. moves:di,bx75. next:adddi,276. loops177. jmpcheck78. 79. 80. ;16进制转化为2进制,并入栈存储81. div2:82. movcx,883. s0:movdl,284. divdl85. movdl,al;商暂存于dl中86. moval,087. pushax;余数入栈88

25、. moval,dl;上次除法的商恢复到ax中89. loops090. jmpdoom91. 92. codeends93. endstart程序设计项目七在屏幕上显示一个兔子图形。参看demo1.gif示例。无法正确显示动态图,请根据文章开头下载demo图片文件参考代码这部分最重要的是延时显示,参看代码中sleep部分,可以看到,是一个大的双重循环,通过加大运算时间实现.汇编第十章的学习程度,没有更好的办法了吧?htmlview plaincopy1. ;绿黄紫红蓝青2. ;0101101011000010113. ;2654134. ;123456蓝绿青红紫黄5. 6. assumecs

26、:code,ds:data7. 8. datasegment9. db.*.*.;22列10. db.*.*.*.*.11. db.*.*.*.*.12. db.*.*.*.*.*.13. db.*.*.14. db.*.*.15. db.*.*.;中间8,上6,下2016. db.*.*.17. db*.*.18. db*.*.19. db*.*.*.*.20. db*.*.21. db*.U.*.22. db.*.*.23. db.*.*.;15行24. dataends25. 26. codesegment27. start:movax,0b800h28. moves,ax29. mov

27、ax,data30. movds,ax31. movdh,1;初始化颜色132. 33. show:34. movbx,035. movsi,1018;显示开始位置36. movcx,1537. s0:pushcx38. movcx,2239. s1:movdl,ds:bx40. moves:si,dx41. incbx42. addsi,243. loops144. popcx45. addsi,116;换行46. loops047. 48. sleep:movcx,9999;约1秒49. s3:pushcx50. movcx,999951. s:movax,98h52. movbl,353

28、. divbl54. loops55. popcx56. loops357. 58. incdh59. cmpdh,760. jeover61. jmpshow62. 63. over:movax,4c00h64. int21h65. 66. codeends67. endstart程序设计项目八实现笑脸阶梯走效果。参看demo2.gif示例。参考代码分析:20个- 分别间隔6行1.先显示横线,图片中是点,我用的横线2.然后显示笑脸,笑脸是显示一个后延时,再删除这一个笑脸后,显示下一个笑脸无法正确显示动态图,请根据文章开头下载demo图片文件3.我的实现顺序是:1.显示所有横线,2.不删除,一

29、个横线对应一个笑脸,全部显示,3.添加延时sleep,查看显示全部笑脸过程4添加删除上一个笑脸代码htmlview plaincopy1. assumecs:code2. codesegment3. start:movax,0b800h4. moves,ax5. movdh,02h6. movsi,18*160;-起始位置7. 8. movdl,-9. movcx,310. s:pushcx11. movcx,2012. s0:moves:si,dx13. addsi,214. loops015. popcx16. subsi,160*617. loops18. 19. movsi,17*16

30、020. movdl,221. smile:movcx,322. s1:pushcx23. movcx,2024. s2:moves:si,dx25. pushcx26. callsleep27. popcx28. addsi,229. loops230. popcx31. subsi,160*632. loops133. jmpover34. 35. sleep:movcx,4444;约0.5秒36. s8:pushcx37. movcx,444438. s9:movax,98h39. movbl,340. divbl41. loops942. popcx43. loops844. mova

31、x,045. moves:si,ax46. ret47. 48. over:movax,4c00h49. int21h50. codeends51. endstart程序设计项目九将ASCII码按顺序在屏幕上竖列显示。参看demo3.gif示例。无法正确显示动态图,请根据文章开头下载demo图片文件要求:(1)逐个显示字符,相邻的两个字符之间显示要有时间间隔。(2)字符颜色为绿色。(3)每列显示20个字符,列间距为5个字符。显示完128个ASCII码,共需7列。参考代码不太难,没问题滴htmlview plaincopy1. assumecs:code2. codesegment3. star

32、t:movax,0b800h4. moves,ax5. movdh,02h6. movsi,430;起始位置7. 8. movdl,0;从0-1279. movcx,710. s:pushcx11. movbp,012. movcx,2013. s0:moves:si+bp,dx14. addbp,16015. incdl16. cmpdl,12817. jeover18. pushcx19. callsleep20. popcx21. loops022. popcx23. subsi,1024. loops25. 26. sleep:movcx,4444;约0.5秒27. s8:pushcx28. movcx,444429. s9:movax,98h30. movbl,331. divbl32. loops933. popcx34. loops835. ret36. 37. over:movax,4c00h38. int21h39. codeends40. endstart程序设计项目十在屏幕上斜着显示三个happy spring festival!,字符串的颜色分别为蓝色、绿色和红色,并且各个字符串的颜色按规律变换。参看demo4.gif示例。无法正确显示动态图,请根据文章开头下载demo图片文件参考代码个人思路分析:1.先显

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1