回 帖 发 新 帖 刷新版面

主题:很简单的问题,请帮忙解答

我自己编写了一个四则运算的小程序

很简单
但时用的顺序的方法
因为里面有许多重复的东西
想改成子程序调用
改了之后link也没问题
可是,不能运行。
说 不是有效的win32应用程序。


下面是没有盖完的部分代码
请帮我看一下
十分感谢!!

DATA    SEGMENT
    A DW ?
    B DW ?
    C DW ?
    D DW 0
    BCS DW 10000,1000,100,10,1    ;输出时候的被除数
    S DB 5 DUP(30H),24H        ;被输出数各个位的数字
    M DB ?                ;前0不输出的标志位
DATA    ENDS


STACK    SEGMENT  PARA  STACK  'STACK'  ; 定义堆栈段开始
    DW    100 DUP(100)    ;堆栈大小为100个字
STACK    ENDS

CODE    SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK

MAIN PROC FAR
;----------------------------
BEGIN:    MOV    AX,DATA
    MOV    DS,AX
    MOV    AX,STACK
    MOV    SS,AX

    MOV    SI,82H
    CALL    INPUT
    MOV    A,BX    ;把第一个数存到A
    PUSH    SI    ;把操作符位置入栈
    ADD    SI,1    ;指向下一个操作数
    CALL    INPUT
    MOV    B,BX

    MOV    DX,A
    CALL    PRINT

    MOV    AH,4CH
    INT    21H

MAIN    ENDP
;-------------------------
INPUT  PROC NEAR
NEW:    XOR    AX,AX
    MOV    AL,ES:[SI]
    SUB    AL,30H
    JL    NEXT
    CMP    AL,9
    JG    NEXT
    CBW

    XCHG    AX,BX
    MOV    CX,10
    MUL    CX
    XCHG    AX,BX
    ADD    BX,AX
    ADD    SI,1
    JMP    NEW

NEXT:    RET
INPUT ENDP

;----------------------------

PRINT  PROC NEAR
    MOV    SI,0
    MOV    DI,0
    MOV    CX,5
    ;MOV    DX,C    ;~~~~~~~~
    
T:    MOV    AX,DX
    XOR    DX,DX
    DIV    BCS[SI]
    ADD    S[DI],AL
    INC    DI
    ADD    SI,2
    LOOP    T
    
    MOV    CX,5
    LEA    SI,S
    MOV    M,0    ;前0不输出的标志位

    MOV    DL,0AH    ;换行回车
    MOV    AH,2
    INT    21H
    MOV    DL,0DH
    MOV    AH,2
    INT    21H    

T3:    MOV    DL,[SI]    ;前零判断,不输出
    CMP    M,1
    JE    T5
    CMP    DL,30H        
    JE    T4
T5:    MOV    AH,2
    INT    21H
    MOV    M,1
T4:    INC    SI
    LOOP    T3
    
    RET
PRINT ENDP
;----------------------    
    

CODE    ENDS

回复列表 (共1个回复)

沙发

本来就不是WIN32程序呀,不知你的运行环境是什么?
代码没什么大问题,我稍做修改。但不知它要从命令行里
得到什么参数,所以不知结果是否正确。
DATA    SEGMENT
    A DW ?
    B DW ?
    C DW ?
    D DW 0
    BCS DW 10000,1000,100,10,1    ;输出时候的被除数
    S DB 5 DUP(30H),24H        ;被输出数各个位的数字
    M DB ?                ;前0不输出的标志位
DATA    ENDS


STACK    SEGMENT  PARA  STACK  'STACK'  ; 定义堆栈段开始
    DW    100 DUP(100)    ;堆栈大小为100个字
STACK    ENDS

CODE    SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK

MAIN PROC FAR
;----------------------------
BEGIN:    MOV    AX,DATA
    MOV    DS,AX

    MOV    SI,82H
    CALL    INPUT
    MOV    A,BX    ;把第一个数存到A
    PUSH    SI    ;把操作符位置入栈
    ADD    SI,1    ;指向下一个操作数
    CALL    INPUT
    MOV    B,BX

    MOV    DX,A
    CALL    PRINT

    MOV    AH,4CH
    INT    21H

MAIN    ENDP
;-------------------------
INPUT  PROC NEAR
NEW:    XOR    AX,AX
    MOV    AL,ES:[SI]
    SUB    AL,30H
    JL    NEXT
    CMP    AL,9
    JG    NEXT
    CBW

    XCHG    AX,BX
    MOV    CX,10
    MUL    CX
    XCHG    AX,BX
    ADD    BX,AX
    ADD    SI,1
    JMP    NEW

NEXT:    RET
INPUT ENDP

;----------------------------

PRINT  PROC NEAR
    MOV    SI,0
    MOV    DI,0
    MOV    CX,5
    ;MOV    DX,C    ;~~~~~~~~
    
T:    MOV    AX,DX
    XOR    DX,DX
    DIV    BCS[SI]
    ADD    S[DI],AL
    INC    DI
    ADD    SI,2
    LOOP    T
    
    MOV    CX,5
    LEA    SI,S
    MOV    M,0    ;前0不输出的标志位

    MOV    DL,0AH    ;换行回车
    MOV    AH,2
    INT    21H
    MOV    DL,0DH
    MOV    AH,2
    INT    21H    

T3:    MOV    DL,[SI]    ;前零判断,不输出
    CMP    M,1
    JE    T5
    CMP    DL,30H        
    JE    T4
T5:    MOV    AH,2
    INT    21H
    MOV    M,1
T4:    INC    SI
    LOOP    T3
    
    RET
PRINT ENDP
;----------------------    
CODE    ENDS
    end main

我来回复

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