80x86汇编语言--输入表达式,再计算
2016-01-25 12:10
357 查看
;键盘输入一个算术表达式,计算表达式的值,以十进制、十六进制、及二进制格式输出结果。
;题目链接:http://zhidao.baidu.com/question/1988322359970071147.html
;其中表达式中包含的整数均为十进制非符号数(其值 < pow(2, 32));
;表达式中包含的运算符包括+、*两个;
;计算时不考虑运算符的优先级,即一律从左到右计算;
;计算过程中若有值超过32位,则一律忽略超过32位的部分,故计算的最终结果不会超过32位。
;例如:
;输入:
;1234*5678+98765*54321+12345678
;输出:
;1234*5678+98765*54321+12345678=
;3733613191
;DE8A6A87h
;1101 1110 1000 1010 0110 1010 1000 0111B
;做而论道编写程序如下:
ASSUME CS:CC, DS:QW
;1234*5678+98765*54321+12345678=
;37 33 61 31 91
;DE8A6A87h
;1101 1110 1000 1010 0110 1010 1000 0111B
QW SEGMENT
S1 DB '1234*5678+98765*54321+12345678= '
MSG DB 'Input arithmetic expression:', 13, 10, 36
SN DB 80
SX DB ?
S2 DB 85 DUP(?)
N1 DW 0
N2 DW 0
M1 DW 0134
M2 DW 0
X DW ?, ?, ?, ?, ?, ?, ?, ?
Y DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;存放BCD码
QW ENDS
;--------------------
CC SEGMENT
START:
MOV AX, QW
MOV DS, AX
LEA DX, MSG
MOV AH, 9
INT 21H
LEA DX, SN
MOV AH, 10
INT 21H
MOV CL, SX
MOV CH, 0
MOV SN, 13
MOV SX, 10
LEA DI, S2
ADD DI, CX
MOV BYTE PTR [DI], '='
INC DI
MOV BYTE PTR [DI], 13
INC DI
MOV BYTE PTR [DI], 10
INC DI
MOV BYTE PTR [DI], 36
LEA DX, SN
MOV AH, 9
INT 21H
; LEA SI, S1 ;使用内定的表达式来计算
LEA SI, S2 ;使用键入的表达式来计算
MOV N1, 0
MOV N2, 0
CALL READ_STR_N1
MOV AX, N1
MOV M1, AX
MOV AX, N2
MOV M2, AX
M_LOOP:
CMP BYTE PTR [SI], '*'
JZ M_CHE
CMP BYTE PTR [SI], '+'
JZ M_JIA
CMP BYTE PTR [SI], '='
JZ M_END
JMP EXIT
M_CHE:
INC SI
MOV N1, 0
MOV N2, 0
CALL READ_STR_N1
CALL MUL32_32
MOV AX, X + 0
MOV M1, AX
MOV AX, X + 2
MOV M2, AX
JMP M_LOOP
M_JIA:
INC SI
MOV N1, 0
MOV N2, 0
CALL READ_STR_N1
MOV AX, N1
ADD AX, M1
MOV M1, AX
MOV AX, N2
ADC AX, M2
MOV M2, AX
JMP M_LOOP
M_END:
MOV AX, M1
MOV X + 0, AX
MOV AX, M2
MOV X + 2, AX
MOV X + 4, 0
MOV X + 6, 0
CALL BIN2BCD
CALL DISP
CALL CR_LF
CALL DISP_HEX
CALL CR_LF
CALL DISP_BIN
EXIT:
MOV AH, 4CH
INT 21H
;---------------------------
CR_LF:
MOV AH, 2
MOV DL, 13 ;回车换行
INT 21H
MOV DL, 10
INT 21H
RET
;---------------------------
DISP_HEX: ;十六进制显示
MOV BX, M2
CALL @F
MOV BX, M1
CALL @F
MOV DL, 'H'
INT 21H
RET
@@: MOV CH, 4
MOV CL, 4
@@: ROL BX, CL
MOV AL, BL
AND AL, 0FH
ADD AL, 90H
DAA
ADC AL, 40H
DAA
MOV DL, AL
MOV AH, 2
INT 21H
DEC CH
JNZ @B
RET
;---------------------------
DISP_BIN:
MOV BX, M2
CALL @F
MOV BX, M1
CALL @F
MOV DL, 8
INT 21H
MOV DL, 'B'
INT 21H
RET
@@: MOV CX, 16
MOV AH, 2
@@: MOV DL, '0'
TEST BX, 8000H
JE PP1
INC DL
PP1:INT 21H
ADD BX, BX
DEC CX
TEST CX, 03H
JNE PP2
MOV DL, ' '
INT 21H
PP2:INC CX
LOOP @B
RET
;---------------------------
READ_STR_N1:
CMP BYTE PTR [SI], '*'
JZ READ_END
CMP BYTE PTR [SI], '+'
JZ READ_END
CMP BYTE PTR [SI], '='
JZ READ_END
MOV AX, N1
MOV BX, 10
MUL BX
MOV N1, AX
MOV AX, N2
MOV N2, DX
MUL BX
ADD N2, AX
MOV AL, [SI]
AND AL, 0FH
MOV AH, 0
ADD N1, AX
ADC N2, 0
INC SI
JMP READ_STR_N1
READ_END:
RET
;---------------------------
MUL32_32:
MOV AX, N1
MOV BX, M1
MUL BX
MOV X + 0, AX
MOV X + 2, DX
MOV X + 4, 0
MOV X + 6, 0
MOV AX, N2
MOV BX, M1
MUL BX
ADD X + 2, AX
ADC X + 4, DX
MOV AX, N1
MOV BX, M2
MUL BX
ADD X + 2, AX
ADC X + 4, DX
ADC X + 6, 0
MOV AX, N2
MOV BX, M2
MUL BX
ADD X + 4, AX
ADC X + 6, DX
RET
;---------------------------
BIN2BCD:
MOV CX, 64 ;64位数变换成BCD码
_L0_:
PUSH CX
LEA BX, X
MOV CX, 8
CLC
_L1_:
MOV AL, [BX]
ADC AL, AL
MOV [BX], AL
INC BX
LOOP _L1_
LEA BX, Y + 9
MOV CX, 10
_L2_:
MOV AL, [BX]
ADC AL, AL
DAA
MOV [BX], AL
DEC BX
LOOP _L2_
POP CX
LOOP _L0_
RET
;---------------------------
DISP:
LEA BX, Y + 5
MOV CX, 5
_L3_:
MOV AL, [BX]
MOV AH, 0
MOV DL, 16
DIV DL
MOV DL, AL
AND DL, 0FH
ADD DL, 30H
MOV AH, 02H
INT 21H
MOV DL, [BX]
AND DL, 0FH
ADD DL, 30H
MOV AH, 02H
INT 21H
INC BX
LOOP _L3_
RET
;---------------------------
CC ENDS
END START
本程序运行后,输入、输出,完全符合题目的要求。
;题目链接:http://zhidao.baidu.com/question/1988322359970071147.html
;其中表达式中包含的整数均为十进制非符号数(其值 < pow(2, 32));
;表达式中包含的运算符包括+、*两个;
;计算时不考虑运算符的优先级,即一律从左到右计算;
;计算过程中若有值超过32位,则一律忽略超过32位的部分,故计算的最终结果不会超过32位。
;例如:
;输入:
;1234*5678+98765*54321+12345678
;输出:
;1234*5678+98765*54321+12345678=
;3733613191
;DE8A6A87h
;1101 1110 1000 1010 0110 1010 1000 0111B
;做而论道编写程序如下:
ASSUME CS:CC, DS:QW
;1234*5678+98765*54321+12345678=
;37 33 61 31 91
;DE8A6A87h
;1101 1110 1000 1010 0110 1010 1000 0111B
QW SEGMENT
S1 DB '1234*5678+98765*54321+12345678= '
MSG DB 'Input arithmetic expression:', 13, 10, 36
SN DB 80
SX DB ?
S2 DB 85 DUP(?)
N1 DW 0
N2 DW 0
M1 DW 0134
M2 DW 0
X DW ?, ?, ?, ?, ?, ?, ?, ?
Y DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;存放BCD码
QW ENDS
;--------------------
CC SEGMENT
START:
MOV AX, QW
MOV DS, AX
LEA DX, MSG
MOV AH, 9
INT 21H
LEA DX, SN
MOV AH, 10
INT 21H
MOV CL, SX
MOV CH, 0
MOV SN, 13
MOV SX, 10
LEA DI, S2
ADD DI, CX
MOV BYTE PTR [DI], '='
INC DI
MOV BYTE PTR [DI], 13
INC DI
MOV BYTE PTR [DI], 10
INC DI
MOV BYTE PTR [DI], 36
LEA DX, SN
MOV AH, 9
INT 21H
; LEA SI, S1 ;使用内定的表达式来计算
LEA SI, S2 ;使用键入的表达式来计算
MOV N1, 0
MOV N2, 0
CALL READ_STR_N1
MOV AX, N1
MOV M1, AX
MOV AX, N2
MOV M2, AX
M_LOOP:
CMP BYTE PTR [SI], '*'
JZ M_CHE
CMP BYTE PTR [SI], '+'
JZ M_JIA
CMP BYTE PTR [SI], '='
JZ M_END
JMP EXIT
M_CHE:
INC SI
MOV N1, 0
MOV N2, 0
CALL READ_STR_N1
CALL MUL32_32
MOV AX, X + 0
MOV M1, AX
MOV AX, X + 2
MOV M2, AX
JMP M_LOOP
M_JIA:
INC SI
MOV N1, 0
MOV N2, 0
CALL READ_STR_N1
MOV AX, N1
ADD AX, M1
MOV M1, AX
MOV AX, N2
ADC AX, M2
MOV M2, AX
JMP M_LOOP
M_END:
MOV AX, M1
MOV X + 0, AX
MOV AX, M2
MOV X + 2, AX
MOV X + 4, 0
MOV X + 6, 0
CALL BIN2BCD
CALL DISP
CALL CR_LF
CALL DISP_HEX
CALL CR_LF
CALL DISP_BIN
EXIT:
MOV AH, 4CH
INT 21H
;---------------------------
CR_LF:
MOV AH, 2
MOV DL, 13 ;回车换行
INT 21H
MOV DL, 10
INT 21H
RET
;---------------------------
DISP_HEX: ;十六进制显示
MOV BX, M2
CALL @F
MOV BX, M1
CALL @F
MOV DL, 'H'
INT 21H
RET
@@: MOV CH, 4
MOV CL, 4
@@: ROL BX, CL
MOV AL, BL
AND AL, 0FH
ADD AL, 90H
DAA
ADC AL, 40H
DAA
MOV DL, AL
MOV AH, 2
INT 21H
DEC CH
JNZ @B
RET
;---------------------------
DISP_BIN:
MOV BX, M2
CALL @F
MOV BX, M1
CALL @F
MOV DL, 8
INT 21H
MOV DL, 'B'
INT 21H
RET
@@: MOV CX, 16
MOV AH, 2
@@: MOV DL, '0'
TEST BX, 8000H
JE PP1
INC DL
PP1:INT 21H
ADD BX, BX
DEC CX
TEST CX, 03H
JNE PP2
MOV DL, ' '
INT 21H
PP2:INC CX
LOOP @B
RET
;---------------------------
READ_STR_N1:
CMP BYTE PTR [SI], '*'
JZ READ_END
CMP BYTE PTR [SI], '+'
JZ READ_END
CMP BYTE PTR [SI], '='
JZ READ_END
MOV AX, N1
MOV BX, 10
MUL BX
MOV N1, AX
MOV AX, N2
MOV N2, DX
MUL BX
ADD N2, AX
MOV AL, [SI]
AND AL, 0FH
MOV AH, 0
ADD N1, AX
ADC N2, 0
INC SI
JMP READ_STR_N1
READ_END:
RET
;---------------------------
MUL32_32:
MOV AX, N1
MOV BX, M1
MUL BX
MOV X + 0, AX
MOV X + 2, DX
MOV X + 4, 0
MOV X + 6, 0
MOV AX, N2
MOV BX, M1
MUL BX
ADD X + 2, AX
ADC X + 4, DX
MOV AX, N1
MOV BX, M2
MUL BX
ADD X + 2, AX
ADC X + 4, DX
ADC X + 6, 0
MOV AX, N2
MOV BX, M2
MUL BX
ADD X + 4, AX
ADC X + 6, DX
RET
;---------------------------
BIN2BCD:
MOV CX, 64 ;64位数变换成BCD码
_L0_:
PUSH CX
LEA BX, X
MOV CX, 8
CLC
_L1_:
MOV AL, [BX]
ADC AL, AL
MOV [BX], AL
INC BX
LOOP _L1_
LEA BX, Y + 9
MOV CX, 10
_L2_:
MOV AL, [BX]
ADC AL, AL
DAA
MOV [BX], AL
DEC BX
LOOP _L2_
POP CX
LOOP _L0_
RET
;---------------------------
DISP:
LEA BX, Y + 5
MOV CX, 5
_L3_:
MOV AL, [BX]
MOV AH, 0
MOV DL, 16
DIV DL
MOV DL, AL
AND DL, 0FH
ADD DL, 30H
MOV AH, 02H
INT 21H
MOV DL, [BX]
AND DL, 0FH
ADD DL, 30H
MOV AH, 02H
INT 21H
INC BX
LOOP _L3_
RET
;---------------------------
CC ENDS
END START
本程序运行后,输入、输出,完全符合题目的要求。
相关文章推荐
- 80x86 汇编语言:键控顺序显示不同符号序列
- 此博客记录我的日常学习过程
- 80x86汇编语言--计算 S = 1 + 2*3 + 3*4 + 4*5 + …… + N*(N + 1)
- 80x86汇编语言--关于 π 的近似计算
- 80x86 汇编语言编程:输出指定行数的星号
- 点钞机质量太差了
- 51单片机A/D转换接口扩展,做一个16进制显示的电压表
- Java并发编程:Callable、Future和FutureTask
- 如何在代码中为组件设置dip,sp值
- 过滤非法字符,防止注入式攻击等
- Zabbix高可用,实现zabbix的无缝切换,无故障时间
- 如何成为MySQL DBA
- 51 汇编编程:8255 驱动矩阵键盘和数码管
- OpenBLAS安装手册
- 80x86 汇编语言:输入字符串、显示其中数字
- 80x86 汇编语言,大写变小写,小写变大写,数字原样输出
- 51单片机汇编编程--16位流水灯收缩点亮
- 80x86汇编语言:分类统计
- 51单片机汇编语言:定时器与中断
- servlet(二)