问题描述
- MOV AL,INPUT+2 ;这里为什么+2,谢谢
-
;功能:输入一个0~19的整数,输出其平方值;作者:KDF5000
;时间:2012.11.9
.386
DATA SEGMENT USE16
SQUARE DW 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361 ;存入0~19的平方值便于查询
INPUT DB 8
DB ?
DB 8 DUP('$') ;次缓冲区用于存放输入的值
OUTPUT DB '$' ;此区存放平方值的输出
ERROR DB 'your input is incorrect!$'
MESSAGE DB 'please enter a number(0~19):$'
RESULT DB 0DH,0AH,' the result is:$'
EXITMES DB 0DH,0AH,'thank you for your use!',0DH,0AH,'$'
HUANHANG DB 0DH,0AH,'$'
DATA ENDS
STACK SEGMENT USE16 STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT USE16
ASSUME DS:DATA,CS:CODE,SS:STACK
BEGIN:
MOV AX,DATA
MOV DS,AX
;输出提示信息 LEA DX,MESSAGE MOV AH,9 INT 21H ; 输入数值 LEA DX,INPUT MOV AH,10 INT 21H ;如果输入空格则推出程序 MOV AL,INPUT+2 ;***********************这里为什么+2 CMP AL,20H JE EXIT ;取出输入的数值 LEA SI,INPUT+2 MOV AX,0 MOV BL,10 MOV CL,INPUT+1 ;记录循环的次数 ;将输入的值放到AX
LOPA: MOV DL,[SI]
DEC CL
SUB DL,30H
MUL BL
ADD AX,DX
INC SI
CMP CL,0
JE NEXT
JMP LOPA
NEXT:
;如果输入的数字大于十九或者小于小于0报错
CMP AX,19
JG ERROR1
CMP AX,0
JB ERROR1
MOV BP,AX ;将输入的数据作为变量 MOV AX,SQUARE[EBP*2] ;此时AX存放平方值 MOV CL,10 ;设置除数 MOV SI,OFFSET OUTPUT
LOPB: ;次循环为把已经存入的平方值转换为十进值输出
DEC SI
DIV CL
ADD AH,30H
MOV [SI],AH
MOV AH,0
CMP AL,0
JNE LOPB
;输出结果提示
LEA DX,RESULT
MOV AH,9
INT 21H
;输出十进制平方值
MOV DX,SI
MOV AH,9
INT 21H
;输出换行
LEA DX,HUANHANG
MOV AH,9
INT 21H
;跳到开始继续输入
JMP BEGIN
ERROR1:
LEA DX,HUANHANG
MOV AH,9
INT 21H
LEA DX,ERROR MOV AH,9 INT 21H LEA DX,HUANHANG MOV AH,9 INT 21H JMP BEGIN
EXIT:
LEA DX,EXITMES ;输出退出信息
MOV AH,9
INT 21H
MOV AH,4CH INT 21H
CODE ENDS
END BEGIN
解决方案
;如果输入空格则推出程序
MOV AL,INPUT+2 ;***********************这里为什么+2
CMP AL,20H
JE EXIT
这里为什么+2啊。。。谢谢啦~~~
解决方案二:
用int 21h接收字符串的缓冲区的格式是第一个字节是缓冲区大小,第二个字节是实际接收的大小,第三个字节起才是实际内容。所以INPUT+2才是实际接收内容的第一个字符。