回 帖 发 新 帖 刷新版面

主题:谁帮我看看这个程序!

一个求四则运算的程序,我有些地方不是很明白,哪位高手帮我做点注释!谢谢啦!

B_P     EQU BYTE PTR
W_P     EQU WORD PTR
D_P     EQU DWORD PTR
CODE    SEGMENT
ASSUME  CS:CODE,DS:CODE
        ORG 100H
;主程序开始
NEWSTAR:
        JMP STAR
        EVEN
NUM1    DW 0,0
NUM2    DW 0,0
NUM3    DW 0,0
JGV4    DW 0,0
YSF     LABEL WORD
YSF1    DB 0
YSF2    DB 0
JUV     DB 0
UV      DB 0
;使DS:SI指向第一有效字符
OVERS   LABEL NEAR
        CLD
        PUSH AX
OVERS1:
        LODSB
        CMP AL,' '
        JZ OVERS1
        CMP AL,9
        JZ OVERS1
        DEC SI
        CMP AL,13
        POP AX
        RET
;输出一个制表符
TAB     LABEL NEAR
        MOV AL,9
        JMP SHORT DISP
;输出一个回车换行符
CRLF    LABEL NEAR
        MOV AL,13
        CALL DISP
        MOV AL,10
;显示一个字符
DISP    LABEL NEAR
        PUSH AX
        PUSH DX
        MOV AH,2
        MOV DL,AL
        INT 21H
        POP DX
        POP AX
        RET
;检查是否为运算符
ISYSF   LABEL NEAR
        CLD
        LODSB
        CALL ISJJ
        JZ ISYSF1
        CALL ISII
        JZ ISYSF1
        DEC SI
ISYSF1:
        RET
;检查是否是加减运算
ISJJ    LABEL NEAR
        CMP AL,'+'
        JZ ISYSF1
        CMP AL,'-'
        RET
;检查是否为乘除运算
ISII    LABEL NEAR
        CMP AL,'*'
        JZ ISYSF1
        CMP AL,'/'
        JZ ISYSF1
        CMP AL,'\'
        RET
;数据输出
;CX=10 十进制
;CX=16 十六进制
DOUT    LABEL NEAR
        PUSH AX
        PUSH BX
        PUSH DX
        PUSH BP
        XOR BP,BP
DOUT1:
        INC BP
        PUSH AX
        MOV AX,DX
        XOR DX,DX
        DIV CX
        MOV BX,AX
        POP AX
        DIV CX
        PUSH DX
        MOV DX,BX
        OR BX,AX
        JNZ DOUT1
DOUT2:
        POP AX
        ADD AL,'0'
        CMP AL,'9'
        JBE DOUT3
        ADD AL,'A'-'9'-1
DOUT3:
        CALL DISP
        DEC BP
        JNZ DOUT2
        POP BP
        POP DX
        POP BX
        POP AX
        RET
;输入数据在DX:AX中返回
;CX=0 数据为10进制
;CX#0 数据为16进制
DATE    LABEL NEAR
        PUSH BX
        PUSH BP
        PUSH DI
        XOR AX,AX
        XOR DX,DX
DATE1:
        MOV DI,AX
        LODSB
        CMP AL,'0'
        JB DATE7
        CMP AL,'9'
        JA DATE6
DATE2:
        AND AX,0FH
        SHL DI,1
        RCL DX,1
        MOV BX,DI
        MOV BP,DX
        SHL DI,1
        RCL DX,1
        SHL DI,1
        RCL DX,1
        JCXZ DATE3
        SHL DI,1
        RCL DX,1
        Jmp short DATE4
DATE3:
        ADD DI,BX
        ADC DX,BP
DATE4:
        ADD AX,DI
        ADC DX,0
        JMP DATE1
DATE5:
        ADD AL,9
        JMP DATE2
DATE6:
        JCXZ DATE7
        CMP AL,'A'
        JB DATE7
        CMP AL,'F'
        JBE DATE5
        CMP AL,'a'
        JB DATE7
        CMP AL,'f'
        JBE DATE5
DATE7:
        MOV AX,DI
        DEC SI
        OR DI,DX
        POP DI
        POP BP
        POP BX
        RET
;数据1与数据2根据YSF1进行加减运算
JSJJ    LABEL NEAR
        MOV AX,NUM2
        MOV DX,NUM2+2
        CMP YSF1,'+'
        JZ JSJJ1
        SUB NUM1,AX
        SBB NUM1+2,DX
        JMP SHORT JSJJ2
JSJJ1:
        ADD NUM1,AX
        ADC NUM1+2,DX
JSJJ2:
        RET
;数据1与数据2根据YSF1进行乘除运算

回复列表 (共5个回复)

沙发

下面是接上面的!

JSII1   LABEL NEAR
        MOV BX,OFFSET NUM1
        JMP SHORT JSII2_1
;数据2与数据3根据YSF2进行乘除运算
JSII2   LABEL NEAR
        MOV BX,OFFSET NUM2
JSII2_1:
        DB 66H
        MOV AX,[BX]
        DB 66H
        MOV CX,[BX+4]
        CMP YSF2,'*'
        JNZ JSII2_2
        DB 66H
        IMUL CX
        JMP SHORT JSII2_3
JSII2_2:
        DB 66H
        CWD
        DB 66H
        IDIV CX
        CMP YSF2,'/'
        JZ JSII2_3
        DB 66H
        XCHG DX,AX
JSII2_3:
        DB 66H
        MOV [BX],AX
        RET
;显示结果
XUJG    LABEL NEAR
        MOV AX,JGV4
        MOV DX,JGV4+2
        MOV CX,10
        CMP UV,10
        JZ XUJG0
        MOV CX,16
XUJG0:
        TEST DX,8000H
        JZ XUJG1
        CMP UV,10
        JZ XUJG2
        CALL DOUT
XUJG2:
        NOT AX
        NOT DX
        ADD AX,1
        ADC DX,0
        PUSH AX
        CMP UV,10
        JZ XUJG3
        MOV AL,' '
        CALL DISP
        MOV AL,'('
        CALL DISP
XUJG3:
        MOV AL,'-'
        CALL DISP
        POP AX
        CMP UV,10
        JZ XUJG1
        CALL DOUT
        MOV AL,')'
        CALL DISP
        RET
XUJG1:
        CALL DOUT
        RET
;计算结果放入DX:AX中
JSJG    LABEL NEAR
        CALL JSJJ
        MOV AX,NUM1
        MOV DX,NUM1+2
        RET
;从DS:SI处取一个数据
LOADATE LABEL NEAR
        LODSB
        CMP AL,'('
        JZ LOADATE1
        DEC SI
        PUSH CX
        XOR CX,CX
        CMP UV,10
        JZ LOADATE0
        INC CX         
LOADATE0:
        CALL DATE       
        POP CX
        RET
LOADATE1:
        PUSH NUM1      
        PUSH NUM1+2
        PUSH NUM2
        PUSH NUM2+2
        PUSH YSF
        INC JUV
        MOV JGV4,0      
        MOV JGV4+2,0
;进行四则运算
SZYS    LABEL NEAR
        CALL ISYSF        
       JZ SZYS2
        CALL LOADATE    
       MOV NUM1,AX
        MOV NUM1+2,DX
SZYS1:
        XOR AX,AX       
        MOV NUM2,AX
        MOV NUM2+2,AX
        CALL ISYSF     

        JZ SZYS3
        JNZ SZYS6
SZYS2:
        PUSH AX
        MOV AX,JGV4    
        MOV NUM1,AX
        MOV AX,JGV4+2
        MOV NUM1+2,AX
        POP AX
SZYS3:
        MOV YSF1,AL
        MOV YSF2,AL
        CALL ISJJ      
        JZ SZYS4
        CALL LOADATE    
        MOV NUM2,AX
        MOV NUM2+2,DX
        CALL JSII1     
        JMP SZYS1       
