新手写了一个求最大公约数和最小公倍数的代码,出问题了,求帮助

[复制链接]
查看11 | 回复2 | 2021-1-27 06:05:17 | 显示全部楼层 |阅读模式
附代码
.386
.modelflat,stdcall
optioncasemap:none

includewindows.inc
includekernel32.inc
includemasm32.inc
includedebug.inc
includelibD:\RadASM\masm32\lib\kernel.lib
includelibD:\RadASM\masm32\lib\masm32.lib
includelibD:\RadASM\masm32\lib\debug.lib

.data
str1db0ah,0dh,'thefirstnumberx:',0ah,0dh,'$'
str2db0ah,0dh,'thesecondnumbery:',0ah,0dh,'$'
xdw?
ydw?
zdw?

.code
assumecs:code,ds:data
start:



inputproc
movbx,0;输入数字到bx
s1:
movah,1
int21h
cmpal,0dh;输入回车为结束
jzexit
andax,000fh
xchgax,bx
movcx,10
mulcx;之前输入的数字乘以10
addbx,ax;输入数字乘以10后再加上新输入数字,比如123,其过程为0*10+1->1*10+2->12*10+3
jmps1
exit:;输入回车后退出
movdl,0ah;换行
movah,2
int21h
ret
inputendp
outputproc;显示bx中的数字
movdl,0ah
movah,2
int21h
movax,bx
movbx,10
movcx,0
let1:;将要显示的数字除以10,然后将余数入栈
movdx,0
inccx
idivbx
pushdx
cmpax,0;余数为0时结束
jnzlet1
let2:
popax;将余数弹入ax
addax,3030h;余数调整为asc码
movdl,al;显示
movah,2
int21h
looplet2
ret
outputendp

commondivisorproc
movbx,1
ss1:
movdx,0
movax,x
divbx
cmpdx,0
jnzss2;如果bx不能被y整除,bx不是公约数跳到ss2
movz,bx;能同时被x和y整除的数放到z
ss2:
cmpbx,x
incbx
jnzss1
ret
commondivisorendp


commonmultipleproc
movax,x
muly
divz
movbx,ax
calloutput
ret
commonmultipleendp

out1:
movah,4ch
int21h
mainproc
callinput
movx,bx
callinput
movy,bx
callcommondivisor
movbx,z
calloutput
callcommonmultiple
jmpout1
mainendp
endstart
用的是RadASM集成环境编译之后出现问题如下
D:\RadASM\Masm\Projects\4.o\4.o.asm(26):errorA2006:undefinedsymbol:code
D:\RadASM\Masm\Projects\4.o\4.o.asm(26):errorA2006:undefinedsymbol:data
D:\RadASM\Masm\Projects\4.o\4.o.asm(41):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
D:\RadASM\Masm\Projects\4.o\4.o.asm(47):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
D:\RadASM\Masm\Projects\4.o\4.o.asm(68):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
D:\RadASM\Masm\Projects\4.o\4.o.asm(85):errorA2074:cannotaccesslabelthroughsegmentregisters
D:\RadASM\Masm\Projects\4.o\4.o.asm(88):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
D:\RadASM\Masm\Projects\4.o\4.o.asm(89):errorA2074:cannotaccesslabelthroughsegmentregisters
D:\RadASM\Masm\Projects\4.o\4.o.asm(91):errorA2074:cannotaccesslabelthroughsegmentregisters
D:\RadASM\Masm\Projects\4.o\4.o.asm(93):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
D:\RadASM\Masm\Projects\4.o\4.o.asm(101):errorA2074:cannotaccesslabelthroughsegmentregisters
D:\RadASM\Masm\Projects\4.o\4.o.asm(102):errorA2074:cannotaccesslabelthroughsegmentregisters
D:\RadASM\Masm\Projects\4.o\4.o.asm(103):errorA2074:cannotaccesslabelthroughsegmentregisters
D:\RadASM\Masm\Projects\4.o\4.o.asm(105):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
D:\RadASM\Masm\Projects\4.o\4.o.asm(117):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
D:\RadASM\Masm\Projects\4.o\4.o.asm(118):errorA2074:cannotaccesslabelthroughsegmentregisters
D:\RadASM\Masm\Projects\4.o\4.o.asm(119):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
D:\RadASM\Masm\Projects\4.o\4.o.asm(120):errorA2074:cannotaccesslabelthroughsegmentregisters
D:\RadASM\Masm\Projects\4.o\4.o.asm(121):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
D:\RadASM\Masm\Projects\4.o\4.o.asm(122):errorA2074:cannotaccesslabelthroughsegmentregisters
D:\RadASM\Masm\Projects\4.o\4.o.asm(123):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
D:\RadASM\Masm\Projects\4.o\4.o.asm(124):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
D:\RadASM\Masm\Projects\4.o\4.o.asm(125):errorA2107:cannothaveimplicitfarjumporcalltonearlabel
这个程序是自己按照网上给的程序修改的,麻烦有时间的帮忙看一下了的,谢谢哦
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
用masm试一试
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
到这个网站下载编译器:
http://www.fishc.com/a/downloads/huibian/872.html
.modelsmall
.stack
.data
str1db0ah,0dh,'thefirstnumberx:',0ah,0dh,'$'
str2db0ah,0dh,'thesecondnumbery:',0ah,0dh,'$'
xdw?
ydw?
zdw?
.code
.startup
inputproc
movbx,0;输入数字到bx
s1:
movah,1
int21h
cmpal,0dh;输入回车为结束
jzexit
andax,000fh
xchgax,bx
movcx,10
mulcx;之前输入的数字乘以10
addbx,ax;输入数字乘以10后再加上新输入数字,比如123,其过程为0*10+1->1*10+2->12*10+3
jmps1
exit:;输入回车后退出
movdl,0ah;换行
movah,2
int21h
ret
inputendp
outputproc;显示bx中的数字
movdl,0ah
movah,2
int21h
movax,bx
movbx,10
movcx,0
let1:;将要显示的数字除以10,然后将余数入栈
movdx,0
inccx
idivbx
pushdx
cmpax,0;余数为0时结束
jnzlet1
let2:
popax;将余数弹入ax
addax,3030h;余数调整为asc码
movdl,al;显示
movah,2
int21h
looplet2
ret
outputendp
commondivisorproc
movbx,1
ss1:
movdx,0
movax,x
divbx
cmpdx,0
jnzss2;如果bx不能被y整除,bx不是公约数跳到ss2
movz,bx;能同时被x和y整除的数放到z
ss2:
cmpbx,x
incbx
jnzss1
ret
commondivisorendp
commonmultipleproc
movax,x
muly
divz
movbx,ax
calloutput
ret
commonmultipleendp
out1:
movah,4ch
int21h
mainproc
callinput
movx,bx
callinput
movy,bx
callcommondivisor
movbx,z
calloutput
callcommonmultiple
jmpout1
mainendp
.exit0
end
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行