主题:为什么出现 C 语法错误
HUANH MACRO ; 宏定义5句代码实现换行
MOV AH, 2
MOV DL, 13
INT 21H
MOV DL, 10
INT 21H
ENDM
DATA SEGMENT
MSG DB 'Please input a number: $'
RESULT DB 'The YiangHui triangle:$'
CON DB 'Do you want to continue?(Y/N): $'
ERROR DB 'Data out of range!$'
AHEAD DB ' $'
BETWEEN DB ' $'
BACK DB ' $'
a DW ? ;a为阶数
b DW ? ;b是行数
c DW ?
d DW ? ;记录位数,控制空格数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
SHURU PROC ;输入子程序,数字存在BP
XOR BP,BP
MOV BX,10
MOV CX,3 ;控制输入位数,外加一位回车
input: MOV AH,1 ;键盘输入数据
INT 21H
CMP AL,0DH ;以回车结束输入
JZ OK
SUB AL,30H ;化ASCII为HEX
CBW ;字节扩展为字
XCHG AX,BP
MUL BX ;扩大10倍
ADD BP,AX ;加一位
LOOP input
OK:
RET
SHURU ENDP
START: MOV AX,DATA
MOV DS,AX
MAIN: MOV DX,OFFSET MSG ; 输出字符串,请输入一个数
MOV AH,9
INT 21H
CALL SHURU ; 调用输入函数,显示输入的数
CMP BP,15 ; 输入的数在BP里
JB MZTJ ; 满足条件
HUANH
MOV DX,OFFSET ERROR ; 准备显示错误信息
MOV AH,9
INT 21H
HUANH
JMP MAIN
MZTJ: HUANH
MOV DX,OFFSET RESULT ; 显示提示字符串
MOV AH,9
INT 21H
HUANH
MOV AX,BP ;准备显示杨辉三角,AX=BP=阶数
CALL Showspace
MOV DL,'1' ;第一行显示空格完毕,输出'1'
MOV AH,2
INT 21H
CMP BP,1 ;阶数BP与1比较
JZ exit
MOV b,2 ;b=2
MOV CX,BP ;CX为阶数
MOV a,BP ;a为阶数
DEC a
CALL yhsj
exit: HUANH
MOV AX,BP ;准备显示杨辉三角,AX=BP=阶数
CALL Showspace
MOV DL,'1' ;第一行显示空格完毕,输出'1'
MOV AH,2
INT 21H
JMP NEAR PTR input1
yhsj: MOV c,1 ;杨辉三角
HUANH
DEC BP
MOV AX,BP
CALL Showspace ;控制首数字前面的空格数
MOV DL,'1' ;首数字必为1
MOV AH,2
INT 21H
MOV DX,OFFSET BETWEEN
MOV AH,9
INT 21H
MOV AX,1
PUSH b
CALL Calculate
POP b
INC b ;b为行数
DEC CX
CMP CX,1
JA yhsj
DEC b
CMP b,2
JZ ok3
CALL fyhsj
ok3: HUANH
INC a
MOV AX,a
CALL Showspace
MOV DL,'1'
MOV AH,2
INT 21H
input1: HUANH ;判断是否继续
MOV DX,OFFSET CON ;显示提问字符串,继续?
MOV AH,9
INT 21H
MOV AH,1 ;键盘输入数据
INT 21H
CMP AL,59H ;以回车结束输入
JNZ exit1
HUANH
JMP NEAR PTR MAIN
exit1: MOV AH,4CH
INT 21H
fyhsj: MOV c,1 ;反杨辉三角
HUANH
INC BP
MOV AX,BP
CALL Showspace
MOV DL,'1'
MOV AH,2
INT 21H
MOV DX,OFFSET BETWEEN
MOV AH,9
INT 21H
MOV AX,1
DEC b
PUSH b
CALL Calculate
POP b
INC CX
CMP CX,a
JB fyhsj
RET
Showspace:
MOV BX, AX ;首行显示空格,空格数即为输入的阶数
MOV AH, 9
MOV DX,OFFSET AHEAD
nexts:
CMP BX, 0 ;BX减1,控制输出的空格数
JZ dones
INT 21H
DEC BX
JMP nexts
dones:
RET
Calculate: DEC b
MUL b
DIV c
INC c
CMP b,0
JZ ok1
PUSH AX ;保存所得数据
MOV d,0
CALL ShowNum
MOV AX,6
SUB AX,d
CALL Showspace1
POP AX
CALL Calculate
ok1:
RET
ShowNum: MOV BX, 10 ;显示某数,并记录位数
CMP AX, 0
JZ ok2
INC d
DIV BL
PUSH AX
AND AX, 00FFH
CALL SHOWNum
POP DX
MOV DL, DH
OR DL, 30H
MOV AH, 2
INT 21H
ok2:
RET
Showspace1:MOV BX, AX
MOV AH, 9
MOV DX,OFFSET BACK
next: CMP BX, 0
JZ done
INT 21H
DEC BX
JMP next
done:
RET
CODE ENDS
END START