- 实验名称:实验四 两个数的相乘
- 实验内容:
用子程序形式编写:
A*B:从键盘输入a和b,计算A*B,其中乘法采用移位和累加完成
- 实验过程:
源代码:
data segmentmul1 db 16,?,16 dup(?)mul2 db 16,?,16 dup(?)buff1 db 'Please input mul1: $'buff2 db 'Please input mul2: $'buff3 db 'The consequense is : $'data endscode segmentassume cs:code,ds:datamain proc far ; main programmov ax,datamov ds,axpush dsxor ax,ax ;push ds and es and ax=0call tips1 ;提示用户输入第一个数call input1 ;在缓冲区接收call tips2 ;提示用户输入第一个数call input2 ;在缓冲区接收lea si,mul1+2 ;开始将第一个数10进制转换成2进制call dtob push bx ;压栈保存第一个数的2进制lea si,mul2+2call dtob ;开始将第一个数10进制转换成2进制mov dx,bx ;dx中装的是第二个数的二进制pop bx ;bx中装的是第一个数的二进制call multiple ;调用乘法子程序call tips3 ;提示结果输出call btod ;将结果的二进制转换成十进制输出mov ah,4chint 21hretmain endp;-----------------------------------------------------------tips1 proc nearmov dx,offset buff1mov ah,9int 21hrettips1 endp;------------------------------------------------------------input1 proc nearlea dx,mul1mov ah,0ahint 21hmov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21hretinput1 endp;--------------------------------------------------------------tips2 proc nearmov dx,offset buff2mov ah,9int 21hrettips2 endp;-----------------------------------------------------------input2 proc nearlea dx,mul2mov ah,0ahint 21hmov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21hretinput2 endp;--------------------------------------------------------------dtob proc nearmov bx,0getnum:mov al,byte ptr [si] ;用al保存第一个字符sub al,30hjl exit1cmp al,9jg exit1cbwxchg ax,bxmov dx,10mul dxxchg ax,bxadd bx,axinc si ;循环,如果遇到的不是0~9的数就自动跳出程序jmp getnumexit1: retdtob endpmultiple proc nearmov bp,0 ;用bp寄存器保存结果start:shr dx,1 ;右移第二个乘数,判断CF的值,如果是1就进行加法操作,如果是0就继续右移jc additionshl bx,1 ;第一个乘数左移cmp dx,0 ;当第二个数为0是结束jz exit2jmp startaddition:add bp,bx ;将相加结果保存在BP寄存器中shl bx,1jmp startexit2 :retmultiple endpbtod proc nearmov ax, bp ;把bp寄存器的值给axmov cx, 1 ;计数器mov bl, 10 ;10作除数div1:idiv bl push ax ;保存ax/10后的结果,ah存放余数,al存放商cmp al, 0 ;商为0则开始输出jz outputmov ah, 0 ;置余数为0,继续除inc cxjmp div1output:pop dx mov dl, dh ;出栈输出余数add dl, 30hmov ah, 2int 21hloop outputretbtod endptips3 proc nearmov dx,offset buff3mov ah,9int 21hrettips3 endpcode endsend main
运行结果:
- 实验小结:
这次的实验有一个很困惑我的地方就是我一开始弄错了,以为我们用户能用的寄存器只有AX,BX,CX,DX这四个,所以我一直拿缓冲区的内存当作一个寄存器来回使用,这对我进行数的操作造成了很大的不便,此外我的移位操作乘法,设计的很麻烦,一开始总是想用一个寄存器保存第二个乘数的1的位权,这就遇到了我上面说的寄存器不够的情况,后来在老师的帮助下,我改进了算法,只要判断右移的第二个乘数CF位是0,还是1,如果是1就把AX左移的结果加进来,AX的值无需保存,只要最后把结果放进BP寄存器就可以了。通过这次实验,我收获了很多。