![]() |
#2
zaixuexi2010-12-25 19:49
BUF1 DD 240744BAH BUF2 DD 8462C4C5H ;请问是表示浮点数么? BUF3 DD ? ;是存放相加的和么? EXIT1:MOV WORD PTR BUF3,AX MOV WORD PTR BUF3+2,BX ;如果是把相加的和的结果送入BUF3 LEA DX,OFFSET WORD PTR BUF3 ;那么你这句显示不可能对 -> MOV DX,OFFSET BUF3 ;最好改成这样 因为结果要转成字符才能显示么,比如0->30H,1->31H,A->41H,etc. 浮点算法我没看,主要是原理不太清楚,方便的话你能把原理写下么,我也想学习一下,感谢,呵呵 我给你改了一下,主要是最后一段显示的. ![]() DATA SEGMENT BUF1 DD 240744BAH BUF2 DD 8462C4C5H S1 DB 0 S2 DB 0 E1 DW 0 E2 DW 0 BUF3 DD ? STRBUF3 DB 8 DUP(?),'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV SI,WORD PTR BUF1 MOV BX,WORD PTR BUF1+2 MOV DI,WORD PTR BUF2 MOV DX,WORD PTR BUF2+2 ;以下分离被加数符号、阶码、尾数 SHL SI,1 ADC BYTE PTR S1,0 MOV CL,8 ROL SI,CL AND SI,0FFH SUB SI,127 MOV E1,SI MOV AX,SI MOV SI,WORD PTR BUF1 AND SI,07FH OR SI,80H ;以下分离加数符号,阶码,尾数 SHL DI,1 ADC BYTE PTR S2,0 MOV CL,8 ROL DI,CL AND DI,0FFH SUB DI,127 MOV E2,DI MOV CX,DI MOV DI,WORD PTR BUF2 AND DI,07FH OR DI,80H ;以下对阶,将阶码小者尾数右移至阶码相同 CMP AX,CX JZ FADD4 JNC FADD2 SUB CX,AX FADD1:SHR SI,1 RCR BX,1 LOOP FADD1 JMP FADD4 FADD2:SUB AX,CX MOV CX,AX FADD3:SHR DI,1 RCR DX,1 LOOP FADD3 ;阶码相同情况下判断有无有一个数为0的情况 FADD4:PUSH SI OR SI,BX POP SI JZ FADD5 PUSH DI OR DI,DX POP DI JAE FADD6 MOV AX,WORD PTR BUF1 MOV BX,WORD PTR BUF1+2 JMP EXIT1 FADD5:MOV AX,WORD PTR BUF2 MOV BX,WORD PTR BUF2+2 JMP EXIT1 ;进行符号分析 FADD6:MOV AL,S1 CMP AL,S2 JZ FADD14 CMP SI,DI JZ FADD13 JAE FADD10 FADD7: SUB DI,SI SBB DX,BX MOV BX,DX MOV AX,WORD PTR BUF2 AND AX,0FF80H FADD8:TEST DI,80H JNZ FADD9 MOV CX,23 SHL BX,1 RCL DI,1 SUB AX,80H LOOP FADD8 FADD9:AND DI,07FH ADD AX,DI JMP EXIT1 ;被加数大时的处理 FADD10:SUB SI,DI SBB BX,DX MOV AX,WORD PTR BUF1 AND AX,0FF80H FADD11:TEST SI,80H JNZ FADD12 MOV CX,23 SHL BX,1 RCL SI,1 SUB AX,80H LOOP FADD11 FADD12:AND SI,7FH ADD AX,SI JMP EXIT1 FADD13:CMP BX,DX JAE FADD7 JNZ FADD10 MOV AX,0 MOV BX,0 JMP EXIT1 ;处理符号相同的情况 FADD14:ADD BX,DX ADC SI,DI MOV AX,WORD PTR BUF1 AND AX,0FF80H TEST SI,80H JZ FADD15 SHR SI,1 RCR BX,1 ADD AX,80H FADD15:AND SI,7FH ADD AX,SI EXIT1:MOV WORD PTR BUF3,AX MOV WORD PTR BUF3+2,BX XOR AH,AH MOV BX,OFFSET BUF3 XOR CH,CH MOV SI,3 MOV DI,0FFFFH NEXT: MOV AL,BYTE PTR [BX+SI] MOV AH,AL MOV CL,4 SHR AL,CL N2: AND AL,0FH INC DI CMP AL,09H JB PASS ADD AL,07H PASS: ADD AL,30H MOV STRBUF3[DI],AL XCHG AH,AL ADD CL,-2 JNZ N2 DEC SI CMP SI,0FFFFH JNZ NEXT LEA DX,STRBUF3 MOV AH,09 INT 21H MOV AH,4CH INT 21H CODE ENDS END START |
DATA SEGMENT
BUF1 DD 240744BAH
BUF2 DD 8462C4C5H
S1 DB 0
S2 DB 0
E1 DW 0
E2 DW 0
BUF3 DD ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV SI,WORD PTR BUF1
MOV BX,WORD PTR BUF1+2
MOV DI,WORD PTR BUF2
MOV DX,WORD PTR BUF2+2
;以下分离被加数符号、阶码、尾数
SHL SI,1
ADC BYTE PTR S1,0
MOV CL,8
ROL SI,CL
AND SI,0FFH
SUB SI,127
MOV E1,SI
MOV AX,SI
MOV SI,WORD PTR BUF1
AND SI,07FH
OR SI,80H
;以下分离加数符号,阶码,尾数
SHL DI,1
ADC BYTE PTR S2,0
MOV CL,8
ROL DI,CL
AND DI,0FFH
SUB DI,127
MOV E2,DI
MOV CX,DI
MOV DI,WORD PTR BUF2
AND DI,07FH
OR DI,80H
;以下对阶,将阶码小者尾数右移至阶码相同
CMP AX,CX
JZ FADD4
JNC FADD2
SUB CX,AX
FADD1:SHR SI,1
RCR BX,1
LOOP FADD1
JMP FADD4
FADD2:SUB AX,CX
MOV CX,AX
FADD3:SHR DI,1
RCR DX,1
LOOP FADD3
;阶码相同情况下判断有无有一个数为0的情况
FADD4:PUSH SI
OR SI,BX
POP SI
JZ FADD5
PUSH DI
OR DI,DX
POP DI
JAE FADD6
MOV AX,WORD PTR BUF1
MOV BX,WORD PTR BUF1+2
JMP EXIT1
FADD5:MOV AX,WORD PTR BUF2
MOV BX,WORD PTR BUF2+2
JMP EXIT1
;进行符号分析
FADD6:MOV AL,S1
CMP AL,S2
JZ FADD14
CMP SI,DI
JZ FADD13
JAE FADD10
FADD7: SUB DI,SI
SBB DX,BX
MOV BX,DX
MOV AX,WORD PTR BUF2
AND AX,0FF80H
FADD8:TEST DI,80H
JNZ FADD9
MOV CX,23
SHL BX,1
RCL DI,1
SUB AX,80H
LOOP FADD8
FADD9:AND DI,07FH
ADD AX,DI
JMP EXIT1
;被加数大时的处理
FADD10:SUB SI,DI
SBB BX,DX
MOV AX,WORD PTR BUF1
AND AX,0FF80H
FADD11:TEST SI,80H
JNZ FADD12
MOV CX,23
SHL BX,1
RCL SI,1
SUB AX,80H
LOOP FADD11
FADD12:AND SI,7FH
ADD AX,SI
JMP EXIT1
FADD13:CMP BX,DX
JAE FADD7
JNZ FADD10
MOV AX,0
MOV BX,0
JMP EXIT1
;处理符号相同的情况
FADD14:ADD BX,DX
ADC SI,DI
MOV AX,WORD PTR BUF1
AND AX,0FF80H
TEST SI,80H
JZ FADD15
SHR SI,1
RCR BX,1
ADD AX,80H
FADD15:AND SI,7FH
ADD AX,SI
EXIT1:MOV WORD PTR BUF3,AX
MOV WORD PTR BUF3+2,BX
LEA DX,OFFSET WORD PTR BUF3
MOV AH,09
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START