汇编编写程序实现大数运算

计算公式为:

r=m*n-x;

提示输入m、n、x,并显示结果r。

.386 .model flat,stdcall option casemap:none includelib msvcrt.lib printf PROTO C:sdword, :vararg scanf PROTO C:sdword, :vararg .data Msg11 byte 'm=',0 Msg22 byte 'n=',0 Msg33 byte 'x=',0 Msg1 byte '%d',0 Msg2 byte '%d',0 Msg3 byte '%d',0 Msg4 byte 'result=m*n-x=%I64d',0ah,0 m sdword ? ;定义m n sdword ? ;定义n x sdword ? ;定义x result qword ? ;定义result .code start: invoke printf,offset Msg11 ;提示输入m invoke scanf,offset Msg1,offset m ;输入m invoke printf,offset Msg22 ;提示输入n invoke scanf,offset Msg2,offset n ;输入n invoke printf,offset Msg33 ;提示输入x invoke scanf,offset Msg3,offset x ;输入x sub eax,eax mov eax,m imul n ;带符号数乘法,低位在eax中,高位在edx中 xor ebx,ebx ;把ebx作为一个临时变量 cmp ebx,x ;判定x的符号 jg L1 ;如果x<0 jng L2 ;如果x>=0 L1: sub ebx,x ;减去一个负数相当于加法 add eax,ebx ;ebx此时是x的相反数,是正整数 adc edx,0 ;做加法的过程中可能会出现进位 jmp L3 L2: sub eax,x ;直接做减法 sbb edx,0 ;做减法的过程中可能会出现借位 jmp L3 L3: mov sdword ptr [result],eax ;将eax赋给result的低位 mov sdword ptr [result+4],edx ;将edx赋给result的高位 invoke printf,offset Msg4,result ;最终结果显示 ret end start

这个还是比较麻烦的,因为有些数真的很大,需要特殊处理的。

你可能感兴趣的:(c,汇编,byte)