当前位置:文档之家› 子程序汇编实验学习和提高

子程序汇编实验学习和提高

实验三子程序汇编实验学习和提高汇编语言中的ASSUME伪指令(理解)ASSUME伪指令通知汇编程序(编译器)代码段、数据段、附加段以及堆栈段选择什么名字。

没有ASSUME伪指令时,汇编程序假设不分段,并自动把段超越前缀用于所有寻址存储器数据的伪指令。

ASSUME语句只能用于完整的段定义。

ASSUME不是汇编指令,仅仅是写给编译软件的。

是让编译器知道你的程序的各个段的名字,并不生成机器码。

ASSUME伪指令是指明变量与段寄存器的联系,比如assume ds:data,它是告诉编译器以后所有在data段中定义的变量寻址时,使用ds作为段地址,但是它不对程序作任何事(因为是伪指令),你必须自己对ds赋值。

所以,要让机器知道实际的段地址,还需要mov ax,data mov ds,ax,告诉CPU数据段的地址。

1、汇编实例:判断该年是否为闰年(学习并理解)主程序:将输入字符转化成年份数字的子程序判断是否是闰年的子程序写程序是从理解范例程序开始的,认真的学习上面的程序,在masm for windows软件中实现如下的效果,并通过注释,进一步理解汇编语言的写法规范,以及汇编中子程序的写法(call 和 ret指令,可以参考王爽书籍第十章),学习jmp跳转语句的使用,画出这个程序实现的流程图。

