重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
CODE SEGMENT
目前成都创新互联公司已为上千多家的企业提供了网站建设、域名、网络空间、网站托管、企业网站设计、日照网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
ASSUME CS:CODE
ORG 100H
START: PUSH CS
POP DS
PUSH CS
POP ES
MOV AL,255
MOV BL,255
CALL MULT
CALL DISPAX
MOV AH,4CH
INT 21H
;====================================================
; 被乘数放置于al 中, 乘数放置于 bl中, 结果放置于ax中
MULT PROC NEAR
PUSH DX
PUSHF
MOV AH,0
MOV DX,0
CMP BL,0
JE @MULTEXIT
@MULT1: SHR BL,1
JNC @MULT2
ADD DL,AL
ADC DH,AH
@MULT2: SHL AL,1
RCL AH,1
CMP BL,0
JNE @MULT1
MOV AH,DH
MOV AL,DL
POPF
POP DX
RET
@MULTEXIT:
MOV AX,0
POPF
POP DX
RET
MULT ENDP
;==================================
; 将要显示的无符号数置于 ax 中
DISPAX PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
PUSHF
PUSH DS
PUSH CS
POP DS
MOV BYTE PTR NZ,0
PUSH AX
LEA SI,DIVARR
MOV CX,5
@1:
POP AX
MOV DX,0
MOV BX,[SI]
DIV BX
PUSH DX
CMP AL,0
JNE @2
CMP BYTE PTR NZ,1
JE @2
CMP CX,1
JE @2
MOV DL,20H
JMP @3
@2:
ADD AL,30H
MOV DL,AL
MOV BYTE PTR NZ,1
@3:
MOV AH,2
INT 21H
INC SI
INC SI
LOOP @1
POP DX
POP DS
POPF
POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
DIVARR DW 10000,1000,100,10,1
NZ DB 0
DISPAX ENDP
;==============================================
CODE ENDS
END START
#include stdio.h
double add(double* a,double*b){return *a+*b; }
double multiply(double*a,double*b){return (*a)*(*b) ;}
int main()
{
double p,q;
printf("请输入两个数:\n");
scanf("%f,%f",p,q);
printf("和=%f,积=%f",add(p,q),multiply(p,q));
}
除法与乘法类似,只不过将左移改为右移,加改成减。实际上减也是通过取补码后再加,不够减后就停止,得出余数。详细的是:(1)首先用“1”作为商试一下,相当于用“1”乘以除数“110”,然后把所得到的各位再与被除数的前4位“1001”相减。按照减法运算规则可以得到的余数为“011”。 (2)因为“011”与除数“110”相比,不足以被除,所以需要向低取一位,最终得到“0111”,此时的数就比除数“110”大了,可以继续除了。同样用“1”作为商去除,相当于用“1”去乘除数“110”,然后把所得的积与被除数中当前四位“0111”相减。根据以上介绍的减法运算规则可以得到此步的余数为“1”。 (3)因为“1”要远比除数“110”小,被除数向前取一位后为“11”,仍不够“110”除,所以此时需在商位置上用“0”作为商了。 (4)然后在被除数上继续向前取一位,得到“110”。此时恰好与除数“110”完全一样,结果当然是用“1”作为商,用它乘以除数“110”后再与被除数相减,得到的余数正好为“0”。证明这两个数能够整除。 这样一来,所得的商(1101)2就是两者相除的结果。
—不考虑阵列实现;
—用“加法-移位”的重复运算方法实现乘法和除法。
(1)乘法
实现无符号数乘法运算:
要求能实现4位乘法(指被乘数4位,乘数4位,乘积为8位)运算的功能;
(2)除法
实现无符号除法运算:
要求能实现4位除法的功能(被除数8位,除数4位,商4位);
!! 研究除法算法时的两点提示:
A、可考虑使用加减交替算法,而不是使用恢复余数法;
B、注意算法中化减为加的方法。
/*Note:YourchoiceisCIDE*/#include"stdio.h"#include"stdlib.h"#include"ctype.h"intn=0;charrecord[20];floatproduct();floatchange();floatmuli(){floatsumm;summ=product();while(record[n]=='-'||record[n]=='+'){switch(record[n]){case'+':n++;summ+=product();break;case'-':n++;summ-=product();break;}}returnsumm;}floatproduct(){floatsump;sump=change();while(record[n]=='*'||record[n]=='/'){switch(record[n]){case'*':n++;sump*=change();break;case'/':n++;sump/=change();break;}}returnsump;}floatchange(){floatsumc;charrec[20],i=0;if(record[n]=='('){n++;sumc=muli();}if(record[n]==')')n++;while(isdigit(record[n])||record[n]=='.'){while(isdigit(record[n])||record[n]=='.')rec[i++]=record[n++];rec[i]='\0';sumc=atof(rec);}returnsumc;}voidmain(){while(1){n=0;scanf("%s",record);printf("%s=%g\n",record,muli());}}这个是比较简单的。。。但是有点难理解。。。不过运行绝对正确。。还支持括号。。。但是在这个程序里面我加没有出错处理。。。另一种方法是用栈写。。。这个好理解。。但是麻烦。。。