| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4695 人关注过本帖
标题:汇编语言排序还有RET返回问题
只看楼主 加入收藏
蓝然籽
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2015-4-10
结帖率:40%
收藏
已结贴  问题点数:10 回复次数:10 
汇编语言排序还有RET返回问题
ORG 0000h
LJMP MAIN
ORG 0003h
MAIN:
MOV 30H,#02h
MOV 31H,#08h
MOV 32H,#06H
N EQU 03h
MOV r0,#30H
sort:
MOV A,r0
MOV r1,A
MOV r5,#N
CLR F0
DEC r5
MOV A,@r1
LOOP:
MOV r3,A
INC r1
MOV A,r1
CLR C
MOV A,@r1
SUBB A,r3
JNC LOOP1
SETB F0
MOV A,r3
XCH A,@r1
DEC r1
XCH A,@r1
INC r1
LOOP1:
MOV A,@r1
DJNZ r5,LOOP
JB F0,sort
RET
END
假设按递增顺序先排30H,31H,32H中的三个数,排完之后不是应该结束程序吗?为什么又返回sort了?
而且还有一个疑问:遇见RET是是返回子函数呢?还是返回主函数?为什么每次遇见RET都先返回子函数的第一条指令,再执行就回主函数,就是出不了程序了?
搜索更多相关主题的帖子: 而且 
2015-05-06 09:24
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:3 
这是8031的汇编?目测代码有问题,指令未能连续,被变量定义中断了。

能编个毛线衣吗?
2015-05-06 12:48
取名字
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:236
专家分:924
注 册:2015-4-27
收藏
得分:7 
MOV A,@r1
SUBB A,r3
JNC LOOP1
SETB F0
MOV A,r3
XCH A,@r1
DEC r1
XCH A,@r1
INC r1
LOOP1:
MOV A,@r1
DJNZ r5,LOOP
JB F0,sort
RET
    假设按递增顺序先排30H,31H,32H中的三个数,排完之后不是应该结束程序吗?为什么又返回sort了?
    对于楼主的这个问题,原因是出在:当你比较31H和32H中的数值时,因为31H中的内容为08H,32H中的内容为06H,当执行“SUBB A,r3”时,A中的数值为06H,r3中的内容为08H,所以该条指令的执行导致CF位为1,“JNC loop1”不成立,程序跳至“SETB F0”将F0位置1,然后程序一直往下执行至“DJNZ r5,LOOP”时,因为此时r5的值为0,所以继续往下执行至“JB F0,sort”,因为之前已经置F0位为1,所以跳至“sort”处执行。
    而执行完“RET”之后,是跳至调用处的下一条指令执行的。所以位置在哪,要看是在哪里调用的。
    希望以上的分析能够帮到楼主。
2015-05-07 10:03
蓝然籽
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2015-4-10
收藏
得分:0 
回复 3楼 取名字
恩,我单步的时候也发现了,这是我在书上弄下来的一段程序。然后我就不用F0了。改了之后能排序,但是遇到RET就又回 LJMP MAIN这里了,那我下面的想把中值输出就没办法进行了。我改的程序:
ORG 0000h
LJMP MAIN
ORG 0003h
MAIN:
MOV 30H,#03h
MOV 31H,#08h
MOV 32H,#02H
MOV 33H,#09H
MOV 34H,#034H
MOV 35H,#023H
N EQU 06h
MOV r0,#30H
MOV r5,#(N-1)
MOV r6,#(N-1)
sort:
 MOV A,r0
 MOV r1,A
 MOV A,@r1

LOOP:
 MOV r3,A
 INC r1
 CLR C
 MOV A,@r1
 SUBB A,r3
 JNC LOOP1
 MOV A,r3
 XCH A,@r1
 DEC r1
 XCH A,@r1
 INC r1
LOOP1:
 MOV A,@r1
 DJNZ r5,LOOP
 MOV B,r6
 MOV r5,B
 DEC r5
 DJNZ r6,sort
RET
MOV r0,#32H
MOV A,@r0
END
请问怎样再改,才能再往下执行?真是汇编初学,什么都不会啊!谢谢~
2015-05-08 22:01
蓝然籽
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2015-4-10
收藏
得分:0 
回复 2楼 wmf2014
这个是不是8031我也不知道……反正就是刚学汇编,看着书上的一段程序就试了下,发现只弄来一小段程序看看还可以,一自己弄成整个的就都是问题,我改过的程序还有问题回复在了三楼里,麻烦版主帮我看一下,谢谢啊~
2015-05-08 22:04
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
印象中8031的寄存器是以r0到r3命名的。

能编个毛线衣吗?
2015-05-09 20:06
取名字
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:236
专家分:924
注 册:2015-4-27
收藏
得分:0 
这段程序如果不作为子程序的话,ret指令可以不要,作为子程序,ret指令可以放在输出中值之后。
2015-05-09 21:52
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用wmf2014在2015-5-9 20:06:18的发言:

印象中8031的寄存器是以r0到r3命名的。

应该是单片机的汇编程序。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-05-09 22:11
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 8楼 hu9jj
8031就是51系列的8位单片机。

[ 本帖最后由 wmf2014 于 2015-5-9 22:20 编辑 ]

能编个毛线衣吗?
2015-05-09 22:12
蓝然籽
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2015-4-10
收藏
得分:0 
回复 9楼 wmf2014
这个就是51单片机的,我想起来了……
2015-05-11 17:51
快速回复:汇编语言排序还有RET返回问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051744 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved