查询网站的注册信息,深圳制作网站的公司,黄骅港船舶动态计划表,网站怎么做外链接地址实验名称#xff1a;实验四 两个数的相乘 实验内容#xff1a;
用子程序形式编写#xff1a;
A*B#xff1a;从键盘输入a和b#xff0c;计算A*B#xff0c;其中乘法采用移位和累加完成
实验过程#xff1a;
源代码#xff1a;
data segmentmul1 db 16,?,16 dup(?…
实验名称实验四 两个数的相乘 实验内容
用子程序形式编写
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 ax0call tips1 ;提示用户输入第一个数call input1 ;在缓冲区接收call tips2 ;提示用户输入第一个数call input2 ;在缓冲区接收lea si,mul12 ;开始将第一个数10进制转换成2进制call dtob push bx ;压栈保存第一个数的2进制lea si,mul22call 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寄存器就可以了。通过这次实验我收获了很多。