注册 登录
编程论坛 汇编论坛

汇编语言排序还有RET返回问题

蓝然籽 发布于 2015-05-06 09:24, 4695 次点击
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都先返回子函数的第一条指令,再执行就回主函数,就是出不了程序了?
10 回复
#2
wmf20142015-05-06 12:48
这是8031的汇编?目测代码有问题,指令未能连续,被变量定义中断了。
#3
取名字2015-05-07 10:03
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”之后,是跳至调用处的下一条指令执行的。所以位置在哪,要看是在哪里调用的。
    希望以上的分析能够帮到楼主。
#4
蓝然籽2015-05-08 22:01
回复 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
请问怎样再改,才能再往下执行?真是汇编初学,什么都不会啊!谢谢~
#5
蓝然籽2015-05-08 22:04
回复 2楼 wmf2014
这个是不是8031我也不知道……反正就是刚学汇编,看着书上的一段程序就试了下,发现只弄来一小段程序看看还可以,一自己弄成整个的就都是问题,我改过的程序还有问题回复在了三楼里,麻烦版主帮我看一下,谢谢啊~
#6
wmf20142015-05-09 20:06
印象中8031的寄存器是以r0到r3命名的。
#7
取名字2015-05-09 21:52
这段程序如果不作为子程序的话,ret指令可以不要,作为子程序,ret指令可以放在输出中值之后。
#8
hu9jj2015-05-09 22:11
以下是引用wmf2014在2015-5-9 20:06:18的发言:

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

应该是单片机的汇编程序。
#9
wmf20142015-05-09 22:12
回复 8楼 hu9jj
8031就是51系列的8位单片机。

[ 本帖最后由 wmf2014 于 2015-5-9 22:20 编辑 ]
#10
蓝然籽2015-05-11 17:51
回复 9楼 wmf2014
这个就是51单片机的,我想起来了……
#11
蓝然籽2015-05-11 17:57
回复 7楼 取名字
如果不做子程序的话,我去掉了ret,单步执行到MOV A,@r0,就开始提示错误了啊。如果做子程序的话,不管我把ret放哪里,最后还是会再返回到LJMP MAIN,最后还是到不了END啊……怎么就是退出不了程序了?
1