编写求n阶乘 要求放在16位寄存器里 出来什么cpu无效指令

scmod 2011-01-12 11:16:50
dseg segment
str db'AX overflow',0dh,0ah,'$'
dseg ends
cseg segment
assume ds:dseg,cs:cseg
start:mov ax,1
int 21h
mov cx,ax
mula:mul cx
jc sh
loopne mula
mov dx,cx
mov ax,2
int 21h
mov ax,4ch
int 21h
sh:mov ax,dseg
mov ds,ax
lea dx,str
mov ah,09h
int 21h
mov ah,4ch
int 21h
cseg ends
end start

出来什么无效指令 cs: ip:什么的为什么啊..
...全文
176 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
shzhfu 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 scmod 的回复:]
cseg segment
assume cs:cseg
start:mov ah,1
int 21h
mov cx,al
mula:mul cx
loopne mula
mov dx,cx
mov ah,2
int 21h
mov ah,4ch
int 21h
cseg ends
end start
我现在把它改成这样......为什么连接过都不出来呢...想不通...……
[/Quote]
cseg segment
assume cs:cseg
start:mov ah,1
int 21h

;mov cx,al
mov cl,al

mov ah,2 ;这里显示一个回车换行
mov dl,0dh
int 21h
mov dl,0ah
int 21h

sub cl,30h ;把数字字符变成对应的数字
mov ch,0 ;高8位变0

mov ax,1 ;下面乘法的初值

mula:mul cx
;loopne mula
loop mula ;加ne没用

;mov dx,cx ;不能直接这样显示,另外这显示的是cx, 真正的结果在dx,ax
;mov ah,2
;int 21h

mov bx,10
mov cx,0
l1:
div bx ;除以10
push dx ;保存余数
inc cx ;计数器加1
mov dx,0 ;为下次除法准备
cmp ax,0 ;上次除法的商是否为0
jne l1 ;不为0再重复上述过程

;到此处, 已把结果从底为到高位分离入栈

mov ah,2
l2:
pop dx ;从高位出栈
add dl,30h ;变成数字字符
int 21h ;显示



mov ah,4ch
int 21h
cseg ends
end start



scmod 2011-01-12
  • 打赏
  • 举报
回复
endp proc uses 貌似都没教过..
不知道我们课程设计怎么想到这东西的..
不是类型不匹配....貌似
masmaster 2011-01-12
  • 打赏
  • 举报
回复


;入口参数AX
;返回:AX=N!
fact proc uses bx cx
mov cx,ax
mov ax,1
mov bx,1
s:
mul bx
inc bx
loop s
ret
fact endp
shzhfu 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 scmod 的回复:]
cseg segment
assume cs:cseg
start:mov ah,1
int 21h
mov cx,al
mula:mul cx
loopne mula
mov dx,cx
mov ah,2
int 21h
mov ah,4ch
int 21h
cseg ends
end start
我现在把它改成这样......为什么连接过都不出来呢...想不通...……
[/Quote]

mov cx,al

类型不匹配
scmod 2011-01-12
  • 打赏
  • 举报
回复
cseg segment
assume cs:cseg
start:mov ah,1
int 21h
mov cx,al
mula:mul cx
loopne mula
mov dx,cx
mov ah,2
int 21h
mov ah,4ch
int 21h
cseg ends
end start
我现在把它改成这样......为什么连接过都不出来呢...想不通...
scmod 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ydfivy 的回复:]
data segment
str db'AX overflow',0dh,0ah,'$'
data ends

stack segment
;input stack segment code here
stack ends

code segment
assume cs:code,ds:data,ss:stack
start:
int 21h
mov cx,ax……
[/Quote]
这个运行就出错....
scmod 2011-01-12
  • 打赏
  • 举报
