用汇编语言编写程序,请哪位高手看看我错在哪里,谢谢!

2024-11-01 08:54:07
推荐回答(1个)
回答1:

;刚刚写好,呵呵,本人测试通过了,希望对您有帮助,为了方便你看,我加了些注释,有问题可以问我...

ASSUME CS:CODE,DS:DATA

DATA SEGMENT
BUFF DB 10
DB ?
DB 10 DUP(?)
RESULT DW ?
RESULT_SHOW DB 10 DUP(?)
DATA ENDS

CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
LEA DX,BUFF
MOV AH,0AH
INT 21H

MOV DI,0
L0: ;统计一共有多少个数字组成
CMP BYTE PTR DS:[DI+2],0DH
JZ GO
INC DI
JMP L0

GO: ;计算第n个斐波那契数,把数字字符串转换为十进制数
MOV BL,10
MOV AX,1
MOV SI,DI ;为后面判断输入的是不是只输入一个数有用
MOV CX,DI
L2: PUSH AX
SUB BYTE PTR DS:[DI+1],30H
MUL BYTE PTR DS:[DI+1]
ADD RESULT,AX
POP AX
MUL BL
DEC DI
LOOP L2

;分两种情况:1.输入的是1;2.输入的不是1
CMP SI,1
JNZ L7
CMP BYTE PTR RESULT,1
JNZ L7
MOV AX,RESULT
JZ L4

L7: MOV AX,1
MOV BX,0
MOV CX,RESULT
DEC CX

L3: ;第n个斐波那契数存放到AX中
PUSH AX
ADD AX,BX
POP BX
LOOP L3

L4:
;显示这个斐波那契数
MOV DX,0
LEA SI,RESULT_SHOW
MOV DI,0 ;利用DI来累计一共有多少个数字
L5:
MOV CX,10
CALL DIVDW
ADD CL,30H
MOV DS:[SI],CL
CMP AX,0
JZ L6
INC SI
INC DI
JMP L5

L6:
MOV DL,DS:[SI]
MOV AH,2
INT 21H
CMP DI,0
JZ OK
DEC SI
DEC DI
JMP L6

OK:
MOV AX,4C00H
INT 21H

;参数: (AX)=DWORD型低16位数据
; (DX)=DWORD型高16位数据
; (CX)=除数
;返回: (DX)=结果的高16位,(AX)=结果的低16位
; (CX)=余数
;32位除16位,可以防止溢出!

DIVDW: ;子程序定义开始,功能是分离各个数字出来
PUSH AX
MOV AX,DX
MOV DX,0
DIV CX
MOV BX,AX
POP AX
DIV CX
MOV CX,DX
MOV DX,BX
RET ;子程序定义结束

CODE ENDS

END START