;輸入2個數
;累加
;輸出結果
DATASSEGMENT
;此處輸入資料段程式碼
MESS1DB"Input2numbers:","$";提示輸入
MESS2DB"Sumofthenumbers:","$";提示輸出
MESS3DB"ERROR!Inputagain!","$";提示錯誤
SEPRDB0DH,0AH,"$";分隔符
NEQU2;N個數
NUMDWNDUP(?);陣列
SUMDD?;N個數的和
DATASENDS
STACKSSEGMENT
;此處輸入堆疊段程式碼
DW40HDUP(?)
TOPLABELWORD
STACKSENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS,ES:DATAS,SS:STACKS
MAINPROCFAR
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
MOVAX,STACKS
MOVSS,AX
LEASP,TOP
;此處輸入程式碼段程式碼
MOVAH,9
LEADX,MESS1
INT21H
LEADX,SEPR
MOVCX,LENGTHNUM
LEADI,NUM
CLD
L1:
CALLINPUT;輸入一個十進位制有符號數
STOSW
LOOPL1
XORBX,BX;低位
XORDI,DI;高位
LEASI,NUM
L2:
LODSW
CWD;考慮溢位
ADDBX,AX
ADCDI,DX
LOOPL2
MOVWORDPTRSUM[0],BX;儲存運算結果
MOVWORDPTRSUM[2],DI;儲存運算結果
INT21H;輸出分隔符
LEADX,MESS2
CALLOUTPUT;輸出一個-65534~65534之間的32位十進位制有符號數的結果
MOVAH,4CH
MAINENDP
;傳入引數:無
;返回值:AX輸入的一個數
;功能:輸入一個-32768~32767之間的十進位制有符號數,儲存在陣列對應位置上
INPUTPROCNEAR
PUSHSI
PUSHDI
MOVSI,10;進位制數
XORDI,DI;符號位
L6:
XORBX,BX;最終的數字
MOVAH,1
CMPAL,"-"
JNEL8
INCDI
L7:
CMPAL,"";輸入一個空格或者回車則輸入結束
JEL10
CMPAL,0DH
JEL9
L8:
CMPAL,"0"
JBL0
CMPAL,"9"
JAL0;非數字,則重新輸入
ANDAX,0FH
XCHGAX,BX
MULSI
JSL0;乘法溢位,則重新輸入
JSL0;加法溢位,則重新輸入
JMPSHORTL7
L9:
PUSHDX
MOVDL,0AH
MOVAH,2
POPDX
L10:
CMPDI,0
JEL11
NEGBX;求補碼
L11:
MOVAX,BX
POPDI
POPSI
RET
L0:
;異常處理
LEADX,MESS3
JMPSHORTL6
INPUTENDP
;傳入引數:SI,數字儲存位置
;返回值:陣列
;功能:從儲存位置上取出一個數,以十進位制有符號數輸出
OUTPUTPROCNEAR
PUSHBX
PUSHCX
XORBX,BX;符號位,正為0,負為1
MOVDI,10
XORCX,CX
MOVAX,WORDPTRSUM[0]
MOVDX,WORDPTRSUM[2]
TESTDX,8000
JZL13
INCBX
DECAX
SBBDX,0
NOTAX
NOTDX
L13:
DIVDI
ADDDX,30H
XORDX,DX
INCCX
CMPAX,0
JNEL13
CMPBX,0
JEL14
MOVDL,"-"
L14:
LOOPL14
POPCX
POPBX
OUTPUTENDP
CODESENDS
ENDSTART
;輸入2個數
;累加
;輸出結果
DATASSEGMENT
;此處輸入資料段程式碼
MESS1DB"Input2numbers:","$";提示輸入
MESS2DB"Sumofthenumbers:","$";提示輸出
MESS3DB"ERROR!Inputagain!","$";提示錯誤
SEPRDB0DH,0AH,"$";分隔符
NEQU2;N個數
NUMDWNDUP(?);陣列
SUMDD?;N個數的和
DATASENDS
STACKSSEGMENT
;此處輸入堆疊段程式碼
DW40HDUP(?)
TOPLABELWORD
STACKSENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS,ES:DATAS,SS:STACKS
MAINPROCFAR
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
MOVAX,STACKS
MOVSS,AX
LEASP,TOP
;此處輸入程式碼段程式碼
MOVAH,9
LEADX,MESS1
INT21H
LEADX,SEPR
INT21H
MOVCX,LENGTHNUM
LEADI,NUM
CLD
L1:
CALLINPUT;輸入一個十進位制有符號數
STOSW
LOOPL1
XORBX,BX;低位
XORDI,DI;高位
MOVCX,LENGTHNUM
LEASI,NUM
CLD
L2:
LODSW
CWD;考慮溢位
ADDBX,AX
ADCDI,DX
LOOPL2
MOVWORDPTRSUM[0],BX;儲存運算結果
MOVWORDPTRSUM[2],DI;儲存運算結果
LEADX,SEPR
MOVAH,9
INT21H;輸出分隔符
MOVAH,9
LEADX,MESS2
INT21H
LEADX,SEPR
MOVAH,9
INT21H;輸出分隔符
CALLOUTPUT;輸出一個-65534~65534之間的32位十進位制有符號數的結果
MOVAH,4CH
INT21H
MAINENDP
;傳入引數:無
;返回值:AX輸入的一個數
;功能:輸入一個-32768~32767之間的十進位制有符號數,儲存在陣列對應位置上
INPUTPROCNEAR
PUSHSI
PUSHDI
MOVSI,10;進位制數
XORDI,DI;符號位
L6:
XORBX,BX;最終的數字
MOVAH,1
INT21H
CMPAL,"-"
JNEL8
INCDI
L7:
MOVAH,1
INT21H
CMPAL,"";輸入一個空格或者回車則輸入結束
JEL10
CMPAL,0DH
JEL9
L8:
CMPAL,"0"
JBL0
CMPAL,"9"
JAL0;非數字,則重新輸入
ANDAX,0FH
XCHGAX,BX
MULSI
JSL0;乘法溢位,則重新輸入
ADDBX,AX
JSL0;加法溢位,則重新輸入
JMPSHORTL7
L9:
PUSHDX
MOVDL,0AH
MOVAH,2
INT21H
POPDX
L10:
CMPDI,0
JEL11
NEGBX;求補碼
L11:
MOVAX,BX
POPDI
POPSI
RET
L0:
;異常處理
MOVAH,9
LEADX,SEPR
INT21H
LEADX,MESS3
INT21H
LEADX,SEPR
INT21H
JMPSHORTL6
INPUTENDP
;傳入引數:SI,數字儲存位置
;返回值:陣列
;功能:從儲存位置上取出一個數,以十進位制有符號數輸出
OUTPUTPROCNEAR
PUSHBX
PUSHCX
PUSHDI
XORBX,BX;符號位,正為0,負為1
MOVDI,10
XORCX,CX
MOVAX,WORDPTRSUM[0]
MOVDX,WORDPTRSUM[2]
TESTDX,8000
JZL13
INCBX
DECAX
SBBDX,0
NOTAX
NOTDX
L13:
DIVDI
ADDDX,30H
PUSHDX
XORDX,DX
INCCX
CMPAX,0
JNEL13
MOVAH,2
CMPBX,0
JEL14
MOVDL,"-"
INT21H
L14:
POPDX
INT21H
LOOPL14
POPDI
POPCX
POPBX
RET
OUTPUTENDP
CODESENDS
ENDSTART