SZYS4:
        CALL LOADATE    
        MOV NUM2,AX
        MOV NUM2+2,DX

板凳

SZYS4_1:
        CALL ISYSF
        JNZ SZYS6
        CALL ISJJ       
        JNZ SZYS5       
        PUSH AX
        CALL JSJJ       
        POP AX          
        MOV YSF1,AL     
        JMP SZYS4
SZYS5:
        MOV YSF2,AL     
        CALL LOADATE    
        MOV NUM3,AX
        MOV NUM3+2,DX
        CALL JSII2      
        JMP SZYS4_1     
SZYS6:
        MOV CL,AL
        CMP AL,13
        JNZ SZYS9
SZYS7:
        CALL JSJG
        CMP JUV,0
        JZ SZYS8
        DEC JUV
        POP YSF
        POP NUM2+2
        POP NUM2
        POP NUM1+2
        POP NUM1
        RET
SZYS8:
        CMP CL,')'
        JZ SZYS10
        MOV JGV4,AX
        MOV JGV4+2,DX
        JNZ SZYS12
SZYS9:
        CMP AL,')'
        JNZ SZYS11
        INC SI
        JMP SZYS7
SZYS10:
        MOV NUM1,AX
        MOV NUM1+2,DX
        JMP SZYS1
SZYS11:
        STC
        RET
SZYS12:
        CLC
        RET
;数制处理
UVIL    LABEL NEAR
        PUSH SI
UVIL1:
        LODSB
        CMP AL,' '
        JZ UVIL2
        CMP AL,9
        JZ UVIL2
        CMP AL,13
        JZ UVIL4
        JNZ UVIL1
UVIL2:
        MOV BX,SI
        CALL OVERS
        JZ UVIL3
        LODSW
        CALL OVERS
        POP SI
        JNZ SZYS11
        CMP AX,'01'
        JNZ SZYS11
        PUSH SI
        MOV UV,10
UVIL3:
        MOV AL,13
        MOV [BX-1],AL
UVIL4:
        POP SI
        CLC
        RET
;预置结果
YVJG    LABEL NEAR
        MOV AH,52H
        INT 21H
        MOV AX,ES:[BX-2]
        MOV DS,AX
        MOV AX,DS:[0CH]
        MOV CS:JGV4,AX
        MOV AX,DS:[0EH]
        MOV CS:JGV4+2,AX
        PUSH CS
        POP DS
        PUSH CS
        POP ES
        RET
;保存结果
BCJG    LABEL NEAR
        MOV AH,52H
        INT 21H
        MOV AX,ES:[BX-2]
        MOV DS,AX
        MOV AX,CS:JGV4
        MOV DS:[0CH],AX
        MOV AX,CS:JGV4+2
        MOV DS:[0EH],AX
        PUSH CS
        POP DS
        PUSH CS
        POP ES
        RET
STAR:
        MOV SI,81H
        CLD
        CALL OVERS
        JNZ STAR1
STAR0:
        MOV DX,OFFSET MESS1
        JMP STAR4
STAR1:
        CALL YVJG
        CALL UVIL
        JB STAR0
        MOV SAVESP,SP
        CALL SZYS
        MOV SP,SAVESP
        MOV DX,OFFSET MESS2
        JB STAR4
        CALL CRLF
        CALL XUJG
        CALL BCJG
        MOV DX,OFFSET MESS3
STAR4:
        MOV AH,9
        INT 21H
        INT 20H
SAVESP  DW 0
MESS1   DB 13,10,'  Syntax:',13,10
        DB '     JS  <Expression>  [10]',13,10,'$'
MESS2   DB 'Error in expression !$'
MESS3   DB 13,10,'$'
CODE    ENDS
        END NEWSTAR

3 楼

太长了吧!

4 楼

太长了

5 楼

谁能画出这个四则运算的流程图吗?我现在急需一个100行的源程序,主要是有流程图的,我其它编程语言基本都学了,就不会汇编!

我来回复

您尚未登录,请登录后再回复。点此登录或注册