回复
话说3楼的看不懂....
我想知道为什么不过输入什么数字输出怎么都是AX overflow..
书上貌似说如果是AX乘时候CF=1管的是DX
AL乘的话CF=1管的是AH
我这样貌似管的就是AH
但是我前面是拿CX跟AX乘的啊..
照理说应该是DX中有数字才会让CF=1才会出来这句AX overflow
奇怪啊啊啊啊
BAYNPU 2011-01-12
  • 打赏
  • 举报
回复
dseg segment
str db'AX overflow',0dh,0ah,'$'
dseg ends
cseg segment
assume ds:dseg,cs:cseg
start:mov ax,dseg
mov ds,ax
mov ah,1
int 21h
mov cx,ax
mula:mul cx
jc sh
loopne mula
mov dx,cx
mov ax,2
int 21h
mov ax,4ch
int 21h
sh:mov ax,dseg
mov ds,ax
lea dx,str
mov ah,09h
int 21h
mov ah,4ch
int 21h
cseg ends
end start
scmod 2011-01-12
  • 打赏
  • 举报
回复
ax是ah打错了但是貌似还有问题
masmaster 2011-01-12
  • 打赏
  • 举报
回复
mov ax,1 ;ah=0
int 21h
应该是:
mov ah,1 ;
int 21h
一个傻冒 2011-01-12
  • 打赏
  • 举报
回复
data segment
str db'AX overflow',0dh,0ah,'$'
data ends

stack segment
;input stack segment code here
stack ends

code segment
assume cs:code,ds:data,ss:stack
start:
int 21h
mov cx,ax
mula:mul cx
jc sh
loopne mula
mov dx,cx
mov ax,2
int 21h
mov ax,4ch
int 21h
sh:mov ax,data
mov ds,ax
lea dx,str
mov ah,09h
int 21h
mov ah,4ch
int 21h

code ends
end start

改成这样试试。
你没有把DS赋值。
scmod 2011-01-12
  • 打赏
  • 举报
回复
哦.....谢谢~
貌似懂多了...
'0'和0...
纠结了...
shzhfu 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 scmod 的回复:]
o.o
关键貌似就是数字要进行ascii转换啊....
比如我现在要进行数字比较要用cmp al,30h才是跟0比
字符的话就得是cmp al,'0'
前面mul cx已经把乘积放在拼成的32位单元(dx,ax)中了????
这句不懂..
16位数的话范围不是0-65535吗
比如我输入2阶乘结果是2,那应该是AH00000000 AL00000002
然后DX应该是没有用到的..……
[/Quote]

30h就是‘0’,cmp al,30h和cmp al,'0'都是和‘0’比,cmp al,0是和0比.

mul 字节单元(如cl),表示8位数和al中的数乘,结果不超过16位,就放在ax中;

mul 字单元(如cx),是16位数和ax中的数乘,结果不超过32位,就把低16位放在ax中,高16位放在dx中.

因为你用cx去乘的,所以能算稍大一点的n的阶乘。如果用CL乘,结果在AX中,那就只能算较小的n了。
scmod 2011-01-12
  • 打赏
  • 举报
回复
o.o
关键貌似就是数字要进行ascii转换啊....
比如我现在要进行数字比较要用cmp al,30h才是跟0比
字符的话就得是cmp al,'0'
前面mul cx已经把乘积放在拼成的32位单元(dx,ax)中了????
这句不懂..
16位数的话范围不是0-65535吗
比如我输入2阶乘结果是2,那应该是AH00000000 AL00000002
然后DX应该是没有用到的...
还有你那个貌似输入9结果会出错..
我觉得应该就是MUL DIV什么32位16位什么的有问题
简直晕了啊......
shzhfu 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 scmod 的回复:]
引用 14 楼 shzhfu 的回复:
乘法对CF没定义。一般应该不会产生CF,因为两个16位数相乘,结果不会超过32位,所以dx,ax足以存放结果.
我看到书上说mul对cf of有效
什么字节相乘时AH不为零则cf=of=1
字相乘时DX不为零则cf=of=1
和你给的那个div一样
不是div bx吗?
貌似这样的话余数放dx商放ax
如果div bl貌似余数放ah,商放al……
[/Quote]