2、汇编实例学习和改进:两位数加法学习和改进程序 (我们常常通过不断的改造已有的程序,达到编程能力进步的目的)例如:求和3+5 程序我们发现这个程序是在程序内定义的数据,能否可以从键盘输入呢?于是:显然,我们不能停留在这个基础上,能否实现输入两个变量,然后相加呢?于是,我们就想起上面的实验:和我们学习利用这些写法,能否实现输入两个变量,然后完成加法呢?(自行完成)错误程序一:DATAS SEGMENTplus db '+$'equalto db '=$'DATAS ENDSSTACKS SEGMENTDB 128 DUP (?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV BL,0MOV AH,1INT 21HADD BL,ALLEA DX,PLUSMOV AH,9INT 21HMOV AH,1INT 21HADD BL,ALLEA DX,equaltoMOV AH,9INT 21HMOV AL,BLMOV DL,ALMOV AH,2INT 21HMOV AH,4CHINT 21HCODES ENDSEND START(输出结果非正确结果)错误程序二:DATAS SEGMENTplus db '+$'equalto db '=$'DATAS ENDSSTACKS SEGMENTDB 128 DUP (?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV BL,0MOV AH,1INT 21HADD BL,ALLEA DX,PLUSMOV AH,9INT 21HMOV AH,1INT 21HADD BL,ALLEA DX,equaltoMOV AH,9INT 21HMOV AL,BLADD AL,30HMOV DL,ALMOV AH,2INT 21HMOV AH,4CHINT 21HCODES ENDSEND START“正确程序”:DATAS SEGMENTplus db '+$'equalto db '=$'DATAS ENDSSTACKS SEGMENTDB 128 DUP (?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV BL,0MOV AH,1INT 21HADD BL,ALLEA DX,PLUSMOV AH,9INT 21HMOV AH,1INT 21HADD BL,ALLEA DX,equaltoMOV AH,9INT 21HMOV AL,BLSUB AL,30HMOV DL,ALMOV AH,2INT 21HMOV AH,4CHINT 21HCODES ENDSEND START现在这个程序有没有大的BUG呢?你输入两位数,看看行不行?怎么改呢?(自行完成)答:有很大的BUG,当结果是大于两位的数时,输出的字符不是对应的结果。

并且不能输入两位数。

错误程序一:ADD BL,ALMOV BH,0ADD BX,0AHSUB AL,30HMOV AH,1INT 21HSUB AL,30HMOV AH,0MOV BX,AXLEA DX,equaltoMOV AH,9INT 21HMOV CH,BLAND BL,0FHCMP BL,9HJNA NEXT0STCSUB BL,0AHJMP NEXT1 NEXT0:CLCNEXT1:MOV CL,4SHR CH,CLJC NEXT2JMP NEXT3 NEXT2:ADD CH,1H NEXT3:ADD BH,30HMOV AL,BHMOV DL,ALMOV AH,2INT 21HADD CH,30HMOV AL,CHMOV DL,ALMOV AH,2INT 21HADD BL,30HMOV AL,BLMOV DL,ALMOV AH,2INT 21HMOV AH,4CHINT 21H CODES ENDSEND START错误程序二:DATAS SEGMENTplus db '+$$'equalto db '=$$$'DATAS ENDSSTACKS SEGMENTDB 128 DUP (?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV AH,1INT 21HSUB AL,30HMOV BL,0AHMUL BLMOV AH,0ADD CX,AXMOV AH,1INT 21HSUB AL,30HADD CX,AXLEA DX,PLUSMOV AH,9INT 21HMOV AH,1INT 21HSUB AL,30HMUL BLMOV AH,0ADD CX,AXMOV AH,1INT 21HSUB AL,30HMOV AH,0ADD CX,AXMOV BX,CXLEA DX,equaltoMOV AH,9INT 21HMOV CH,BLAND BL,0FHCMP BL,09HJNA NEXT0STCSUB BL,0AHJMP NEXT1 NEXT0:CLCNEXT1:MOV CL,4SHR CH,CLJC NEXT2JMP NEXT3 NEXT2:ADD CH,1H NEXT3:CMP CH,09HJNA NEXT4STCJMP NEXT5 NEXT4:CLCNEXT5:JC NEXT6JMP NEXT7 NEXT6:ADD BH,01H NEXT7:ADD BH,30HMOV AL,BHMOV DL,ALMOV AH,2INT 21HADD CH,30HMOV AL,CHMOV DL,ALMOV AH,2INT 21HADD BL,30HMOV AL,BLMOV DL,ALMOV AH,2INT 21HMOV AH,4CHINT 21H CODES ENDSEND START(没把十六进制转化为十进制显示)错误程序三:DATAS SEGMENTplus db '+$$'equalto db '=$$$'DATAS ENDSSTACKS SEGMENTDB 128 DUP (?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV AH,1INT 21HSUB AL,30HMOV BL,0AHMUL BLMOV AH,0ADD CX,AXMOV AH,1 INT 21HSUB AL,30H MOV AH,0 ADD CX,AXLEA DX,PLUS MOV AH,9 INT 21HMOV AH,1 INT 21HSUB AL,30H MUL BLMOV AH,0 ADD CX,AX MOV AH,1 INT 21HSUB AL,30H MOV AH,0 ADD CX,AX MOV AX,CX MOV CL,64H DIV CLMOV BL,AL MOV AL,AH MOV AH,0H MOV CL,0AH DIV CLMOV CL,AL LEA DX,equalto MOV AH,9 INT 21HADD BL,30H MOV AL,BL MOV DL,AL MOV AH,2 INT 21HADD CL,30H MOV AL,CL MOV DL,ALMOV AH,2INT 21HADD AH,30HMOV AL,AHMOV DL,ALMOV AH,2INT 21HMOV AH,4CHINT 21HCODES ENDSEND START……….正确程序:DATAS SEGMENTplus db '+$$'equalto db '=$$$'DATAS ENDSSTACKS SEGMENTDB 128 DUP (?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV DS,AXMOV AH,1INT 21HSUB AL,30HMOV BL,0AHMUL BLMOV AH,0ADD CX,AXMOV AH,1INT 21HSUB AL,30HMOV AH,0ADD CX,AXLEA DX,PLUSMOV AH,9INT 21HMOV AH,1INT 21HSUB AL,30HMUL BLMOV AH,0ADD CX,AXMOV AH,1INT 21HSUB AL,30HMOV AH,0ADD CX,AXADD CX,1H(编写其他程序验证发现此bug)MOV AX,CXSUB AH,1H (编写其他程序验证发现此bug)PUSH AXLEA DX,equaltoMOV AH,9INT 21HPOP AXMOV BX,AXDIV CLADD AL,30HMOV DL,ALMOV AH,2INT 21HMOV AX,BXMOV CL,100DDIV CLMOV AL,AHMOV AH,0HMOV BX,AXMOV CL,0AHDIV CLADD AL,30HMOV DL,ALMOV AH,2INT 21HMOV AX,BXMOV CL,0AHDIV CLADD AH,30HMOV DL,AHMOV AH,2INT 21HMOV AH,4CHINT 21H CODES ENDSEND START于是,我们惊讶地发现汇编编程水平随着这个简单问题的深入,好像有点小提高啦!Heart.asm 一个汇编小程序,大家在masm for windows软件中运行运行,看看有什么结果?总结:一个程序没有语法错误,但是执行的结果不是我们想要的,回头看程序却发现不了任何错误,这时候唯一能做的就是一段一段的验证,每一段的结果是否是我们所需,如果不是,做出相应改正,如果是继续下一段,这样下去,考虑周全一点,一定会得出正确结果。

相关主题