萌新0.0急求大佬,汇编——编写程序完成运算X=A*B+C,并将运算结果以十进数显示在屏幕中间。

贺锦 2018-06-15 09:28:59
编写一个运算程序
编写程序完成运算X=A*B+C,并将运算结果以十进数显示在屏幕中间。
要求:A、A为从键盘输入的两位十进制数。
B、B、C为从键盘输入的三位十进制数。
C、A、B、C输入前均要加提示信息。
D、运算结果以“X= ”的形式显示在屏幕中间(考虑结果大于65536)。
希望有大神能帮忙看一下,怎么写,我自己写了一下,结果越写越乱了,脑子有点转不过来了,呜呜呜呜~
DATA SEGMENT
IN1 DB 'Please input A:$'
IN2 DB 'Please input B:$'
IN3 DB 'Please input C:$'
IN4 DB 'X=A*B+C=$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX

MOV AH,9
LEA DX,IN1
INT 21H
MOV CX,2
CALL INPUT
CALL CRLF
MOV BP,BX

MOV AH,9
LEA DX,IN2
INT 21H
MOV CX,3
CALL INPUT
CALL CRLF

MOV AX,BP
MUL BX
MOV SI,AX
MOV DI,DX

MOV AH,9
LEA DX,IN3
INT 21H
MOV CX,3
CALL INPUT
CALL CRLF

MOV AX,BX
CWD
ADD AX,SI
ADC DX,DI

MOV AH,9
LEA DX,IN4
INT 21H
CALL OUTPUT

MOV AX,4C00H
INT 21H

INPUT PROC NEAR
MOV BX,0
P1: MOV AH,1
INT 21H
SUB AL,30H
JL EXIT
SUB AL,9
JG EXIT
CBW
XCHG AX,BX
MOV DX,10
MUL DX
ADD BX,AX
LOOP P1
EXIT: RET
INPUT ENDP

OUTPUT PROC NEAR
MOV CX,10000
CALL DDIV
MOV CX,1000
CALL DDIV
MOV CX,100
CALL DDIV
MOV CX,10
CALL DDIV
MOV CX,1
CALL DDIV
RET
OUTPUT ENDP

DDIV PROC NEAR
MOV AX,SI
MOV DX,DI
DIV CX
MOV BX,DX
MOV DL,AL
ADD DL,30H
MOV AH,2
INT 21H
RET
DDIV ENDP

CRLF PROC NEAR
PUSH AX
PUSH DX
MOV AH,2
MOV DL,0DH
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
POP DX
POP AX
RET
CRLF ENDP

CODE ENDS
END START

这是我自己写的很多错误的代码,中间有几个问题解决不了
第一,在子函数INPUT里的BX,不知道为什么就是传不到主程序里去,调试的时候,在BX的值为0,搞不明白
第二,两位的十进制数乘以三位的十进制数,应该是要32位了吧,后面的显示,得不到我想要的结果,我知道是运算有问题,但是不知道怎么处理,连接不上来了
希望能有大佬,指导一下,急,谢谢谢谢谢谢谢!
...全文
1465 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_44098401 2020-06-14
  • 打赏
  • 举报