我记得原来有“乘法对CF没定义”的说法,那也行我记错了。

因为前面mul cx已经把乘积放在拼成的32位单元(dx,ax)中了,所以除法也可按32位除以16位去做。用div bx和div bl,最后的余数只是1位数,但push只能对字操作。若用div bl也要把ax入栈,弹出到dx,再把原来在高位的余数(现在在dh中)送给dl.
shzhfu 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 scmod 的回复:]
强大...
但我还是好奇为什么mov dx,ax不行..
还要搞成这么长的一段..
老师其实硬件课只讲了汇编的大致的指令的用处,就莫名其妙让我们什么课程设计搞实践..
让人想不通啊....
[/Quote]
计算机输入和输出的都是字符(ASCII码值),比如,从键盘输入1,实际得到的是字符‘1’,它的ASCII码是31H。所以输入后要经过减30H才能变成真正的数字。

输出也是同样的。你得到了结果是3,就要变成字符‘3’(ASCII为33H)才能显示,如果直接输出3,得到的是ASCII为3的那个字符。

如果是多位数,则要分别处理。比如想输出数字12,就必须要把数字1和2分离出来,分别变成字符‘1’和‘2’后输出。

高级语言中,这些过程都由对应的编译工具完成了,但汇编语言要自己完成。
scmod 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 shzhfu 的回复:]
乘法对CF没定义。一般应该不会产生CF,因为两个16位数相乘,结果不会超过32位,所以dx,ax足以存放结果.[/Quote]
我看到书上说mul对cf of有效
什么字节相乘时AH不为零则cf=of=1
字相乘时DX不为零则cf=of=1
和你给的那个div一样
不是div bx吗?
貌似这样的话余数放dx商放ax
如果div bl貌似余数放ah,商放al
你那个用div bx是不是就是为了区分余数跟商故意假设是个32位数啊?这样就能push什么的..
话说栈貌似我也没学过..老师让我们自己理解....
scmod 2011-01-12
  • 打赏
  • 举报
回复
强大...
但我还是好奇为什么mov dx,ax不行..
还要搞成这么长的一段..
老师其实硬件课只讲了汇编的大致的指令的用处,就莫名其妙让我们什么课程设计搞实践..
让人想不通啊....
shzhfu 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shzhfu 的回复:]
引用 9 楼 scmod 的回复:
cseg segment
assume cs:cseg
start:mov ah,1
int 21h
mov cx,al
mula:mul cx
loopne mula
mov dx,cx
mov ah,2
int 21h
mov ah,4ch
int 21h
cseg ends
end start
我现在把它改成这样......为……
[/Quote]

上面那个回复有点错,改正如下:

cseg segment
assume cs:cseg
start:mov ah,1
int 21h

;mov cx,al
mov cl,al

mov ah,2 ;这里显示一个回车换行
mov dl,0dh
int 21h
mov dl,0ah
int 21h

sub cl,30h ;把数字字符变成对应的数字
mov ch,0 ;高8位变0

mov ax,1 ;下面乘法的初值

mula:
mul cx
;loopne mula
loop mula ;加ne没用

;mov dx,cx ;不能直接这样显示,另外这显示的是cx, 真正的结果在dx,ax
;mov ah,2
;int 21h

mov bx,10
mov cx,0
L1:
div bx ;除以10
push dx ;保存余数
inc cx ;计数器加1
mov dx,0 ;为下次除法准备
cmp ax,0 ;上次除法的商是否为0
jne L1 ;不为0再重复上述过程

;到此处, 已把结果从底为到高位分离入栈

mov ah,2
L2:
pop dx ;从高位出栈
add dl,30h ;变成数字字符
int 21h ;显示
loop L2


mov ah,4ch
int 21h
cseg ends
end start

加载更多回复(1)

21,458

社区成员

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

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