📄 judge.asm
字号:
;判断一个二次方程 ax2 + 6x + c = 0 是否有实根,其中a和c均为字节数,从键盘输入
DATA SEGMENT
BIN_A DW ? ;系数A
BIN_B DW 6 ;系数B
BIN_C DW ? ;系数C
BUF_A DB 6
DB ?
DB 6 DUP(0)
COUNT_A EQU $ - BUF_A - 2
BUF_C DB 6
DB ?
DB 6 DUP(0)
COUNT_C EQU $ - BUF_C - 2
LR_COUNT DB 2
BIN DW ? ;TEMP
SA DB 'X=','$'
SC DB 10,'Z=','$'
RESULT1 DB 10,13,'SOLVE EXIST','$'
RESULT2 DB 10,13,'SOLVE NOT EXIST','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEGIN:
;寄存器赋初值
MOV AX,DATA
MOV DS,AX
;键盘中断输入A
MOV DX,OFFSET SA
MOV AH,09
INT 21H
MOV DX,OFFSET BUF_A
MOV AH,10
INT 21H
;键盘中断输入C
MOV DX,OFFSET SC
MOV AH,09
INT 21H
MOV DX,OFFSET BUF_C
MOV AH,10
INT 21H
;将A转换成二进制存入BIN_A
MOV AX,COUNT_A
PUSH AX ;参数1
MOV AX,2+OFFSET BUF_A
PUSH AX ;参数2
CALL ATOB
MOV DX,BIN
MOV BIN_A,DX
;将C转换成二进制存入BIN_C
MOV AX,COUNT_C
PUSH AX ;参数1
MOV AX,2+OFFSET BUF_C
PUSH AX ;参数2
CALL ATOB
MOV DX,BIN
MOV BIN_C,DX
;乘法
MOV AX,BIN_B
MOV CX,BIN_B
IMUL CX
MOV BX,AX ;DX值为BIN_B*BIN_B
MOV AX,BIN_A
MOV CX,BIN_C
IMUL CX ;AX值为X*Z
MOV CX,4
IMUL CX ;AX值为4*X*Z
CMP BX,AX
JGE ROOT
NOROOT: MOV DX,OFFSET RESULT2
MOV AH,09H
INT 21H ;输出结果:无根
JMP EXIT
ROOT: MOV DX,OFFSET RESULT1
MOV AH,09H
INT 21H ;输出结果:有根
;结束
EXIT: MOV AH,4CH
INT 21H ;退出
CODE ENDS
;子程序,将输入的ASCII码转换成二进制存入BIN
PROCE SEGMENT
ASSUME CS:PROCE,DS:DATA
ATOB PROC FAR
PUSH AX ;保存现场
PUSH BX
PUSH CX
PUSH BP
MOV BP,SP
PUSHF
MOV AX,DATA
MOV DS,AX
MOV SI,[BP+12] ;OFFSET BUF_A,OFFSET BUF_B
MOV CX,[BP+14]
XOR AX,AX
AGAIN:
ADD AX,AX
MOV BX,AX
ADD AX,AX
ADD AX,AX
ADD AX,BX
MOV BH,0
MOV BL,[SI]
SUB BL,30H
ADD AX,BX
INC SI
CMP [SI],0DH ;回车结束
JLE RETURN
LOOP AGAIN
RETURN: MOV BIN,AX ;存数
POPF ;恢复现场
POP BP
POP CX
POP BX
POP AX
RET 4
ATOB ENDP
PROCE ENDS
END BEGIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -