- 查平方表。在数据段中建立一个表格TABLE,存放0~9的平方值。从键盘输入一个十进制数字(0~9),查表求键入数字的平方值。并把结果显示在CRT屏幕上。
- 能够单步执行程序,认真观察、判断每条指令执行的结果是否正确,对错误结果,能够做出相应的处理。
解决问题:
ASSUME CS:CODE, DS:DATA
;数据段
DATA SEGMENT
TABLE DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
BUF1 DB 'INPUT(0~9):', 0DH, 0AH, '$'
BUF2 DB ' OUTPUT IS $'
DATA ENDS
;代码段
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX ;获得数据段的段地址
LEA DX, BUF1 ;字符串BUF1首地址
MOV AH, 09H ;字符串输出
INT 21H
;输入字符
MOV AH, 01H
INT 21H ;存到AL里
;XLAT 换码指令 将DS:[BX+AL]指向的存储单元的内容送到AL
AND AL, 0FH ;将AL高四位清零
LEA BX, TABLE ;偏移地址赋给BX
XLAT
PUSH AX ;为什么要保护AX呢?
LEA DX, BUF2 ;字符串BUF2首地址
MOV AH, 09H ;字符串输出
INT 21H
POP AX ;出栈
CALL DISPLAY
MOV AH, 4CH
INT 21H
;将16进制转换成ASCII码,在屏幕上输出
DISPLAY:
PUSH BX ;压入堆栈保护
PUSH CX
;数位分离,分别显示个位十位
MOV AH,0
MOV BL,10
DIV BL ; AX/10,商送AL余数送AH
XCHG AL,AH ;一条语句实现交换AL与AH内容
OR AX,3030H ;或3030H,将数字转ASCII码
MOV CX,AX
MOV DL,CH ;AH送DL
MOV AH,02H ;单字符显示DL的内容
INT 21H
MOV DL,CL ;AL送DL
MOV AH,02H ;单字符显示DL的内容
INT 21H
POP CX ;先出
POP BX
RET
CODE ENDS
END START
编程思路:
- 先在数据段定义好一个数组TABLE,存放0~9的平方数,并且声明变量类型
- 然后创建两个字符串(BUF1、BUF2)用来提示输入输出数据
- 在代码段中先将数据段的段地址送给DS
- 取BUF1的首地址,用21H中的09H输出字符串
- 调用21H功能包中的01H,从键盘输入一个字符x(本字符存储到AL中)
- 将AL高四位清零(0~9是10个数,需要四位的空间,AL高4位用不到,所以清零)
- 取TABLE的地址送给BX,然后使用换码指令取出TABLE变量的第x位数据
- 此时将AX压入堆栈保护起来,(后面有用到AH)
- 取BUF2的首地址,用21H中的09H输出字符串
- AX出栈,调用显示十六进制转ASCII码的程序
优化代码,输出数据更整洁
ASSUME CS:CODE, DS:DATA
;数据段
DATA SEGMENT
TABLE DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
BUF1 DB 'Please enter a number. (0~9): ', '$'
BUF2 DB 'The square of the number is $'
CHANGELINE DB 13,10,'$';用来表示换行符
DATA ENDS
;代码段
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX ;获得数据段的段地址
LEA DX, BUF1 ;字符串BUF1首地址
MOV AH, 09H ;字符串输出
INT 21H
MOV AH, 01H ;从键盘输入一个字符
INT 21H ;存到AL里
;XLAT 换码指令 将DS:[BX+AL]指向的存储单元的内容送到AL
AND AL, 0FH ;将AL高四位清零, AL=输入的数字
LEA BX, TABLE ;偏移地址赋给BX
XLAT ;换码后, AL = 变量TABLE中第AL位(把AL当做下标,查询变量TABLE)
PUSH AX ;先保护AX, 因为下面要调用输出字符串的命令,AH=09H,会改变AX内容
MOV DX,OFFSET CHANGELINE ;输出换行符
MOV AH,09H
INT 21H
LEA DX, BUF2 ;字符串BUF2首地址
MOV AH, 09H ;字符串输出
INT 21H
POP AX ;出栈
CALL DISPLAY
MOV AH, 4CH
INT 21H
;将16进制转换成ASCII码,在屏幕上输出
DISPLAY:
PUSH BX ;压入堆栈保护
PUSH CX
;数位分离,分别显示个位十位
MOV AH,0
MOV BL,10
DIV BL ; AX/10,商送AL余数送AH
XCHG AL,AH ;一条语句实现交换AL与AH内容
OR AX,3030H ;或3030H,将数字转ASCII码
MOV CX,AX
MOV DL,CH ;AH送DL
MOV AH,02H ;单字符显示DL的内容
INT 21H
MOV DL,CL ;AL送DL
MOV AH,02H ;单字符显示DL的内容
INT 21H
POP CX ;先出
POP BX
RET
CODE ENDS
END START
运行结果: