汇编语言排序和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都先返回子函数的第一条指令,再执行就回主函数,就是出不了程序了?

4个回答

不是加了个标号就是子程序了,必须是 PROC ... ENDP 才是子程序。
RET 必须对应 CALL。
你这段代码的结构莫名其妙,建议先看看《汇编语言》。

Tiger_Zhao
Tiger_Zhao 回复lanranziling: RET 必须对应 CALL!!!
5 年多之前 回复
lanranziling
lanranziling 这段程序也是我在书上看到的,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然后就改了一下,能实现排序,也能退出RET了,但是直接回到了LJMP MAIN,没办法执行下面的输出中值,求指点,谢谢啊……
5 年多之前 回复

ret是用预先存在栈里的数值经行跳转,只要子程序里是堆栈平衡的就跳的回去。(看你的程序都没有push和pop,应该没这个问题)
ret需要的栈里的跳转地址是由call的时候存进去的(当然,你自己手动入栈也行),所以必须call过去的才能ret回来。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问