高分,汇编问题...

来源:百度知道 编辑:UC知道 时间:2024/05/27 18:31:01
要求:1.告诉我的程序为什么错了
2.在我程序的基础上改对 (除非我这错的太离谱了..)

DATA SEGMENT ;这是一个算a的b次方的程序...
TA DB 'please input a $'
TB DB 0DH,0AH,'please input b $'
TC DB 0DH,0AH,'a^b=$'
DATA ENDS

STACK SEGMENT PARA STACK
DW 20H DUP(0)
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
REPEAT: CALL DECIBINA ;调用键入
CALL DECIBINB
CALL BINIHEX ;调用转换
MOV AH,4CH
INT 21H

MAIN ENDP

DECIBINA PROC NEAR
MOV AH,9
LEA DX,TA
INT 21H
MOV AH,1
INT 21H
SUB AL,30H
MOV AH,0
MOV CX,AX
RET
DECIBINA ENDP

DECIBINB PROC NEAR
MOV AH,9
LEA DX,TB

用手机看的,不太细,但我感觉没什么大错,除了一点后叙,你代码不够简洁,计算乘方逻辑嫌不太清晰

你把输入的返回值保存一下,否则可能在下一个调用时被改变,按理DOS功能调用应保存寄存器,不过我没看过源码,键盘显示和打印中断是保存了的

我把你的程式复制了过去,可以用的啊.

......玉米了,白痴了。。找到问题了...@~

AX每次都调用后...输入的值等若变了...

ax*ax->ax, .....无语了...

我再想下.2~#先谢谢大家

1.因为调用命令是
CALL BINIHEX
所以TO,T1两段程序后面的
MOV AH,4CH
INT 21H
应该改为RET,否则,如果程序从这里退出,可能因为堆栈泄露而发生问题。

2.MUL AX 好像比较冒险,乘法是通过把AX连续移位相加来实现的,现在被乘数也是AX,结果很难说,建议改为 MUL CX

3.
DEC CH
JNZ ROOT
DEC指令肯定不影响CF标志,可我记不清它是不是影响ZF标志了。这里你最好关注一下,如果不能生成ZF标志就要在两行中间插入比较指令 CMP CH,0

4.
ROL BX,CL 命令结束后CL中的数会不会变化?我没验证过,个人觉得把
MOV CL,4
放在循环内部比较好。

1.T0,T1的程序后面去掉MOV AH,4CH
INT 21H改成RET ,这是个子程序必须正常返回
2.LOP:入口出的指令改成MUL CX
3.把MOV CL,4放到ROOT后面
就这3个问题,改了一定没问题