汇编程序编写和提高.docx

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
汇编程序编写和提高课件

第四次实验汇编程序编写和提高编写一个程序,实现复制字符串的功能,并将复制的字符串正序倒序显示出来。流程图:程序如下:DATAS SEGMENT string_a db the future is beautiful;要操作的字符串 count equ $-offset string_a;把字符串的长度存入countdata1 db the zhengxu is:,$;输出正序是 data2 db the fanxu is:,$ ;输出反序是DATAS ENDSSTACKS SEGMENT string_b db 100 dup(?);建栈段存放复制的字符串STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX;把datas的段地址分别给DS,ES mov es,ax lea si,string_a;取string_a的偏移地址给si lea di,string_b;取string_b的偏移地址给di mov cx,count;把字符串长度给cx,决定循环的次数 Cld;DF置零,使DI,SI自增rep movsb;把string_a里的字符串复制到string_b,循环次数为;CX mov cx,count;把count赋给CX,决定输出正序循环次数 lea dx,data1;输出data1里的字符 mov ah,09 int 21h xor di,di;DI置零output1: mov dl,[string_b+di];把string_b偏移地址给DL mov ah,02h int 21h;输出数据段string_b里的一个字符 inc di;DI自增,指向下一个字节loop output1;循环输出 mov cx,count;CX重新获值 lea dx,data2;把data2的偏移地址赋给DX mov ah,09 int 21h ;输出提反序输出的提示字符output2: dec di;上一次循环DI指向要输出字符串的下一个字节,先自减,;使他指向最后一个字符 mov dl,[string_b+di] mov ah,02 int 21h;输出反序的字符串 loop output2 MOV AH,4CH INT 21H;结束dosCODES ENDSEND START;程序结束运行结果:过程中有几次语法错误,比如直接 MOV DI,STRING_B,提示错误,不能直接把数据段的偏移地址赋给DI,应该用LEA。百度得知:LEA为硬指令,在程序执行阶段得出偏移地址,offset是伪指令,在编译阶段得出偏移地址。论速度的话,offset比LEA快得多,但是,灵活性和复杂度,offset远不如LEA。利用中断调用,在屏幕上显示1-9中的随机数,中断号为86H流程图:Random子程序是上网百度的,加以调用刚开始运行是这样的结果发生除法溢出错误,检查后发现是AND写成了ADD改正后原子程序如下:运行结果:结果很匪夷所思......是D;检查了一下,发现....我写错了,明明子程序中都把随机数放在BL里保存,而我写的output子程序里,是把AH的值赋给DL,AH的值在POP AX已经改变......最后改正后,随机数出炉了,先看程序:DATAS SEGMENTDATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXmov ax,0mov es,ax;段偏移地址指向0000mov bx,86h*4;把中断号86H的地址赋给BXmov ax,offset randommov es:word ptr [bx],ax;把中断子程序的偏移地址存入;ES:[BX]mov ax,seg random;取中断子程序的段基地址mov es:word ptr [bx+2],ax;把段基地址存入ES:[BX+2] int 86h;调用中断向量表的86号即RANDOM子程序 call output;调用output子程序MOV AH,4CH INT 21H;结束random procPUSH CXPUSH DXPUSH AX;寄存器保护 STI;开中断,后面要调用int 1ahMOV AH,0 INT 1AH;读取时钟滴答计数MOV AX,DX;把随机数存入

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档