回复
sseg segment stack db 100 dup(?);写100个字节? dw 20 dup(?) sseg ends data SEGMENT bufA db 'Please input A:$';设置提示语句 bufB db 'Please input B:$' bufC db 'Please input C:$' result db 'RESULT:X=A*B+C=$' err db 'input error!$' vary db 0 tmp db 0 bitlen db 2,3 max db 6 eflag db 0 sum dw 5 dup (?);设置需要的一些变量 data ENDS CODE SEGMENT ASSUME CS:CODE,DS:data,SS:sseg START: mov ax,data mov ds,ax;data段地址给数据寄存器ds mov eflag,0 mov ah,6 mov al,0 mov bh,7 mov cx,0 mov dx,184fh int 10h;初始化屏幕 mov ah,2 mov bh,0 mov dx,0a14h int 10h;设置光标位置,0a行,14列。 mov ah,9 lea dx,bufA int 21h;输出提示A mov al,bitlen mov vary,al call DIB;调用子程 mov sum,bx mov ah,2 mov bh,0 mov dx,0b14h int 10h;设置光标位置,0b行,14列。 mov ah,9 lea dx,bufB int 21h;输出提示B mov al,bitlen+1 mov vary,al call DIB;调用子程 mov sum+2,bx mov ah,2 mov bh,0 mov dx,0c14h int 10h;设置光标位置,0c行,14列。 mov ah,9 lea dx,bufC int 21h;输出提示C mov al,bitlen+1 mov vary,al call DIB;调用子程DIB mov sum+4,bx mov ah,2 mov bh,0 mov dx,0d14h int 10h;设置光标位置0d行,14列。 mov ah,9 lea dx,result int 21h;输出结果 cmp eflag,0;比较eflag和0 jz next;等于零跳转到next mov ah,9 lea dx,err int 21h;输出输入错误提示 mov ah,1 int 21h jmp START;跳转到start next: CALL multiplication;调用乘法子程 call addition;调用加法子程 call BID;调用BID子程 call CRLF;调用回车换行子程 mov ah,1 int 21h jmp START DIB PROC NEAR push ax mov bx,0 mov tmp,0 reinput: mov al,vary cmp tmp,al;比较 jge exit;大于等于转移 add tmp,1 mov ah,1 int 21h cmp al,20h;比较 je SQ sub al,30h jl errdis;小于转移 cmp al,10 jg errdis;大于转移 cbw xchg ax,bx;交换数据 mov cx,10 mul cx add bx,ax jmp reinput SQ: CALL SysQuit errdis: inc eflag;eflag+1 exit: pop ax RET DIB ENDP BID PROC NEAR PUSH AX PUSH BX PUSH CX mov bx,sum+8 cmp sum+6,1 jl noca add bx,5536 noca: CALL DIVFUN POP CX POP BX POP AX RET BID ENDP DIVFUN PROC NEAR PUSH CX cmp sum+6,1 jl nocarr MOV CX,10000 MOV AX,BX MOV DX,0 DIV CX MOV BX,DX MOV DL,AL add dl,max add dl,30h mov ah,2 int 21h jmp carrystep nocarr: MOV CX,10000 CALL DDIV carrystep: MOV CX,1000 CALL DDIV MOV CX,100 CALL DDIV MOV CX,10 CALL DDIV MOV CX,1 CALL DDIV POP CX RET DIVFUN ENDP DDIV PROC NEAR PUSH DX MOV AX,BX MOV DX,0 DIV CX MOV BX,DX MOV DL,AL ADD DL,30H MOV AH,2 INT 21H POP DX RET DDIV ENDP multiplication PROC NEAR push ax push cx push dx mov ax,sum mov bx,sum+2 mul bx mov sum+6,dx mov sum+8,ax pop dx pop cx pop ax RET multiplication ENDP addition proc near; push ax push cx push dx mov dx,0 mov ax,sum+8 add ax,sum+4 adc dx,sum+6 mov sum+8,ax mov sum+6,dx pop dx pop cx pop ax ret addition endp CRLF PROC NEAR ;回车换行 MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H RET CRLF ENDP SysQuit PROC NEAR;退出 MOV AX,4C00H INT 21H SysQuit ENDP CODE ENDS END START 给我点个赞把
hbbh1234 2020-06-08
  • 打赏
  • 举报
回复
请问可以看一下完整的代码吗
weixin_44098401 2020-06-08
  • 打赏
  • 举报
回复
每年六月就会有一群做课设的同学来要代码
qq_41552869 2019-06-12
  • 打赏
  • 举报
回复
你好学长可以给我看一下修改后的完整代码吗?我还有点疑惑
贺锦 2018-06-17
  • 打赏
  • 举报
回复
感谢感谢
贺锦 2018-06-17
  • 打赏
  • 举报
回复

谢谢大佬的细心指导!!!!!!
关于我之前提出的问题,作以下解释:
第一,BX的值,我后来发现我有一个指令写错了,不是SUB AL,9,而是CMP AL,9,所以这就不是判断不完整了,而是有疏漏导致写错了,有点粗心大意了,不好意思。
第二,+C的时候疏忽了,的确是没有加到SI,DI上,太急躁了,有遗漏,谢谢指导,受益匪浅。
第三,OUTPUT也是一开始没看明白,余数和商的变化,再次感谢指导,我已经完成我想要的功能。
第四,我一开始不会写,结果显示放在屏幕中央,后来查阅资料,用到了INT 10H功能,通过设置光标位置,完成了这个功能。
第五,考虑到会有大于65535的数,而16位的寄存器AX明显不够,需要(AX,DX),一开始不明白余数和商的时候,一直写不出来,后来明白后,知道了关键所在,是 MOV SI,DX和MOV DI,0,恩,瞬间超级开心,终于完成了。
再次感谢指导,谢谢谢谢啦
zara 2018-06-16
  • 打赏
  • 举报
回复
debug调试啊,在相关子程前后断点,看看结果,想想为啥有异。
不是bx传不过来,而是bx计算错误,input里 sub 9进行判断后没有恢复原来值,所以计算错误,而且判断也不完整,小于 0的没考虑;+C计算时加到 dx:ax上了而非 si:di上;output子程里,div了之后没有把结果返在 si:di里,导致 si:di一直不变进而出错。
贺锦 2018-06-15
  • 打赏
  • 举报
回复



这是我运行的界面,主要就是上述两个问题,BX传不到主程序和显示结果不正确
还有就是要怎么在屏幕中间显示结果?还不太清楚

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