主题:小弟才学汇编有个题不会,请高手帮忙
zrc4898729
[专家分:0] 发布于 2007-06-23 13:53:00
小弟才学汇编有个题不会,请高手帮忙编出一个完整的程序。
输入0-9中任何1个数,显示输出这个数的平方。比如自己输入5,显示在第1排,然后答案自动输出显示在第2盘25。
关键部分请高手给个注释,谢谢了。
回复列表 (共11个回复)
沙发
heidonglgc [专家分:1370] 发布于 2007-06-23 20:53:00
CODE SEGMENT
ASSUME CS:CODE
_START: MOV AH,1H
INT 21H
SUB AL,30H
MOV BL,AL
MOV DL,0AH
MOV AH,2H
INT 21H
MOV DL,0DH
INT 21H
MOV AL,BL
MUL BL
CALL OUTPUT
MOV AH,4CH
INT 21H
;
OUTPUT PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR DX,DX
MOV CL,0
MOV BX,10000D
CONVERT:DIV BX
PUSH DX
CMP AX,0
JA PRINT
CMP CL,1
JE PRINT
JMP CNTN
PRINT: MOV CL,1
MOV DL,AL
ADD DL,30H
MOV AH,2H
INT 21H
CNTN: CMP BX,WORD PTR 1H
JBE RETURN
XOR DX,DX
MOV AX,BX
MOV BX,WORD PTR 0AH
DIV BX
MOV BX,AX
POP AX
XOR DX,DX
JMP CONVERT
RETURN: POP DX
POP DX
POP CX
POP BX
POP AX
RET
OUTPUT ENDP
CODE ENDS
END _START
其中OUTPUT是以前学的时候写的,不具有容错功能,只可参考.
板凳
zrc4898729 [专家分:0] 发布于 2007-06-24 11:02:00
你写的好象超出了我们学的范围。我运行了一次。运行不了啊。。。
3 楼
heidonglgc [专家分:1370] 发布于 2007-06-24 11:47:00
上程序几个运行特例结果:
6
36
E:\CPFROM~2\MASM5\ASM>mul
3
9
E:\CPFROM~2\MASM5\ASM>mul
9
81
E:\CPFROM~2\MASM5\ASM>mul
4
16
4 楼
topzhengjie [专家分:160] 发布于 2007-06-24 16:48:00
sseg segment
db 80h dup(0)
sseg ends
cseg segment
assume cs:cseg,ss:sseg
start: mov ah,01 ;输入一个字符功能键是可显示的
int 21h
and al,0fh ;屏蔽高4位得到其十进制数因为从键盘上输入 的 的数字在电脑里是他的asc码值
mul al ;自身乘自身即平方
mov ah,4ch
int 21h
cseg ends
end start
5 楼
忘忧→志在必得 [专家分:120] 发布于 2007-06-24 21:31:00
这些小程序自己认真写,蛮锻炼人的。
建议不要直接用别人的,起码要弄明白自己哪里卡着的,别人的思路是什么样的。
我们刚学不久也写过这程序,我做的输入0~9外的字符输出ERROR!
并且平方是以10进制输出的。在我博客里有(有部分说明):[url=http://blog.sina.com.cn/u/4c59c08a010007ud]http://blog.sina.com.cn/u/4c59c08a010007ud[/url]
6 楼
zrc4898729 [专家分:0] 发布于 2007-06-25 12:19:00
你博客里那个程序还是没办法运行。
7 楼
zrc4898729 [专家分:0] 发布于 2007-06-25 12:25:00
老师说我这个有些地方还需要修改,请高手帮忙修改下,谢谢
DATA SEGMENT
TABLE DB 0,1,4,9,16,25,36,49,64,81
ASK DB 0DH,0AH,'Please enter a nummble(0~9):',0DH,0AH,'$'
SEV DB 'Key (N/n) to close!$'
OVER DB 0DH,0AH,'ERROR!',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX ;将数据送入DS
STA: MOV DX,OFFSET SEV ;输出提示
MOV AH,9
INT 21H
MOV DX,OFFSET ASK
MOV AH,9
INT 21H
MOV AH,1 ;输入数字
INT 21H
CMP AL,'N' ;判断输入是否为“N/n”
JZ CLO ;为“N/n”则跳转至CLO
CMP AL,'n'
JZ CLO
CMP AL,'9' ;输入数字与9和0进行比较
JA OVE ;当数大于9或小于0则转移至OVE
CMP AL,'0'
JL OVE
SUB AL,30H ;将字符3转换成数字3
MOV BL,AL
LEA SI,TABLE ;将指针指向TABLE段
MOV AH,2
MOV DL,13
INT 21H ;输出回车符
MOV DL,10
INT 21H ;输出换行符
MOV AH,0 ;将AH清零
MOV AL,[SI+BX]
DIV DL ;将TABLE中的数据除以10
MOV CH,AH ;把余数送入CH中暂存
CMP AL,0 ;将商与0相比较
JZ AGI ;商为零则跳转至AGI不输出商
ADD AL,30H ;不为零则将数字转换成字符
MOV DL,AL
MOV AH,2
INT 21H ;输出商
AGI: MOV AL,CH
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H ;输出余数
MOV DL,13
INT 21H ;输出回车符
MOV DL,10
INT 21H ;输出换行符
JMP STA ;循环
OVE: MOV DX,OFFSET OVER ;输出错误提示
MOV AH,9
INT 21H
JMP STA
CLO: MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START ;整个程序结束
8 楼
忘忧→志在必得 [专家分:120] 发布于 2007-06-26 21:01:00
我博客那个程序怎么会有问题呢?
[img]http://www.xztx.com/attachment/12_10773_0606afe561a7a3c.jpg[/img]
[img]http://www.xztx.com/attachment/12_10773_bea7f2c15d332aa.jpg[/img]
[img]http://www.xztx.com/attachment/12_10773_de5e7b205c720f6.jpg[/img]
[img]http://www.xztx.com/attachment/12_10773_e8b2590c3e956f9.jpg[/img]
DATAS SEGMENT
OUTERROR DB 0AH,0DH,'ERROR!$'
INPUT DB'PLEASE INPUT X(0..9):$'
TABLE DB 0H,1H,4H,9H,16H,25H,36H,49H,64H,81H
RESULT DB ?
BUF1 DB 0AH,0DH,'IT IS ='
BUF2 DB 4 DUP(?)
DATAS ENDS
STACKS SEGMENT
DB 200 DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,INPUT
MOV AH,9
INT 21H
MOV AH,1
INT 21H
CMP AL,'0'
JB ERROR
CMP AL,'9'
JA ERROR
AND AL,0FH
MOV BL,AL
MOV BH,0
MOV AL,TABLE[BX]
MOV RESULT,AL
LEA DI,BUF2
MOV CL,4
SHR AL,CL
OR AL,30H
MOV [DI],AL
INC DI
MOV AL,RESULT
AND AL,0FH
OR AL,30H
MOV [DI],AL
INC DI
MOV BYTE PTR[DI],'$'
MOV DX,OFFSET BUF1
MOV AH,9
INT 21H
JMP EXIT
ERROR:LEA DX,OUTERROR
MOV AH,9
INT 21H
EXIT:MOV AH,4CH
INT 21H
CODES ENDS
END START
9 楼
忘忧→志在必得 [专家分:120] 发布于 2007-06-26 21:53:00
不知道你说的有些地方要修改,指的哪里,但我还是完善了一下。
DATA SEGMENT
TABLE DB 0,1,4,9,16,25,36,49,64,81
ASK DB 0DH,0AH,'Please enter a nummble(0~9):',0DH,0AH,'$'
SEV DB 'Key (N/n) to close!$'
ANS DB 'THE RESULT IS:$'
OVER DB 0DH,0AH,'ERROR!',0DH,0AH,0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX ;将数据送入DS
STA: MOV DX,OFFSET SEV ;输出提示
MOV AH,9
INT 21H
MOV DX,OFFSET ASK
MOV AH,9
INT 21H
MOV AH,1 ;输入数字
INT 21H
CMP AL,'N' ;判断输入是否为“N/n”
JZ CLO ;为“N/n”则跳转至CLO
CMP AL,'n'
JZ CLO
CMP AL,'9' ;输入数字与9和0进行比较
JA OVE ;当数大于9或小于0则转移至OVE
CMP AL,'0'
JL OVE
SUB AL,30H ;将字符3转换成数字3
MOV BL,AL
LEA SI,TABLE ;将指针指向TABLE段
MOV AH,2
MOV DL,13
INT 21H ;输出回车符
MOV DL,10
INT 21H ;输出换行符
MOV AH,0 ;将AH清零
MOV AL,[SI+BX]
DIV DL ;将TABLE中的数据除以10
MOV CH,AH ;把余数送入CH中暂存
MOV CL,AL
CMP AL,0 ;将商与0相比较
JZ AGI2 ;商为零则跳转至AGI不输出商
LEA DX,ANS
MOV AH,9
INT 21H
MOV AL,CL
ADD AL,30H ;不为零则将数字转换成字符
MOV DL,AL
MOV AH,2
INT 21H ;输出商
JMP AGI
AGI2: LEA DX,ANS
MOV AH,9
INT 21H
10 楼
忘忧→志在必得 [专家分:120] 发布于 2007-06-26 21:54:00
AGI:
MOV AL,CH
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H ;输出余数
MOV DL,13
INT 21H ;输出回车符
MOV DL,10
INT 21H ;输出换行符
MOV DL,13
INT 21H ;输出回车符
MOV DL,10
INT 21H
JMP STA ;循环
OVE: MOV DX,OFFSET OVER ;输出错误提示
MOV AH,9
INT 21H
JMP STA
CLO: MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START ;整个程序结束
我来回复